GGlyphWorks
ผลงานทั้งหมด เชื่อมต่อ API

ซิงก์ออเดอร์จากร้านค้าออนไลน์เข้าระบบบัญชี แบบไม่สร้างเอกสารซ้ำ

Order sync into an accounting system, without duplicate documents

โมดูลรับ webhook ออเดอร์ แล้วสร้างเอกสารในระบบบัญชีผ่าน REST API โดยกันการสร้างซ้ำ, retry เมื่อปลายทางล่ม และเก็บงานที่ล้มเหลวไว้ให้ replay ได้

จัดการกับกรณีที่ระบบจริงพังจริง — webhook ส่งซ้ำ, ปลายทางล่มกลางคัน, เลขเอกสารชนกัน
4xxไม่ retry เด็ดขาด
5xx · 429 · 408retry แบบมีขอบเขต + full jitter
สรุปเส้นทางข้อมูลและกฎการ retry ของโมดูล
สรุปเส้นทางข้อมูลและกฎการ retry ของโมดูล

รายละเอียด

คีย์กันซ้ำมาจากตัวตนทางธุรกิจ ไม่ใช่ซองจดหมาย

ร้านค้าออนไลน์ส่ง webhook ซ้ำเป็นเรื่องปกติ ถ้าแฮชจาก body ดิบ ฟิลด์อย่างรหัสการส่งและเวลาส่งจะเปลี่ยนทุกครั้ง ทำให้ได้คีย์ใหม่และเก็บเงินลูกค้าซ้ำ โมดูลนี้จึงตัดฟิลด์ที่เปลี่ยนตามการส่งออกก่อนสร้างคีย์

จองคีย์ก่อนยิง POST

ช่วงอันตรายคือระหว่าง ‘ส่งคำขอแล้ว’ กับ ‘บันทึกคำตอบแล้ว’ การจองคีย์ก่อนยิงทำให้ retry ใช้เลขเอกสารเดิม ไม่เผาเลขที่สอง เลขเอกสารถูกจ่ายแบบไม่มีช่องว่างและไม่ชนกันด้วย SQLite BEGIN IMMEDIATE

Retry-After ของปลายทางชนะ backoff ของเรา

แต่ถูก clamp ไว้ ไม่ให้ header ที่ผิดปกติจอด worker ทิ้งไว้เป็นชั่วโมง ส่วน backoff ปกติใช้ full jitter เพื่อไม่ให้เครื่องทั้งฟลีตฟื้นจากเหตุขัดข้องพร้อมกันแล้วชนกันซ้ำ

ทุกความล้มเหลวมีที่ลง

dead-letter แบบ JSONL เก็บเหตุผล, HTTP status, จำนวนครั้งที่ลอง, คีย์กันซ้ำ และ payload เดิม การ replay จึงเป็นคำสั่งบรรทัดเดียว และ replay ซ้ำก็ไม่สร้างเอกสารซ้ำ

ขอบเขตของตัวอย่างชิ้นนี้

ตัวอย่างนี้เป็นกลางกับผู้ให้บริการ ไม่ได้เรียก ไม่ได้ฝัง และไม่ได้อ้างว่าเป็น API ของระบบบัญชีหรือร้านค้าออนไลน์เจ้าใด ปลายทางในตัวอย่างเป็น mock server ที่เขียนด้วย Python standard library และรวมอยู่ในโปรเจกต์

ดูงานชิ้นอื่น