Persistência

11.1 Armazenamento

Um serviço DEVERIA manter seu estado em um banco de dados SQLite embutido. Um conjunto sugerido de tabelas:

Tabela Conteúdo
service_config Identidade e configuração do serviço.
clients Clientes pareados, hashes de tokens e escopos.
models Metadados de modelos e digests de conteúdo.
responses Respostas armazenadas.
tasks Tarefas assíncronas.
task_events O log de eventos de cada tarefa, com números de sequência.
idempotency_keys Chaves de idempotência, digests de requisições e resultados.

Os arquivos de modelo DEVEM ficar fora do banco de dados. O banco guarda apenas metadados e digests de conteúdo.

Os nomes e a organização das tabelas são uma escolha de implementação. O que os clientes podem observar, e o que precisa ser interoperável, é o comportamento descrito nas próximas duas seções.

11.2 Regras

Seja qual for o armazenamento que um serviço use, ele:

  • DEVE persistir uma tarefa antes de retornar 202 Accepted.
  • DEVE atualizar os números de sequência dos eventos e o status da tarefa na mesma transação.
  • DEVE tornar atômica a transição de cancelamento, para evitar a condição de corrida de uma tarefa que é cancelada e depois concluída.
  • DEVERIA manter as tarefas e os eventos concluídos por um período de retenção configurável.
  • NÃO DEVE excluir tarefas inacabadas durante a limpeza de logs.
  • DEVE, na inicialização, varrer as tarefas queued, loading, running e cancelling que restaram e aplicar a política de reinicialização de cada uma (seção 7.5).

11.3 Recuperação na inicialização

A tabela mostra o estado para o qual uma tarefa remanescente é movida, de acordo com a sua política on_restart:

Estado encontrado na inicialização fail retry resume
queued failed queued queued
loading failed queued queued
running failed queued running, continuando a partir do snapshot
cancelling cancelled cancelled cancelled

Uma tarefa movida para failed recebe o código de erro server_restarted e um evento response.failed. Uma tarefa movida para cancelled recebe um evento response.cancelled. O novo estado e o seu evento são gravados em uma única transação (seção 11.2).