Chuyển đến nội dung chính
Quay lại danh sách bài viết

Temporal: ทำ Workflow ให้กลับมาทำต่อหลัง Worker ล้ม

ออกแบบ workflow หลายขั้นตอนด้วย Temporal โดยแยก activity ที่เรียกบริการภายนอกและทดสอบการหยุด worker ก่อนงานเสร็จ

Temporal: ทำ Workflow ให้กลับมาทำต่อหลัง Worker ล้ม

งานอย่างรับคำสั่งซื้อ ตัดสต็อก ส่งอีเมล และรอชำระเงินกินเวลานานกว่าคำขอ HTTP เดียว หาก worker หยุดระหว่างทาง การใช้ตัวแปรในหน่วยความจำอย่างเดียวทำให้ไม่รู้ว่าขั้นใดสำเร็จแล้ว Temporal ใช้ Workflow Execution และ Event History เพื่อสร้างสถานะกลับมาและเดินงานต่อได้ โดยยังต้องออกแบบผลข้างเคียงของแต่ละขั้นอย่างระมัดระวัง

แยก Workflow กับ Activity

Workflow คือโค้ดควบคุมลำดับและเงื่อนไข ส่วน Activity ทำงานที่มี I/O เช่น เรียก API, เขียนฐานข้อมูล หรือส่งอีเมล ประวัติเหตุการณ์ของ Workflow เป็นแหล่งข้อมูลให้ worker replay เพื่อสร้างสถานะเมื่อเริ่มใหม่ จึงไม่ควรใส่การเรียกเครือข่ายหรือค่าที่สุ่มโดยตรงใน Workflow โดยไม่ใช้กลไกที่ Temporal รองรับ เพราะ replay ต้องให้ผลตัดสินใจสอดคล้องกับครั้งเดิม

ตัวอย่างการสั่งซื้ออาจมี Activity ตรวจสต็อก, ตัดเงิน และแจ้งผล Workflow กำหนดว่าจะทำขั้นใดก่อนและเกิดอะไรเมื่อขั้นหนึ่งล้ม ก่อนเริ่มเขียนโค้ด ระบุว่าแต่ละ Activity ทำซ้ำได้หรือไม่ และต้องใช้ idempotency key ใด เช่น order ID สำหรับระบบชำระเงิน

ทดลองความล้มเหลวจริง

เริ่มจากสภาพแวดล้อม development ตาม quickstart ของภาษาที่ทีมใช้ สร้าง workflow ที่มี Activity รอหรือเรียกบริการจำลอง แล้วหยุด worker ระหว่าง Activity ก่อนเปิดใหม่ ตรวจผ่าน Temporal UI หรือ CLI ว่า execution เดิมกลับมาดำเนินต่อและ Event History บอกเหตุที่เกิดขึ้นตรงกับที่คาด อย่าดูเพียงว่า function สุดท้ายตอบสำเร็จ เพราะอาจมีการตัดเงินหรือส่งอีเมลซ้ำ

ต่อด้วยการจำลองปลายทางตอบ timeout หลังทำงานสำเร็จ แต่ก่อนส่งคำตอบกลับ Activity อาจถูก retry การออกแบบ idempotency และการตรวจสถานะปลายทางสำคัญกว่าการตั้งจำนวน retry สูง ๆ งานที่ย้อนกลับไม่ได้ต้องมีขั้นชดเชยหรือขั้นให้มนุษย์ตรวจ แทนการหวัง rollback ธุรกรรมข้ามระบบ

สิ่งที่ต้องดูใน production

ติดตาม Workflow ที่ค้างนาน, Activity ที่ retry บ่อย, task queue backlog และการเปลี่ยนเวอร์ชันของโค้ดที่อาจกระทบ execution เก่า กำหนด timeout ตามงานจริง ไม่ให้คำสั่งซื้อหนึ่งรายการค้างไร้เจ้าของ และเตรียมวิธีจัดการเมื่อเงื่อนไขธุรกิจเปลี่ยนระหว่าง workflow ที่ยังทำงาน

Temporal ช่วยเก็บความคืบหน้าและจัดการการเรียกงาน แต่ไม่ได้ทำให้ API ภายนอกกลายเป็น exactly-once โดยอัตโนมัติ เริ่มจากงานหนึ่งเส้นทางและทดสอบจุดล้มที่สำคัญก่อนย้ายงานทั้งหมดเข้า workflow

อ่านเพิ่มเติม: Temporal Workflows, แนวคิด Task และ Activity

Chia sẻ bài viết:
Xem thêm bài viết