ไทย

การสำรวจเชิงลึกเกี่ยวกับธุรกรรมแบบกระจายและโปรโตคอล Two-Phase Commit (2PC) เรียนรู้สถาปัตยกรรม ข้อดี ข้อเสีย และการประยุกต์ใช้ในระบบทั่วโลก

ธุรกรรมแบบกระจาย: เจาะลึก Two-Phase Commit (2PC)

ในโลกที่เชื่อมต่อถึงกันมากขึ้นในปัจจุบัน แอปพลิเคชันมักจะต้องโต้ตอบกับข้อมูลที่จัดเก็บไว้ในระบบอิสระหลายระบบ สิ่งนี้ทำให้เกิดแนวคิดของธุรกรรมแบบกระจาย ซึ่งการดำเนินการเชิงตรรกะเดียวต้องมีการเปลี่ยนแปลงในฐานข้อมูลหรือบริการหลายรายการ การสร้างความสอดคล้องกันของข้อมูลในสถานการณ์เช่นนี้เป็นสิ่งสำคัญยิ่ง และหนึ่งในโปรโตคอลที่รู้จักกันดีที่สุดสำหรับการบรรลุเป้าหมายนี้คือTwo-Phase Commit (2PC)

ธุรกรรมแบบกระจายคืออะไร

ธุรกรรมแบบกระจายเป็นชุดของการดำเนินการที่ดำเนินการบนหลายระบบที่กระจายทางภูมิศาสตร์ ถือเป็นหน่วยอะตอมเดียว ซึ่งหมายความว่าการดำเนินการทั้งหมดภายในธุรกรรมจะต้องสำเร็จ (commit) หรือไม่มีเลย (rollback) หลักการ "ทั้งหมดหรือไม่มีเลย" นี้ทำให้มั่นใจได้ถึงความสมบูรณ์ของข้อมูลในระบบแบบกระจายทั้งหมด

พิจารณาสถานการณ์ที่ลูกค้าในโตเกียวจองเที่ยวบินจากโตเกียวไปลอนดอนในระบบสายการบินหนึ่ง และในเวลาเดียวกันก็จองห้องพักในลอนดอนในระบบการจองโรงแรมที่แตกต่างกัน การดำเนินการสองครั้งนี้ (การจองเที่ยวบินและการจองโรงแรม) ควรได้รับการปฏิบัติในอุดมคติในฐานะธุรกรรมเดียว ถ้าการจองเที่ยวบินสำเร็จ แต่การจองโรงแรมล้มเหลว ระบบควรยกเลิกการจองเที่ยวบินในอุดมคติเพื่อหลีกเลี่ยงไม่ให้ลูกค้าติดอยู่ในลอนดอนโดยไม่มีที่พัก พฤติกรรมที่ประสานงานนี้เป็นสาระสำคัญของธุรกรรมแบบกระจาย

ขอแนะนำโปรโตคอล Two-Phase Commit (2PC)

โปรโตคอล Two-Phase Commit (2PC) เป็นอัลกอริทึมแบบกระจายที่ช่วยให้มั่นใจได้ถึงความเป็นอะตอมในผู้จัดการทรัพยากรหลายราย (เช่น ฐานข้อมูล) มันเกี่ยวข้องกับตัวประสานงานส่วนกลางและผู้เข้าร่วมหลายราย โดยแต่ละรายรับผิดชอบในการจัดการทรัพยากรเฉพาะ โปรโตคอลทำงานในสองขั้นตอนที่แตกต่างกัน:

ขั้นตอนที่ 1: เตรียมพร้อม

ในขั้นตอนนี้ ตัวประสานงานจะเริ่มธุรกรรมและขอให้ผู้เข้าร่วมแต่ละรายเตรียมพร้อมสำหรับการ commit หรือ rollback ธุรกรรม ขั้นตอนต่างๆ มีดังนี้:

  1. ตัวประสานงานส่งคำขอเตรียมพร้อม: ตัวประสานงานส่งข้อความ "เตรียมพร้อม" ไปยังผู้เข้าร่วมทั้งหมด ข้อความนี้ส่งสัญญาณว่าตัวประสานงานพร้อมที่จะ commit ธุรกรรมและขอให้ผู้เข้าร่วมแต่ละรายเตรียมพร้อมที่จะทำเช่นนั้น
  2. ผู้เข้าร่วมเตรียมพร้อมและตอบสนอง: ผู้เข้าร่วมแต่ละรายได้รับคำขอเตรียมพร้อมและดำเนินการดังต่อไปนี้:
    • ดำเนินการตามขั้นตอนที่จำเป็นเพื่อให้แน่ใจว่าสามารถ commit หรือ rollback ธุรกรรมได้ (เช่น การเขียนบันทึก redo/undo)
    • ส่ง "การโหวต" กลับไปยังตัวประสานงาน โดยระบุว่า "เตรียมพร้อมที่จะ commit" (การโหวต "ใช่") หรือ "ไม่สามารถ commit ได้" (การโหวต "ไม่") การโหวต "ไม่" อาจเป็นเพราะข้อจำกัดด้านทรัพยากร ความล้มเหลวในการตรวจสอบความถูกต้องของข้อมูล หรือข้อผิดพลาดอื่นๆ

สิ่งสำคัญสำหรับผู้เข้าร่วมคือต้องรับประกันว่าพวกเขาสามารถ commit หรือ rollback การเปลี่ยนแปลงได้เมื่อพวกเขาโหวต "ใช่" โดยปกติแล้ว สิ่งนี้เกี่ยวข้องกับการรักษาการเปลี่ยนแปลงในพื้นที่เก็บข้อมูลที่เสถียร (เช่น ดิสก์)

ขั้นตอนที่ 2: Commit หรือ Rollback

ขั้นตอนนี้เริ่มต้นโดยตัวประสานงานตามคะแนนเสียงที่ได้รับจากผู้เข้าร่วมในขั้นตอนการเตรียมพร้อม มีสองผลลัพธ์ที่เป็นไปได้:

ผลลัพธ์ที่ 1: Commit

หากตัวประสานงานได้รับคะแนนเสียง "ใช่" จากผู้เข้าร่วมทั้งหมด จะดำเนินการ commit ธุรกรรม

  1. ตัวประสานงานส่งคำขอ Commit: ตัวประสานงานส่งข้อความ "commit" ไปยังผู้เข้าร่วมทั้งหมด
  2. ผู้เข้าร่วม Commit: ผู้เข้าร่วมแต่ละรายได้รับคำขอ commit และนำการเปลี่ยนแปลงที่เกี่ยวข้องกับธุรกรรมไปใช้กับทรัพยากรอย่างถาวร
  3. ผู้เข้าร่วมรับทราบ: ผู้เข้าร่วมแต่ละรายส่งข้อความรับทราบกลับไปยังตัวประสานงานเพื่อยืนยันว่าการดำเนินการ commit สำเร็จ
  4. ตัวประสานงานดำเนินการเสร็จสิ้น: เมื่อได้รับคำรับทราบจากผู้เข้าร่วมทั้งหมด ตัวประสานงานจะทำเครื่องหมายว่าธุรกรรมเสร็จสมบูรณ์

ผลลัพธ์ที่ 2: Rollback

หากตัวประสานงานได้รับคะแนนเสียง "ไม่" เพียงครั้งเดียวจากผู้เข้าร่วมรายใดรายหนึ่ง หรือหากหมดเวลาในการรอการตอบสนองจากผู้เข้าร่วม จะตัดสินใจ rollback ธุรกรรม

  1. ตัวประสานงานส่งคำขอ Rollback: ตัวประสานงานส่งข้อความ "rollback" ไปยังผู้เข้าร่วมทั้งหมด
  2. ผู้เข้าร่วม Rollback: ผู้เข้าร่วมแต่ละรายได้รับคำขอ rollback และยกเลิกการเปลี่ยนแปลงใดๆ ที่ทำขึ้นเพื่อเตรียมพร้อมสำหรับธุรกรรม
  3. ผู้เข้าร่วมรับทราบ: ผู้เข้าร่วมแต่ละรายส่งข้อความรับทราบกลับไปยังตัวประสานงานเพื่อยืนยันว่าการดำเนินการ rollback สำเร็จ
  4. ตัวประสานงานดำเนินการเสร็จสิ้น: เมื่อได้รับคำรับทราบจากผู้เข้าร่วมทั้งหมด ตัวประสานงานจะทำเครื่องหมายว่าธุรกรรมเสร็จสมบูรณ์

ตัวอย่างประกอบ: การประมวลผลคำสั่งซื้ออีคอมเมิร์ซ

พิจารณาระบบอีคอมเมิร์ซที่คำสั่งซื้อเกี่ยวข้องกับการอัปเดตฐานข้อมูลสินค้าคงคลังและการประมวลผลการชำระเงินผ่านเกตเวย์การชำระเงินแยกต่างหาก นี่คือสองระบบแยกกันที่ต้องมีส่วนร่วมในธุรกรรมแบบกระจาย

  1. ขั้นตอนเตรียมพร้อม:
    • ระบบอีคอมเมิร์ซ (ตัวประสานงาน) ส่งคำขอเตรียมพร้อมไปยังฐานข้อมูลสินค้าคงคลังและเกตเวย์การชำระเงิน
    • ฐานข้อมูลสินค้าคงคลังตรวจสอบว่าสินค้าที่ร้องขอมีในสต็อกหรือไม่และจองไว้ จากนั้นจะโหวต "ใช่" หากสำเร็จ หรือ "ไม่" หากสินค้าหมดสต็อก
    • เกตเวย์การชำระเงินอนุมัติการชำระเงินล่วงหน้า จากนั้นจะโหวต "ใช่" หากสำเร็จ หรือ "ไม่" หากการอนุมัติล้มเหลว (เช่น มีเงินไม่เพียงพอ)
  2. ขั้นตอน Commit/Rollback:
    • สถานการณ์ Commit: หากทั้งฐานข้อมูลสินค้าคงคลังและเกตเวย์การชำระเงินโหวต "ใช่" ตัวประสานงานจะส่งคำขอ commit ไปยังทั้งสองอย่าง ฐานข้อมูลสินค้าคงคลังจะลดจำนวนสินค้าคงคลังอย่างถาวร และเกตเวย์การชำระเงินจะจับการชำระเงิน
    • สถานการณ์ Rollback: หากฐานข้อมูลสินค้าคงคลังหรือเกตเวย์การชำระเงินโหวต "ไม่" ตัวประสานงานจะส่งคำขอ rollback ไปยังทั้งสองอย่าง ฐานข้อมูลสินค้าคงคลังจะปล่อยสินค้าที่จองไว้ และเกตเวย์การชำระเงินจะโมฆะการอนุมัติล่วงหน้า

ข้อดีของ Two-Phase Commit

ข้อเสียของ Two-Phase Commit

ทางเลือกอื่นสำหรับ Two-Phase Commit

เนื่องจากข้อจำกัดของ 2PC แนวทางอื่น ๆ หลายอย่างจึงเกิดขึ้นสำหรับการจัดการธุรกรรมแบบกระจาย ซึ่งรวมถึง:

การประยุกต์ใช้ Two-Phase Commit ในทางปฏิบัติ

แม้จะมีข้อจำกัด 2PC ก็ยังคงถูกนำมาใช้ในสถานการณ์ต่างๆ ที่ความสอดคล้องที่แข็งแกร่งเป็นข้อกำหนดที่สำคัญ ตัวอย่างบางส่วน ได้แก่:

การนำ Two-Phase Commit ไปใช้

การนำ 2PC ไปใช้ต้องพิจารณาปัจจัยต่างๆ อย่างรอบคอบ รวมถึง:

ข้อควรพิจารณาในระดับโลกสำหรับธุรกรรมแบบกระจาย

เมื่อออกแบบและนำธุรกรรมแบบกระจายไปใช้ในสภาพแวดล้อมระดับโลก ปัจจัยเพิ่มเติมหลายประการจำเป็นต้องได้รับการพิจารณา:

บทสรุป

ธุรกรรมแบบกระจายและโปรโตคอล Two-Phase Commit (2PC) เป็นแนวคิดสำคัญสำหรับการสร้างระบบแบบกระจายที่มีประสิทธิภาพและสอดคล้องกัน ในขณะที่ 2PC มอบโซลูชันที่เรียบง่ายและนำไปใช้อย่างแพร่หลายสำหรับการทำให้เป็นอะตอม ข้อจำกัดต่างๆ โดยเฉพาะอย่างยิ่งเกี่ยวกับการบล็อกและจุดเดียวที่ล้มเหลว ทำให้ต้องพิจารณาแนวทางอื่น ๆ อย่างรอบคอบ เช่น Sagas และความสอดคล้องกันในที่สุด การทำความเข้าใจข้อแลกเปลี่ยนระหว่างความสอดคล้องที่แข็งแกร่ง ความพร้อมใช้งาน และประสิทธิภาพเป็นสิ่งสำคัญในการเลือกแนวทางที่เหมาะสมกับความต้องการเฉพาะของแอปพลิเคชันของคุณ นอกจากนี้ เมื่อทำงานในสภาพแวดล้อมระดับโลก จะต้องพิจารณาเพิ่มเติมเกี่ยวกับความหน่วงแฝงของเครือข่าย เขตเวลา การแปลข้อมูล และการปฏิบัติตามกฎระเบียบเพื่อให้มั่นใจถึงความสำเร็จของธุรกรรมแบบกระจาย