본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

기억 말고 되감기

~11 min · 되감기, 복구, 상태-기계, 멱등성

Level 0찬 쇠
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

기억 말고 되감기

Anvil의 기록 줄기는 덧붙이기만 하고, 빠짐이 없고, 그것만으로 자족하도록 저장돼. 모든 상태 전이, 결과물 판본, 심사, 동점 처리, 이견, 공개는 보여주기 전에 영속화돼. 회차와 자리와 제출 화면은 그 기록의 투영이지, 무너진 뒤에 운영자가 이력을 손봐도 된다는 허가가 아니야.

복구는 영속 상태와 저장소 참조를 읽는 데서 시작해. 실패 전에 보관된 제출은 계속 제출된 상태고, 저장된 표는 계속 유효하고, 확정되지 않은 단계 넘김은 적용되지 않은 채로 남아. 과정이 다시 시작했다는 이유만으로 이미 끝난 모델 작업이나 하네스 작업을 다시 돌리지 않아.

봉인된 레일에서는 원본과 걷어낸 결과물 사본이 기록 줄기와 함께 살고, cwkPippa 대화 번호는 뒤를 가리키는 참조일 뿐이야. Anvil 회차를 다시 세우는 일이 다른 제품의 대화 저장소를 다시 읽는 데 기대지 않아. Open Run의 저장소 나무와 보고서도 함께 남고, yard는 귀중한 과정의 흔적이지만 다시 세우기 위한 의존 대상은 아니야.

영속 사실과 화면에 남은 값이 다르면 기록 줄기가 이겨. 복구는 대체, 기권, 이어서 한 동작을 새 사실로 덧붙이지 앞선 사건을 고쳐 쓰지 않아.

영속 사실에서 다시 세우고 운영자의 기억으로 이력을 재현하지 마. 다시 시작한 뒤에도 저장소와 기록 줄기가 겨루기를 정의해.

Code

복구 규칙 — 끝난 일은 다시 하지 않는다·python
def rebuild(trail):
    """화면을 손보지 않는다. 사건만 순서대로 접어서 상태를 만든다."""
    state = {"submissions": {}, "ballots": [], "phase": 0}
    for ev in trail:
        kind = ev["event"]
        if kind == "submission_archived":
            state["submissions"][ev["seat"]] = ev["sha"]
        elif kind == "ballot_stored":
            state["ballots"].append(ev["pick"])
        elif kind == "phase_committed":       # 확정된 것만 반영
            state["phase"] = ev["phase"]
    return state


trail = [
    {"event": "submission_archived", "seat": "A", "sha": "aa11"},
    {"event": "ballot_stored", "pick": "A"},
    {"event": "phase_advance_attempted", "phase": 2},   # 확정 안 됨
]

before = rebuild(trail)
after = rebuild(trail)          # 몇 번을 되감아도 같은 상태 — 멱등하다
assert before == after
assert before["phase"] == 0     # 확정되지 않은 넘김은 적용되지 않는다
print(before)

External links

Exercise

제출 하나가 보관된 뒤 다음 단계가 열리기 전에 서비스가 죽었어. 영속 사실, 반복하면 안 되는 동작, 다음에 올 수 있는 적법한 사건을 나열해.
Hint
심사 전에 보관한다는 규칙 덕분에 첫 제출은 이미 확정된 사실이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.