พบตอนทำ devfactory-core#7
(end-to-end simulation + replay) — audit trail ที่ถูกตัดท้ายตรวจไม่ได้ ยกเว้น job ที่จบด้วย
COMPLETED และปิดช่องนี้จากฝั่ง consumer ไม่ได้ เพราะต้องแก้ที่ event/v1
กลไกที่ทำให้ตรวจไม่ได้
การ replay ตรวจความครบของ trail ด้วยการให้ record ถัดไปยืนยัน record ก่อนหน้า —
STATE_TRANSITION ใบถัดไปบอกว่าออกจาก state ไหน ถ้าไม่ต่อกันแปลว่ามีใบหาย
แต่ ไม่มีอะไรยืนยันใบสุดท้าย · JOB_COMPLETED ช่วยได้เฉพาะ job ที่จบสวย ผลคือ:
| job จบแบบ |
ถ้า event ท้ายสุดหายไป |
COMPLETED |
✅ จับได้ (JOB_COMPLETED เรียกหา transition ก่อนหน้า) |
FAILED · CANCELLED · TIMED_OUT |
❌ replay ผ่านเรียบร้อย โดยได้ state ก่อนหน้าใบที่หาย |
| ยังเดินอยู่ (ไม่ terminal) |
❌ เหมือนกัน |
แปลว่า trail ที่ถูกตัดท้ายอ่านได้เหมือน trail ที่สมบูรณ์ — ซึ่งเป็น failure mode ที่แย่ที่สุด
สำหรับ audit log: มันไม่ได้พังให้เห็น มันตอบผิดอย่างมั่นใจ
ทำไมฝั่ง consumer ปิดเองไม่ได้
ต้องมี per-job sequence number ติดมากับ event เพื่อให้เห็นว่า "ใบสุดท้ายที่ควรมีคือใบที่เท่าไหร่"
ซึ่งเป็น wire shape ของ event/v1 — ตาม RFC-0005 Rule 1 เป็นของท่าน ไม่ใช่ของเรา
เราไม่อยากยัด field เองแบบที่ทำกับ supersedes_decision_id ใน
#22 เพราะอันนั้นเป็น metadata
ของ record เดียว แต่อันนี้เป็น ความหมายของลำดับทั้ง trail ถ้าต่างคนต่างนิยาม replay ข้าม
consumer จะเชื่อกันไม่ได้เลย
ข้อเสนอ
เพิ่ม field ที่ producer ต้องเติมให้ต่อเนื่องต่อหนึ่ง subject:
sequence:
type: integer
minimum: 1
description: >-
ลำดับของ event ภายใน subject เดียวกัน เริ่มที่ 1 และห้ามข้าม
ผู้อ่าน trail ใช้ตรวจว่า "มีใบหายท้ายสุดไหม" ซึ่งเป็นสิ่งเดียวที่
การไล่ from→to ตรวจไม่ได้
ประเด็นที่ต้องเคาะฝั่งท่าน: นับต่อ subject หรือต่อ tenant · producer หลายตัวต่อ subject
เดียวกันจะชนกันไหม (ของเราตอนนี้มีตัวเดียว) · เป็น required หรือ optional ในเวอร์ชันนี้
ฝั่งเราทำอะไรไปแล้ว
- เพิ่ม
IncompleteSettlement ปิดเท่าที่ปิดได้โดยไม่แตะสัญญา
- เขียนข้อจำกัดไว้ใน docstring และ README ของ
packages/observability
- มีเทสชื่อ
test_a_trail_cut_short_at_a_terminal_other_than_completed_still_replays
ที่ยืนยันว่าตรวจไม่ได้ — บันทึกช่องว่างไว้เป็นโค้ด จะได้ไม่หายไปกับความจำใคร
(PR#19 merged)
พอ event/v1 มี sequence เมื่อไหร่ เราจะเปลี่ยนเทสตัวนั้นจาก "ยืนยันว่าตรวจไม่ได้"
เป็น "ยืนยันว่าตรวจได้" ครับ
พบตอนทำ devfactory-core#7
(end-to-end simulation + replay) — audit trail ที่ถูกตัดท้ายตรวจไม่ได้ ยกเว้น job ที่จบด้วย
COMPLETEDและปิดช่องนี้จากฝั่ง consumer ไม่ได้ เพราะต้องแก้ที่event/v1กลไกที่ทำให้ตรวจไม่ได้
การ replay ตรวจความครบของ trail ด้วยการให้ record ถัดไปยืนยัน record ก่อนหน้า —
STATE_TRANSITIONใบถัดไปบอกว่าออกจาก state ไหน ถ้าไม่ต่อกันแปลว่ามีใบหายแต่ ไม่มีอะไรยืนยันใบสุดท้าย ·
JOB_COMPLETEDช่วยได้เฉพาะ job ที่จบสวย ผลคือ:COMPLETEDJOB_COMPLETEDเรียกหา transition ก่อนหน้า)FAILED·CANCELLED·TIMED_OUTแปลว่า trail ที่ถูกตัดท้ายอ่านได้เหมือน trail ที่สมบูรณ์ — ซึ่งเป็น failure mode ที่แย่ที่สุด
สำหรับ audit log: มันไม่ได้พังให้เห็น มันตอบผิดอย่างมั่นใจ
ทำไมฝั่ง consumer ปิดเองไม่ได้
ต้องมี per-job sequence number ติดมากับ event เพื่อให้เห็นว่า "ใบสุดท้ายที่ควรมีคือใบที่เท่าไหร่"
ซึ่งเป็น wire shape ของ
event/v1— ตาม RFC-0005 Rule 1 เป็นของท่าน ไม่ใช่ของเราเราไม่อยากยัด field เองแบบที่ทำกับ
supersedes_decision_idใน#22 เพราะอันนั้นเป็น metadata
ของ record เดียว แต่อันนี้เป็น ความหมายของลำดับทั้ง trail ถ้าต่างคนต่างนิยาม replay ข้าม
consumer จะเชื่อกันไม่ได้เลย
ข้อเสนอ
เพิ่ม field ที่ producer ต้องเติมให้ต่อเนื่องต่อหนึ่ง subject:
ประเด็นที่ต้องเคาะฝั่งท่าน: นับต่อ
subjectหรือต่อtenant· producer หลายตัวต่อ subjectเดียวกันจะชนกันไหม (ของเราตอนนี้มีตัวเดียว) · เป็น required หรือ optional ในเวอร์ชันนี้
ฝั่งเราทำอะไรไปแล้ว
IncompleteSettlementปิดเท่าที่ปิดได้โดยไม่แตะสัญญาpackages/observabilitytest_a_trail_cut_short_at_a_terminal_other_than_completed_still_replaysที่ยืนยันว่าตรวจไม่ได้ — บันทึกช่องว่างไว้เป็นโค้ด จะได้ไม่หายไปกับความจำใคร
(PR#19 merged)
พอ
event/v1มีsequenceเมื่อไหร่ เราจะเปลี่ยนเทสตัวนั้นจาก "ยืนยันว่าตรวจไม่ได้"เป็น "ยืนยันว่าตรวจได้" ครับ