มีวิธีแก้ปัญหามากมายที่ประนีประนอมมากกว่าที่ฉันพอใจ จริงอยู่ถ้ากรณีการใช้งานของคุณซับซ้อนเช่นการย้ายเงินระหว่างธนาคารต่าง ๆ ทางเลือกที่น่าพอใจมากขึ้นอาจเป็นไปไม่ได้ แต่มาดูกันว่าเราสามารถทำอะไรได้บ้างในสถานการณ์ทั่วไปที่การใช้ไมโครไซต์ขัดขวางการทำธุรกรรมฐานข้อมูลของเรา
ตัวเลือกที่ 1: หลีกเลี่ยงความจำเป็นในการทำธุรกรรมหากเป็นไปได้ทั้งหมด
เห็นได้ชัดและกล่าวถึงมาก่อน แต่เหมาะถ้าเราสามารถจัดการได้ ส่วนประกอบนั้นอยู่ในบริการไมโครเดียวกันหรือไม่? หรือเราสามารถออกแบบระบบใหม่เพื่อให้การทำธุรกรรมไม่จำเป็น? บางทีการยอมรับการไม่ทำธุรกรรมก็คือการเสียสละราคาไม่แพงที่สุด
ตัวเลือก 2: ใช้คิว
หากมีความเชื่อมั่นเพียงพอว่าบริการอื่น ๆ จะประสบความสำเร็จในทุกสิ่งที่เราต้องการให้ทำเราสามารถเรียกมันผ่านคิวบางรูปแบบ รายการที่จัดคิวจะไม่ถูกหยิบขึ้นมาจนกระทั่งต่อมา แต่เราสามารถตรวจสอบให้แน่ใจว่ารายการถูกจัดคิว
ตัวอย่างเช่นสมมติว่าเราต้องการแทรกเอนทิตีและส่งอีเมลเป็นธุรกรรมเดียว แทนที่จะเรียกเมลเซิร์ฟเวอร์เราจัดคิวอีเมลในตาราง
Begin transaction
Insert entity
Insert e-mail
Commit transaction
ข้อเสียเปรียบที่ชัดเจนก็คือไมโครไซต์หลายรายการจะต้องเข้าถึงตารางเดียวกัน
ตัวเลือกที่ 3: ทำงานภายนอกให้เสร็จก่อนที่จะทำธุรกรรม
วิธีนี้ขึ้นอยู่กับสมมติฐานที่ว่าการทำธุรกรรมนั้นไม่น่าจะล้มเหลว
Begin transaction
Insert entity
Insert another entity
Make external call
Commit transaction
หากการสอบถามล้มเหลวการโทรภายนอกยังไม่เกิดขึ้น หากการโทรภายนอกล้มเหลวการทำธุรกรรมจะไม่เกิดขึ้น
วิธีการนี้มาพร้อมกับข้อ จำกัด ที่เราสามารถทำการโทรภายนอกได้เพียงครั้งเดียวและต้องทำการโทรครั้งสุดท้าย (เช่นเราไม่สามารถใช้ผลลัพธ์ในแบบสอบถามของเราได้)
ตัวเลือก 4: สร้างสิ่งต่าง ๆ ในสถานะรอดำเนินการ
ดังที่โพสต์ที่นี่เราสามารถมี microservices หลายรายการสร้างองค์ประกอบที่แตกต่างกันแต่ละรายการอยู่ในสถานะรอดำเนินการไม่ใช่ธุรกรรม
การตรวจสอบความถูกต้องจะดำเนินการ แต่ไม่มีการสร้างสิ่งใดในสถานะที่แน่นอน หลังจากสร้างทุกอย่างสำเร็จแล้วแต่ละองค์ประกอบจะถูกเปิดใช้งาน โดยปกติการดำเนินการนี้ง่ายมากและโอกาสของสิ่งที่ผิดพลาดมีขนาดเล็กมากซึ่งเราอาจต้องการเปิดใช้งานที่ไม่ใช่ธุรกรรม
ข้อเสียเปรียบที่ยิ่งใหญ่ที่สุดคือเราต้องคำนึงถึงการมีอยู่ของรายการที่รอดำเนินการ แบบสอบถามแบบใช้เลือกข้อมูลใด ๆ จำเป็นต้องพิจารณาว่าจะรวมข้อมูลที่อยู่ระหว่างดำเนินการหรือไม่ ส่วนใหญ่ควรละเลยมัน และการอัปเดตเป็นอีกเรื่องหนึ่งโดยสิ้นเชิง
ตัวเลือกที่ 5: ให้ microservice แชร์คิวรีของมัน
ไม่มีตัวเลือกอื่นให้คุณ จากนั้นให้ของได้รับนอกรีต
ขึ้นอยู่กับ บริษัท ว่าสิ่งนี้อาจยอมรับไม่ได้ ฉันรู้ นี่คือนอกรีต หากไม่เป็นที่ยอมรับให้ไปที่เส้นทางอื่น แต่ถ้าสิ่งนี้เหมาะกับสถานการณ์ของคุณมันจะแก้ปัญหาอย่างเรียบง่ายและทรงพลัง มันอาจเป็นการประนีประนอมที่ยอมรับได้มากที่สุด
มีวิธีเปลี่ยนแบบสอบถามจาก microservices หลายรายการเป็นธุรกรรมฐานข้อมูลเดียวที่เรียบง่าย
ส่งคืนเคียวรีแทนที่จะเรียกใช้งาน
Begin transaction
Execute our own query
Make external call, receiving a query
Execute received query
Commit transaction
เครือข่ายฉลาดแต่ละ microservice ต้องสามารถเข้าถึงแต่ละฐานข้อมูล เก็บเรื่องนี้ไว้ในใจและคำนึงถึงการปรับขนาดในอนาคตด้วย
หากฐานข้อมูลที่เกี่ยวข้องในการทำธุรกรรมอยู่บนเซิร์ฟเวอร์เดียวกันนี่จะเป็นธุรกรรมปกติ หากพวกเขาอยู่บนเซิร์ฟเวอร์ที่แตกต่างกันมันจะเป็นธุรกรรมที่กระจาย รหัสจะเหมือนกันโดยไม่คำนึงถึง
เราได้รับแบบสอบถามรวมถึงประเภทการเชื่อมต่อพารามิเตอร์และสตริงการเชื่อมต่อ เราสามารถสรุปมันได้ในคลาส Commandable executable ที่ทำให้ flow อ่านได้: การเรียก microservice ใน Command ซึ่งเราดำเนินการซึ่งเป็นส่วนหนึ่งของการทำธุรกรรมของเรา
สตริงการเชื่อมต่อคือสิ่งที่ microservice เริ่มต้นให้เราดังนั้นสำหรับเจตนาและวัตถุประสงค์ทั้งหมดแบบสอบถามจะถูกพิจารณาว่าจะถูกเรียกใช้งานโดย microservice นั้น เราเป็นเพียงเส้นทางร่างกายผ่าน microservice ลูกค้า นั่นสร้างความแตกต่างหรือไม่? มันช่วยให้เราวางมันในธุรกรรมเดียวกันกับเคียวรีอื่น
หากการประนีประนอมเป็นที่ยอมรับวิธีการนี้จะทำให้เราสามารถทำธุรกรรมได้อย่างตรงไปตรงมาของแอพพลิเคชั่นแบบ monolith ในสถาปัตยกรรม microservice