Hystrix ใช้ Bulkhead Pattern อะไร


104

Hystrix ซึ่งเป็น Netflix API สำหรับเวลาแฝงและความทนทานต่อข้อผิดพลาดในระบบกระจายที่ซับซ้อนใช้เทคนิคBulkhead Pattern สำหรับการแยกเธรด ใครช่วยอธิบายให้ละเอียดหน่อยได้ไหม

คำตอบ:


193

ทั่วไป

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

การใช้งานรูปแบบกั้นสามารถทำได้หลายรูปแบบขึ้นอยู่กับว่าคุณต้องการป้องกันระบบจากข้อบกพร่องประเภทใด ฉันจะพูดถึงประเภทของข้อบกพร่องที่ Hystrix จัดการในคำตอบนี้เท่านั้น

ฉันคิดว่ารูปแบบกำแพงกั้นได้รับความนิยมจากหนังสือRelease It! โดย Michael T. Nygard

สิ่งที่ Hystrix แก้ได้

การดำเนินการกั้นใน Hystrix จำกัด จำนวนของสายพร้อมกันเพื่อส่วนประกอบ ด้วยวิธีนี้จำนวนทรัพยากร (โดยทั่วไปคือเธรด) ที่กำลังรอการตอบกลับจากคอมโพเนนต์มี จำกัด

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

การใช้รูปแบบกั้นกั้นของ Hystrix จำกัด จำนวนการเรียกใช้พร้อมกันไปยังส่วนประกอบและจะบันทึกแอปพลิเคชันไว้ในกรณีนี้ สมมติว่าเรามีเธรดการจัดการคำขอ 30 รายการและ จำกัด การเรียกCพร้อมกัน 10 ครั้ง จากนั้นเธรดการจัดการคำร้องขอสูงสุด 10 เธรดสามารถแฮงค์เมื่อเรียกใช้Cส่วนเธรดอีก 20 เธรดยังคงสามารถจัดการคำร้องขอและใช้คอมโพเนนต์AและBได้

แนวทางของ Hystrix

Hystrix 'มีสองวิธีที่แตกต่างกันในการกั้นกั้นการแยกด้ายและการแยกสัญญาณ

การแยกเธรด

แนวทางมาตรฐานคือการส่งคำขอทั้งหมดไปยังคอมโพเนนต์Cไปยังเธรดพูลแยกต่างหากโดยมีจำนวนเธรดคงที่และไม่มีคิวการร้องขอ (หรือเล็ก)

การแยกสัญญาณ

วิธีการอื่น ๆ ที่จะมีทุกสายที่ได้รับใบอนุญาต (0 หมดเวลา) ก่อนที่จะร้องขอไปยังC หากไม่สามารถรับใบอนุญาตจากเซมาฟอร์ได้การโทรไปยังCจะไม่ผ่าน

ความแตกต่าง

ข้อดีของวิธีพูลเธรดคือการร้องขอที่ส่งไปยังCสามารถหมดเวลาได้ซึ่งเป็นสิ่งที่ไม่สามารถทำได้เมื่อใช้เซมาโฟร์


10
นอกจากนี้ในวิกิพีเดีย Hystrix ดั้งเดิมตอนนี้มีคำอธิบายโดยละเอียดของทั้งสองวิธี: github.com/Netflix/Hystrix/wiki/How-it-Works
Dmitry

1
อะไรคือความแตกต่างระหว่างเบรกเกอร์และแผงกั้น?
voipp

4
@voipp เซอร์กิตเบรกเกอร์เป็นสิ่งที่แตกต่างกันมาก พวกเขาตรวจพบเมื่อบริการอยู่ในสถานะที่ไม่แข็งแรงและย้ายผู้โทรเข้าสู่สถานะ "ล้มเหลวอย่างรวดเร็ว" โดยที่พวกเขาไม่เรียกใช้บริการที่ไม่แข็งแรง แต่จะส่งคืนรหัสข้อผิดพลาดแทนจนกว่าบริการจะดีอีกครั้ง วิธีนี้จะหลีกเลี่ยงการใช้งานบริการที่ไม่แข็งแรงมากเกินไปเพื่อให้สามารถกู้คืนได้และป้องกันความล้มเหลวแบบเรียงซ้อนเนื่องจากผู้โทรไม่ได้ชะลอตัวลง
K Erlandsson

1

นี่คือตัวอย่างที่ดีพร้อมคำอธิบายรันไทม์สำหรับกั้นใน Resilience4j ซึ่งได้รับแรงบันดาลใจจาก Netflix Hystrix

ตัวอย่างด้านล่างการกำหนดค่าอาจให้ความชัดเจนในการใช้งาน

ตัวอย่างการกำหนดค่า: อนุญาตการโทรพร้อมกันสูงสุด 5 ครั้งในเวลาใดก็ได้ ให้สายอื่นรอจนกว่าหนึ่งใน 5 สายที่กำลังดำเนินการพร้อมกันจะเสร็จสิ้นหรือสูงสุด 2 วินาที

Idea คือไม่สร้างภาระให้กับระบบใด ๆ ที่มีภาระมากเกินกว่าที่พวกเขาจะบริโภคได้ หากโหลดที่เข้ามามากกว่าการบริโภคให้รอเวลาที่เหมาะสมหรือหมดเวลาและไปที่เส้นทางอื่น

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