Pesquisas de memcache inconsistentes de diferentes módulos do Google AppEngine do mesmo aplicativo

3

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.

    
por user2326971 21.02.2017 / 00:42

0 respostas