Encontramos uma inconsistência esporádica ao fazer pesquisas de memcache de módulos diferentes (também conhecidos como "serviços") em um único aplicativo AppEngine (Python). O cenário é assim:
O módulo "portal" cria e depois incrementa valores inteiros para uma determinada chave 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)
O módulo "painel" depois procura o valor atual usando a mesma chave e espaço de nomes:
@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)
Curiosamente, get_total_async algumas vezes (raramente) retorna um valor inteiro de 0 (não None) quando chamado do módulo "dashboard", enquanto quando chamado do módulo "portal" retorna o valor (correto) > 0. / p>
Isso é um pouco surpreendente e nos faz acreditar que pode haver uma condição de corrida no serviço memcache - possivelmente apenas quando alguém procura a mesma chave em módulos diferentes (agora chamados de "serviços" pelo Google).
Alguém se deparou com um fenômeno semelhante? Este é um "Heisenbug", ou seja, difícil de reproduzir.
Tags google-app-engine