Persistência
- Normativa
- Rascunho 1.0
- Atualizado em
- Ver como Markdown
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,runningecancellingque 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).