我们有一个繁忙的网站,它需要记录有关某些页面或访问的 API 端点的“点击”,以帮助填充统计信息、流行度网格等。记录的点击不是简单的页面点击,所以不能使用日志解析。
过去,我们只是使用更新查询直接登录到数据库,但在高并发情况下,这会产生我们不希望的数据库负载。
我们目前正在使用 Memcache,但由于非原子更新而遇到一些统计数据不太准确的问题。
所以我的问题:
我们是否应该继续使用 Memcache 但改进原子增量:
1)当页面被点击时,创建一个内存缓存键,例如“stats:pageid:3”,并在每次我们原子地点击时递增
2) 编写一个批处理脚本来循环遍历所有的内存缓存键,并每 10 分钟创建一次对数据库的批处理更新
优点:数据库点击次数较少,因为我们每 10 分钟每页只更新一次(但在那 10 分钟内有很多点击)
缺点:我们可以原子地增加各个计数器,但仍然需要一个 memcache 键来存储哪些 pageid 有命中、循环和记录。这不会是原子的,所以当我们将数据刷新到数据库并重置所有内容时,事情可能会在这个键中徘徊。我们可能会丢失长达 10 分钟的数据。
或使用队列/任务系统:
1)当页面被点击时,将作业添加到任务队列 2)然后可以限制任务队列的速率,并在后台处理这些“命中”到数据库。
优点:易于编码,如果需要,我们可以扩大队列工作人员。
缺点:我们仍然在每次点击时访问数据库一次,因为每个任务都将单独处理,而不是“汇总”所有点击。
或者有什么其他建议?