目前我有大约3000万个实体的集合,我想准确计算它们。我知道每次写入一个新实体时我需要一个+ 1的分片计数器(当前写入速率约为每秒1.5)。困难的一点是如何在不阻止新写入的情况下统计现有实体?
我可以高兴地写一个地图减少工作来进行计数,但我想确保:
我对一小部分错误感到满意,但希望尽可能减少错误。
如果它有帮助,那么每个属性都有一个写日期,但是我想扩展计数以涵盖其他没有此日期字段的实体。
有什么想法吗?谢谢!
答案 0 :(得分:2)
只需以某种方式标记“新”实体:timestamp,boolean field等。然后将它们从用于计算“现有”实体的查询中排除。
答案 1 :(得分:1)
只是为了好玩:创建一个计数实体。每N秒通过拉取队列更新一次(N> 1)。当新记录进入时,将计数任务发送到拉取队列。当前计数是实体值加上任务队列“stats.totalTasks”。使用memcache变量来处理拉队列处理租用任务时的简要“工作进度计数”,以便更新实体计数(不确定它们是否可能被重复计算)。这当然是太多的开销,但是想把它扔出去强调任务队列方法。 (我做这样的事情来保持某些使用统计数据 - 但这些不需要实时。)hth -stevep相关文档链接如下,另外还有一个关于拉队列的精彩Google视频(链接s / b easy)找到): https://developers.google.com/appengine/docs/python/taskqueue/rest
答案 2 :(得分:0)
如果它们尚不存在,您是否可以简单地通过所有实体将任务添加到第二个表中。这可以在切换时间X之前多次运行。
如果当前时间在X之前,并且如果时间是>,则修改实体的插入以将其键添加到此表中。 X然后递增你的计数器。
一旦切换发生,并且计数器正在通过新插入递增,您就知道X之前的所有实体都在密钥表中,其余的都是计数器。只需简单地通过密钥表递增计数器并移除密钥。