คุณจะออกแบบซอฟต์แวร์ของคุณที่อัพเดตไมโครไซต์หลายรายการได้อย่างไรหากหนึ่งในนั้นล้มเหลว


12

มีรูปแบบการออกแบบหรือการฝึกฝนที่ฉันสามารถใช้เพื่อช่วยในการบริการที่ไม่ว่าจะลงหรือลงในขณะที่คนอื่นมีความเสถียรหรือไม่?

ถ้าฉันมีไมโครไซต์สามรายการและอีกสองรายการนั้นดีและมีรายการหนึ่งที่เสียชีวิตกลาง POST สองจะได้รับ POST และหนึ่งจะไม่ ฉันไม่คิดว่าฉันสามารถทำธุรกรรมได้เพราะฉันส่งคำขอไปยังบริการ

ฉันจะออกแบบเพื่อสิ่งนั้นได้อย่างไร ฉันไม่ต้องการข้อมูลเด็กกำพร้าในฐานข้อมูลต่างๆ


6
มันไม่ใช่ปัญหาง่าย ๆ ที่จะแก้ ฉันเห็นว่ามันใช้งานเป็นคิวของบริการ (ความสอดคล้องในที่สุด) เนื่องจากส่วนใหญ่คุณไม่ได้อยู่ในการควบคุมของบริการและการจัดเก็บผู้จัดการการทำธุรกรรมหรือความสามารถในการทำธุรกรรมเป็นเรื่องที่ดีที่สุดและอาจไม่ใช่ความคิดที่ดี ในสภาพแวดล้อม SOA ฉันเห็นสิ่งนี้เป็นส่วนใหญ่เกี่ยวกับการใช้โทรศัพท์มือถือซึ่งคุณอาจมีหรือไม่มีการเชื่อมต่อไปยังปลายทางของคุณ
Mike

acid over microservices เป็นถั่วที่ยากต่อการแตกตัวเลือกอื่นอาจเป็นบัสแปลก ๆ ใช้ redis เผยแพร่ / สมัครสมาชิกหรือออกแบบคิวและโพสต์ครั้งเดียวจากช่องทางขาเข้าจากนั้นบริการสมัครสมาชิกหรือบริการผู้รับมอบฉันทะของคุณผลักดันเป้าหมายและรายงานความสำเร็จ ความล้มเหลว คุณจะต้องตรวจสอบความล้มเหลวและมีขั้นตอนเช่นกัน นอกจากนี้คุณยังสามารถมีความล้มเหลวที่การทำธุรกรรมไม่ถูกต้องในบริการหนึ่ง แต่ใช้ได้กับอีกสองบริการ แต่เป็นอีกหนึ่งความล้มเหลวที่คุณต้องดำเนินการ
Tim Cederquist

จะไม่ใช้บางอย่างเช่น "ผู้จัดการคิว" ซึ่งเป็นสิ่งที่ฉันคิดว่า Redis จะทำให้เกิดคอขวด? หรืออย่างน้อยก็มีศักยภาพสูงเช่นกัน? ฉันรู้ว่าไม่มีวิธีอื่นใดนอกจากที่คุณบรรยายไว้
johnny

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

นี่เป็นสิ่งที่คล้ายกับ rabbitmq ใช่หรือไม่
johnny

คำตอบ:


9

ตัวเลือกบางอย่าง

ใช้ช่องทางการสื่อสารแบบถาวร

แทนที่จะเป็น HTTP ให้ปล่อยข้อความในคิวที่พร้อมใช้งานสูงและต่อเนื่อง เช่น Kafka ตราบใดที่เซิร์ฟเวอร์เป้าหมายพร้อมใช้งานในบางจุดก็จะได้รับข้อความ

ตอนนี้คุณมีข้อเสียของการเตรียมและจัดการระบบย่อยที่ซับซ้อน (คิว) ดังนั้นให้แน่ใจว่าคุณวิเคราะห์ว่าสิ่งนี้คุ้มค่าหรือไม่

ถอยกลับและลองอีกครั้ง

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

ตรวจจับและชดเชย

งานตรวจสอบเป็นระยะสำหรับเงื่อนไขความสอดคล้องระหว่างไมโครไซต์ เช่นความล้มเหลวบันทึกข้อมูลจนถึงการสืบค้น API โดยตรงตามความจำเป็น หากพบปัญหา (เช่นมีคำสั่งซื้อ แต่ไม่ได้รับรายการบรรจุภัณฑ์) ให้ทำตามขั้นตอนการชดเชย ขั้นตอนเหล่านั้นอาจเป็นการสร้างตั๋วการสนับสนุนสำหรับการแก้ไขด้วยตนเองหรือส่งอีเมลถึงบุคคลอื่นหรืออะไรก็ตาม

พิจารณาทางเลือกการออกแบบ

กรณีเช่นนี้อาจเรียกร้องให้เกตเวย์ API จัดการการโทรไปยังไมโครไซต์ที่ได้รับผลกระทบ วิธีนี้จะช่วยให้คุณควบคุมกลยุทธ์ที่ใช้ในการลดปัญหานี้ คุณอาจไม่ต้องการให้ลูกค้ารับทราบรายละเอียดการติดตั้งเหล่านั้น ดูเบรกเกอร์รูปแบบ

เนื่องจาก microservices เป็นอิสระมักจะมีกรณีความล้มเหลวบางอย่างที่อาจส่งผลให้เกิดความไม่สอดคล้องกัน คุณต้องพร้อมที่จะทำการแก้ไขด้วยตนเองเมื่อเกิดขึ้น

หากคุณต้องการความมั่นคงที่แข็งแกร่งจากนั้น microservices จะไม่เหมาะสม หากยังคงต้อง scalability คุณอาจต้องการที่จะมองเข้าไปshardingที่ข้อมูลที่เกี่ยวข้องสามารถร่วมตั้งอยู่บนชาร์ดเหมือนกันสำหรับการค้ำประกันความสอดคล้อง คุณยังสามารถไต่ระดับ IO โดยการเพิ่มเศษ

หากคุณต้องการความมั่นคงที่แข็งแกร่งและไม่มีปัญหาเรื่องความสามารถในการขยายระบบให้ใช้บริการเสาหิน ใช้ไลบรารีเป็นขอบเขตภายในแอปพลิเคชันของคุณเพื่อแยกข้อกังวลออก


นี่คือสิ่งที่ RabbitMQ มีไว้เพื่ออะไร?
johnny

RabbitMQ เป็นคำตอบสำหรับคำถามของคุณหรือไม่? ไม่อาจเป็นส่วนหนึ่งของโซลูชันที่ตรงกับความต้องการของคุณ แต่มันจะไม่แก้ปัญหาของคุณเพียงอย่างเดียว
Kasey Speakman

เพียงแค่ทราบ ฉันคิดว่า RabbitMQ ไม่ยืนยันข้อความ มันถูกบริโภคและลบออกจากคิวดังนั้นไม่ใช่ หากคุณต้องการความเพียรและลองใหม่ RabbitMQ จะไม่ช่วยคุณ
Laiv

2

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

http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/

http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.