来自同一应用程序的不同Google AppEngine模块的不一致的内存caching查找

在单个AppEngine应用程序(Python)中,当从不同模块(又称为“服务”)进行memcache查找时,我们遇到了零星的不一致。 情景是这样的:

  • 模块“门户”创build并稍后递增某个memcache键的整数值:

    @ndb.tasklet def increment_total_async(meter): total = yield memcache.Client().incr_async( key="some-key", namespace=TOTALS_NAMESPACE, delta=meter.quantity) if total is not None: raise ndb.Return(total) raise ndb.Return(None) 
  • 模块“仪表板”稍后使用相同的键和名称空间查找当前值:

     @ndb.transactional_tasklet def get_total_async(subscription, metric): total = memcache.get( key="some-key", namespace=TOTALS_NAMESPACE) if total is not None: raise ndb.Return(total) raise ndb.Return(None) 

有趣的是,当从“dashboard”模块中调用get_total_async时,get_total_async有时(很less)返回一个整数值0(而不是None),而当从“portal”模块调用get_total_async时,它返回(正确)值> 0。

这有些令人惊讶,并且使我们相信memcache服务中可能存在竞争条件 – 可能只有当从不同的模块(现在称为“服务”,由Google)查找相同的密钥时。

有没有人遇到类似的现象? 这是一个“Heisenbug”,即难以复制。