45장. 장애 훈련 — WebSocket에는 완료, DB에는 배정 중이다
client가 optimistic event를 원장으로 믿거나 서로 다른 event 순서를 적용하면 화면이 앞서갈 수 있다. 모든 event에 aggregate version과 cursor를 넣고 client는 gap을 발견하면 REST snapshot을 다시 읽는다. 서버는 transaction commit 전 완료 event를 publish하지 않는다. outbox event가 DB 상태에서 생성되게 한다.
실습은 ASSIGNED와 EN_ROUTE event 순서를 바꾸고 하나를 중복·누락한다. client는 version이 낮은 event를 무시하고 gap에서 snapshot을 요청해야 한다. 다른 pod reconnect 뒤에도 최종 상태가 DB와 같아야 한다. 운영자는 socket log만으로 DB를 수정하지 않고 Dispatch와 StatusEvent, outbox를 대사한다.
사용자 화면에는 “실시간 연결 끊김”과 마지막 동기화 시각, 새로고침 행동을 보여 준다. silent stale 화면을 정상처럼 보이지 않는다. 사후에는 event order contract와 reconnect test를 release gate에 추가한다.