0

我们有一个繁忙的网站,它需要记录有关某些页面或访问的 API 端点的“点击”,以帮助填充统计信息、流行度网格等。记录的点击不是简单的页面点击,所以不能使用日志解析。

过去,我们只是使用更新查询直接登录到数据库,但在高并发情况下,这会产生我们不希望的数据库负载。

我们目前正在使用 Memcache,但由于非原子更新而遇到一些统计数据不太准确的问题。

所以我的问题:

我们是否应该继续使用 Memcache 但改进原子增量:

1)当页面被点击时,创建一个内存缓存键,例如“stats:pageid:3”,并在每次我们原子地点击时递增

2) 编写一个批处理脚本来循环遍历所有的内存缓存键,并每 10 分钟创建一次对数据库的批处理更新

优点:数据库点击次数较少,因为我们每 10 分钟每页只更新一次(但在那 10 分钟内有很多点击)

缺点:我们可以原子地增加各个计数器,但仍然需要一个 memcache 键来存储哪些 pageid 有命中、循环和记录。这不会是原子的,所以当我们将数据刷新到数据库并重置所有内容时,事情可能会在这个键中徘徊。我们可能会丢失长达 10 分钟的数据。

或使用队列/任务系统:

1)当页面被点击时,将作业添加到任务队列 2)然后可以限制任务队列的速率,并在后台处理这些“命中”到数据库。

优点:易于编码,如果需要,我们可以扩大队列工作人员。

缺点:我们仍然在每次点击时访问数据库一次,因为每个任务都将单独处理,而不是“汇总”所有点击。

或者有什么其他建议?

4

1 回答 1

1

或者:使用专为在高流量级别记录统计数据而设计的东西,例如StatsDGraphite。最初的 StatsD 是在 NodeJS 之上用 Javascript 编写的,设置起来可能有点复杂(但有更简单的方法来安装它,使用 Docker 容器),或者您可以使用类似工作(不使用 NodeJS),它执行相同的功能,例如用 GoLang 编写的功能

我已经使用了原始的 StatsD 和 Graphite 对,效果很好,而且它还制作了漂亮的图表(这是针对每天数百万个事件的)。

于 2013-10-10T12:09:12.030 回答