我们有一个繁忙的网站,需要记录关于访问的某些网页或API端点的“点击”,以帮助填充统计信息,热门网格等。点击记录不是简单的页面点击,所以可以'使用日志解析。
过去,我们只是使用更新查询直接登录到数据库,但是在大量并发的情况下,这会产生我们不想要的数据库负载。
我们目前正在使用Memcache,但由于非原子更新,我们遇到一些统计数据不准确的问题。
所以我的问题:
我们是否应继续使用Memcache但提高原子增量:
1)当页面被点击时,创建一个memcache键,例如“stats:pageid:3”,并在每次我们原子点击时递增
2)编写批处理脚本以遍历所有memcache密钥,并每10分钟创建一次批量更新数据库
PROS:减少数据库命中率,因为我们每10分钟每页更新一次(但在10分钟内有多次点击)
缺点:我们可以原子地增加单个计数器,但是仍然需要一个memcache密钥来存储哪些pageid有命中,循环并记录。这不是原子的,所以当我们将数据刷新到DB并重置所有内容时,事情可能会留在这个键中。我们可能会丢失长达10分钟的数据。
或使用队列/任务系统:
1)点击页面时,将作业添加到任务队列 2)然后可以对任务队列进行速率限制,并在后台处理这些“命中”到数据库。
PROS:易于编码,我们可以根据需要扩展队列工作人员。
缺点:由于每个任务都会被单独处理,我们仍然每次点击数据库一次,而不是“总结”所有命中。
或其他任何建议?
答案 0 :(得分:1)
或:使用专为在高流量级别录制统计信息而设计的内容,例如StatsD& Graphite。原始的StatsD是用NodeJS编写的Javascript编写的,设置起来有点复杂(但有更简单的方法来安装它,with a Docker container),或者你可以使用类似工作(不使用NodeJS) ,它具有相同的功能,例如一个written in GoLang。
我已经使用了原始的StatsD和Graphite对,效果很好,而且它制作了漂亮的图形(这是每天数百万个事件中的10个)。