Consistência de dados em consultas do Datastore

Níveis de consistência de dados

As consultas do Datastore podem gerar resultados em dois níveis de consistência:

  • Consultas com consistência forte garantem os resultados mais recentes, mas podem levar mais tempo para serem concluídas.
  • Consultas com consistência eventual costumam ser mais rápidas, mas podem retornar resultados desatualizados.

Em uma consulta com consistência eventual, os índices usados para coletar os resultados também são acessados com esse tipo de consistência. Consequentemente, essas consultas podem, algumas vezes, retornar entidades que não correspondem mais aos critérios de consulta originais, e as consultas fortemente consistentes são sempre consistentes de maneira transacional.

Consistência de dados da consulta do Datastore

As consultas retornam resultados com diferentes níveis de garantia de consistência, dependendo da natureza da consulta:

  • As consultas de ancestral ficam dentro de um grupo de entidades e têm consistência forte por padrão, mas é possível atribuir uma consistência eventual a elas. Para isso, basta definir a política de leitura do Cloud Datastore conforme descrito abaixo.
  • As consultas de não ancestral sempre têm consistência eventual.

A busca de uma entidade por chave, também chamada de "pesquisa por chave", tem consistência forte.

Como configurar a política de leitura do Datastore

Para melhorar o desempenho, defina a política de leitura do Datastore para que todas as leituras e consultas tenham consistência posterior. A API também permite definir explicitamente uma política de consistência forte, mas essa configuração não terá efeito prático, porque as consultas de não ancestral sempre têm consistência eventual, independentemente da política.

Também é possível definir o prazo de chamada do Datastore, que é o tempo máximo, em segundos, que o aplicativo aguardará o Datastore retornar um resultado antes de ser cancelado com um erro. O prazo padrão é de 60 segundos. No momento, não é possível aumentá-lo, apenas diminuí-lo para garantir que uma determinada operação falhe rapidamente, por exemplo, para retornar uma resposta mais rápida ao usuário.

Para definir a política de leitura do Datastore e a duração máxima da chamada no Python, transmita-as como argumentos para os métodos run(), get(), fetch() e count() da classe Query ou GqlQuery. Exemplo:

for result in Employee.all().run(limit=5,
                                 read_policy=db.EVENTUAL_CONSISTENCY,
                                 deadline=5):
  # Body of iterative loop

Próximas etapas