Мы столкнулись со спорадической несогласованностью при поиске в кэше памяти из разных модулей (также известных как «службы») в одном приложении AppEngine (Python). Сценарий такой:
Модуль «портал» создает и впоследствии увеличивает целочисленные значения для определенного ключа кэша памяти:
@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)
Интересно, что get_total_async иногда (редко) возвращает целочисленное значение 0 (не None) при вызове из модуля «приборной панели», тогда как при вызове из модуля «портала» оно возвращает (правильное) значение> 0.
Это несколько удивительно и заставляет нас поверить в то, что в службе кэша памяти может быть состояние гонки - возможно, только тогда, когда кто-то ищет один и тот же ключ в разных модулях (теперь Google называет их «сервисами»).
Кто-нибудь сталкивался с подобным явлением? Это «гейзенбаг», то есть его трудно воспроизвести.