영속화
- 규범적
- 초안 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절).