Hystrix ซึ่งเป็น Netflix API สำหรับเวลาแฝงและความทนทานต่อข้อผิดพลาดในระบบกระจายที่ซับซ้อนใช้เทคนิคBulkhead Pattern สำหรับการแยกเธรด ใครช่วยอธิบายให้ละเอียดหน่อยได้ไหม
Hystrix ซึ่งเป็น Netflix API สำหรับเวลาแฝงและความทนทานต่อข้อผิดพลาดในระบบกระจายที่ซับซ้อนใช้เทคนิคBulkhead Pattern สำหรับการแยกเธรด ใครช่วยอธิบายให้ละเอียดหน่อยได้ไหม
คำตอบ:
โดยทั่วไปเป้าหมายของรูปแบบกำแพงกั้นคือการหลีกเลี่ยงความผิดพลาดในส่วนหนึ่งของระบบเพื่อทำลายระบบทั้งหมด คำนี้มาจากเรือที่เรือถูกแบ่งในช่องกันน้ำที่แยกจากกันเพื่อหลีกเลี่ยงการรั่วไหลของเรือเพียงครั้งเดียวเพื่อให้น้ำท่วมทั้งลำ มันจะท่วมเพียงกำแพงกั้นเดียว
การใช้งานรูปแบบกั้นสามารถทำได้หลายรูปแบบขึ้นอยู่กับว่าคุณต้องการป้องกันระบบจากข้อบกพร่องประเภทใด ฉันจะพูดถึงประเภทของข้อบกพร่องที่ Hystrix จัดการในคำตอบนี้เท่านั้น
ฉันคิดว่ารูปแบบกำแพงกั้นได้รับความนิยมจากหนังสือRelease It! โดย Michael T. Nygard
การดำเนินการกั้นใน Hystrix จำกัด จำนวนของสายพร้อมกันเพื่อส่วนประกอบ ด้วยวิธีนี้จำนวนทรัพยากร (โดยทั่วไปคือเธรด) ที่กำลังรอการตอบกลับจากคอมโพเนนต์มี จำกัด
สมมติคุณมีคำขอตามแอพลิเคชันหลายเธรด (ตัวอย่างเช่นโปรแกรมเว็บทั่วไป) ที่ใช้สามองค์ประกอบที่แตกต่างกัน, BและC หากการร้องขอไปยังส่วนCเริ่มต้นที่จะแขวนในที่สุดคำขอทั้งหมดจัดการกระทู้จะแขวนบนรอคำตอบจากC สิ่งนี้จะทำให้แอปพลิเคชันไม่ตอบสนองโดยสิ้นเชิง หากการร้องขอไปยังCได้รับการจัดการช้าเราก็มีปัญหาเช่นเดียวกันหากโหลดสูงพอ
การใช้รูปแบบกั้นกั้นของ Hystrix จำกัด จำนวนการเรียกใช้พร้อมกันไปยังส่วนประกอบและจะบันทึกแอปพลิเคชันไว้ในกรณีนี้ สมมติว่าเรามีเธรดการจัดการคำขอ 30 รายการและ จำกัด การเรียกCพร้อมกัน 10 ครั้ง จากนั้นเธรดการจัดการคำร้องขอสูงสุด 10 เธรดสามารถแฮงค์เมื่อเรียกใช้Cส่วนเธรดอีก 20 เธรดยังคงสามารถจัดการคำร้องขอและใช้คอมโพเนนต์AและBได้
Hystrix 'มีสองวิธีที่แตกต่างกันในการกั้นกั้นการแยกด้ายและการแยกสัญญาณ
แนวทางมาตรฐานคือการส่งคำขอทั้งหมดไปยังคอมโพเนนต์Cไปยังเธรดพูลแยกต่างหากโดยมีจำนวนเธรดคงที่และไม่มีคิวการร้องขอ (หรือเล็ก)
วิธีการอื่น ๆ ที่จะมีทุกสายที่ได้รับใบอนุญาต (0 หมดเวลา) ก่อนที่จะร้องขอไปยังC หากไม่สามารถรับใบอนุญาตจากเซมาฟอร์ได้การโทรไปยังCจะไม่ผ่าน
ข้อดีของวิธีพูลเธรดคือการร้องขอที่ส่งไปยังCสามารถหมดเวลาได้ซึ่งเป็นสิ่งที่ไม่สามารถทำได้เมื่อใช้เซมาโฟร์
นี่คือตัวอย่างที่ดีพร้อมคำอธิบายรันไทม์สำหรับกั้นใน Resilience4j ซึ่งได้รับแรงบันดาลใจจาก Netflix Hystrix
ตัวอย่างด้านล่างการกำหนดค่าอาจให้ความชัดเจนในการใช้งาน
ตัวอย่างการกำหนดค่า: อนุญาตการโทรพร้อมกันสูงสุด 5 ครั้งในเวลาใดก็ได้ ให้สายอื่นรอจนกว่าหนึ่งใน 5 สายที่กำลังดำเนินการพร้อมกันจะเสร็จสิ้นหรือสูงสุด 2 วินาที
Idea คือไม่สร้างภาระให้กับระบบใด ๆ ที่มีภาระมากเกินกว่าที่พวกเขาจะบริโภคได้ หากโหลดที่เข้ามามากกว่าการบริโภคให้รอเวลาที่เหมาะสมหรือหมดเวลาและไปที่เส้นทางอื่น