Постоянное хранение
- Нормативная
- Черновик 1.0
- Обновлено
- Открыть как Markdown
11.1 Хранилище
Сервису СЛЕДУЕТ хранить своё состояние во встроенной базе данных SQLite. Предлагаемый набор таблиц:
| Таблица | Содержимое |
|---|---|
service_config |
Идентичность и конфигурация сервиса. |
clients |
Сопряжённые клиенты, хеши токенов и области доступа. |
models |
Метаданные моделей и дайджесты содержимого. |
responses |
Сохранённые ответы. |
tasks |
Асинхронные задачи. |
task_events |
Журнал событий каждой задачи с порядковыми номерами. |
idempotency_keys |
Ключи идемпотентности, дайджесты запросов и результаты. |
Файлы моделей ДОЛЖНЫ оставаться вне базы данных. База хранит только метаданные и дайджесты содержимого.
Имена таблиц и их структура — решение реализации. То, что клиенты могут наблюдать и что должно быть совместимо, — это поведение, описанное в двух следующих разделах.
11.2 Правила
Какое бы хранилище ни использовал сервис, действуют такие правила:
- Сервис ДОЛЖЕН сохранять задачу до того, как вернёт
202 Accepted. - Сервис ДОЛЖЕН обновлять порядковые номера событий и статус задачи в одной транзакции.
- Сервис ДОЛЖЕН делать переход отмены атомарным, чтобы избежать гонки, при которой задача сначала отменяется, а потом завершается.
- Сервису СЛЕДУЕТ хранить завершённые задачи и события в течение настраиваемого срока хранения.
- Сервис НЕ ДОЛЖЕН удалять незавершённые задачи при очистке журналов.
- Сервис ДОЛЖЕН при запуске просматривать оставшиеся задачи
queued,loading,runningиcancellingи применять к каждой её политику перезапуска (раздел 7.5).
11.3 Восстановление при запуске
В таблице показано состояние, в которое переводится оставшаяся задача в соответствии с её политикой on_restart:
| Состояние при запуске | fail |
retry |
resume |
|---|---|---|---|
queued |
failed |
queued |
queued |
loading |
failed |
queued |
queued |
running |
failed |
queued |
running, продолжение со снимка состояния |
cancelling |
cancelled |
cancelled |
cancelled |
Задача, переведённая в failed, получает код ошибки server_restarted и событие response.failed. Задача, переведённая в cancelled, получает событие response.cancelled. Новое состояние и его событие записываются в одной транзакции (раздел 11.2).