Distributed Transactions—Just Say No (Distributed Transaction — แค่ปฏิเสธ)
ด้วย เหตุผลทั้งหมดที่สรุปมาจนถึงตอนนี้ ผมขอแนะนำอย่างยิ่งให้คุณหลีกเลี่ยงการใช้ distributed transaction อย่าง two-phase commit เพื่อประสาน state ข้าม microservice ของคุณ แล้วคุณจะทำอะไรได้อีก?
ตัวเลือกแรกอาจเป็นแค่ไม่แยกข้อมูลออกจากกันตั้งแต่แรก ถ้าคุณมีชิ้นส่วนของ state ที่คุณต้องการจัดการแบบ atomic และ consistent จริง ๆ และคุณคิดไม่ออกว่าจะได้คุณสมบัติเหล่านี้มาอย่างสมเหตุสมผลโดยไม่มี ACID-style transaction ก็เก็บ state นั้นไว้ใน database เดียว และเก็บ functionality ที่จัดการ state นั้นไว้ใน service เดียว (หรือใน monolith ของคุณ) ถ้าคุณกำลังอยู่ในขั้นตอนหาว่าจะแยก monolith ตรงไหน และการแยกส่วนไหนง่าย (หรือยาก) คุณก็อาจตัดสินใจได้ว่าการแยกข้อมูลที่ตอนนี้ถูกจัดการใน transaction ออกจากกันนั้นยากเกินไปที่จะจัดการตอนนี้ ทำงานที่ส่วนอื่นของระบบไปก่อน แล้วค่อยกลับมาทำเรื่องนี้ทีหลัง
แต่จะเกิดอะไรขึ้นถ้าคุณจำเป็นต้องแยกข้อมูลนี้จริง ๆ แต่ไม่อยากเจอความเจ็บปวดทั้งหมดของการจัดการ distributed transaction? คุณจะทำ operation ในหลาย service ได้อย่างไรโดยหลีกเลี่ยงการ lock? จะเกิดอะไรขึ้นถ้า operation นั้นใช้เวลาเป็นนาที เป็นวัน หรืออาจถึงเป็นเดือน? ในกรณีแบบนี้ คุณอาจพิจารณาแนวทางอื่น นั่นคือ saga
Database Distributed Transactions (Database Distributed Transaction)
ผมกำลังโต้แย้งการใช้ distributed transaction ทั่วไปเพื่อประสาน state change ข้าม microservice ในสถานการณ์แบบนี้ microservice แต่ละตัวจัดการ durable state ของตัวเอง (เช่น ใน database ของมัน) distributed transactional algorithm ถูกใช้อย่างประสบความสำเร็จกับ database ขนาดใหญ่บางตัว Google's Spanner เป็นระบบหนึ่งแบบนั้น ในสถานการณ์นี้ distributed transaction ถูก apply แบบโปร่งใสจากมุมมองของ application โดย underlying database และ distributed transaction แค่ถูกใช้เพื่อประสาน state change ภายใน database เชิงตรรกะเดียว (แม้ว่ามันอาจกระจายอยู่ในหลายเครื่อง และอาจข้ามหลาย data center)
สิ่งที่ Google ทำสำเร็จกับ Spanner นั้นน่าประทับใจ แต่ก็ควรสังเกตว่าสิ่งที่ต้องทำเพื่อให้มันทำงานได้ให้แนวคิดกับคุณว่าความท้าทายนั้นเป็นแบบไหน บอกได้เลยว่ามันเกี่ยวข้องกับ data center ราคาแพงมากและนาฬิกาอะตอมบนดาวเทียม (จริง ๆ นะ) สำหรับภาพรวมที่ดีของวิธีที่ Spanner ทำงานได้ ผมแนะนำ presentation "Google Cloud Spanner: Global Consistency at Scale" 3