Consistência de dados em consultas do Datastore

Níveis de consistência dos dados

As consultas da Datastore podem fornecer os respetivos resultados em qualquer um dos dois níveis de consistência:

  • As consultas Fortemente consistentes garantem os resultados mais recentes, mas podem demorar mais tempo a serem concluídas.
  • As consultas eventualmente consistentes são geralmente executadas mais rapidamente, mas podem, ocasionalmente, devolver resultados desatualizados.

Numa consulta eventualmente consistente, os índices usados para recolher os resultados também são acedidos com consistência eventual. Consequentemente, essas consultas podem, por vezes, devolver entidades que já não correspondem aos critérios de consulta originais, enquanto as consultas fortemente consistentes são sempre consistentes do ponto de vista transacional.

Consistência de dados de consulta do armazenamento de dados

As consultas devolvem os respetivos resultados com diferentes níveis de garantia de consistência, consoante a natureza da consulta:

  • As consultas de antepassados (as que estão num grupo de entidades) são fortemente consistentes por predefinição, mas podem ser tornadas eventualmente consistentes definindo a política de leitura do Datastore (veja abaixo).
  • As consultas não descendentes são sempre eventualmente consistentes.

A obtenção de uma entidade por chave, também denominada "pesquisa por chave", é fortemente consistente.

Definir a política de leitura do Datastore

Para melhorar o desempenho, pode definir a política de leitura do Datastore para que todas as leituras e consultas sejam eventualmente consistentes. (A API também permite definir explicitamente uma política de consistência forte, mas esta definição não tem efeito prático, uma vez que as consultas não descendentes são sempre eventualmente consistentes, independentemente da política.)

Também pode definir o prazo de chamada do Datastore, que é o tempo máximo, em segundos, que a aplicação aguarda que o Datastore devolva um resultado antes de terminar com um erro. O prazo predefinido é de 60 segundos. Atualmente, não é possível defini-lo como superior, mas pode ajustá-lo para baixo para garantir que uma determinada operação falha rapidamente (por exemplo, para devolver uma resposta mais rápida ao utilizador).

Para definir a política de leitura do Datastore em Java, cria uma configuração do serviço Datastore (DatastoreServiceConfig) através da classe auxiliar aninhada DatastoreServiceConfig.Builder e transmite-lhe uma instância da classe ReadPolicy. O exemplo seguinte mostra como definir a política de leitura, o prazo de chamada ou ambos:

double deadline = 5.0;

// Construct a read policy for eventual consistency
ReadPolicy policy = new ReadPolicy(ReadPolicy.Consistency.EVENTUAL);

// Set the read policy
DatastoreServiceConfig eventuallyConsistentConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy);

// Set the call deadline
DatastoreServiceConfig deadlineConfig = DatastoreServiceConfig.Builder.withDeadline(deadline);

// Set both the read policy and the call deadline
DatastoreServiceConfig datastoreConfig =
    DatastoreServiceConfig.Builder.withReadPolicy(policy).deadline(deadline);

// Get Datastore service with the given configuration
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(datastoreConfig);

O que se segue?