这个问题涉及两个计数器的实现,这些计数器的目的是在没有分片的情况下进行扩展(在某些情况下可能会计算得不足):
- http://appengine-cookbook.appspot.com/recipe/high-concurrency-counters-without-sharding/(评论中的代码)
- http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding
我的问题:
- 关于#1:
memcache.decr()在延迟的交易任务中运行似乎有点矫枉过正.如果memcache.decr()在事务之外完成,我认为最坏的情况是事务失败,我们错过了计算我们减少的任何数量. 我是否忽略了这样做可能会发生的其他问题?
- 这两种实现之间有何重大的权衡取舍?
以下是我看到的权衡:
2不需要数据存储区事务.
- 要获得计数器的值,#2需要数据存储区提取,而#1 通常只需要执行a
memcache.get()和memcache.add().
- 递增计数器时,都会调用
memcache.incr().#2会定期向任务队列添加任务,而#1以事务方式执行数据存储区get和put.#1也总是执行memcache.add()(以测试是否是将计数器持久保存到数据存储区的时间).
结论
(没有实际运行任何性能测试):
1检索计数器通常应该更快(#1 memcache vs#2数据存储).虽然#1必须执行额外的操作memcache.add().
- 但是,更新计数器时#2应该更快(#1数据存储区get + put vs#2排队任务).
- 另一方面,对于#1,您必须对更新间隔更加小心,因为任务队列配额几乎比数据存储区或memcahce API小100倍.