เบรกเกอร์ควรไปที่ไหน?
ฉันกำลังพัฒนา REST API ใหม่และฉันเคยเห็นบางโครงการวางเบรกเกอร์ไว้ในไฟล์Controller
. ฉันเคยวางไว้ในไฟล์DAO
.
ความแตกต่างประการแรกที่ฉันสามารถพูดได้คือการวางไว้ในDAO
บริการทุกอย่างที่ใช้บุคคลที่สามนี้จะเปิดอยู่ในสถานการณ์ข้อผิดพลาด และวางไว้ในที่Controller
ๆ จะเปิดทุกเส้นทางที่ใช้บุคคลที่สามนี้ ดังนั้นมันจะไม่เกิดขึ้นในทันที แต่ทางเลือกที่สอง (ในController
) ดูเหมือนจะง่ายกว่าที่จะสวมใส่
มีคำแนะนำเกี่ยวกับสถานที่ที่ควรไป?
คำตอบ
คำตอบนี้มีสองส่วน ส่วนแรกได้กล่าวถึงแล้วโดยRobert Harveyในความคิดเห็นของเขา:
- ตามแคตตาล็อกรูปแบบไมโครเซอร์วิสของ Chris Richardson เบรกเกอร์ควรอยู่ในพร็อกซีสำหรับบริการระยะไกล API เกตเวย์เป็นสถานที่ที่ดีสำหรับมัน
- อีกทางเลือกหนึ่งคือการค้นหาฝั่งเซิร์ฟเวอร์โดยเฉพาะอย่างยิ่งหากกลยุทธ์การกู้คืนหมายถึงการค้นหาอินสแตนซ์อื่น ๆ ที่กำลังทำงานอยู่ของบริการเดียวกัน
แต่มีภาคสอง. เป้าหมายของเบรกเกอร์คือการล้มเหลวอย่างรวดเร็วหากตรวจพบว่าบริการไม่พร้อมใช้งานแทนที่จะสะสมขั้นตอนที่จะล้มเหลวในภายหลังสร้างความยุ่งยากอย่างมาก ดังนั้นเซอร์กิตเบรกเกอร์จะได้รับความรู้สึกที่สมบูรณ์ก็ต่อเมื่อบริการที่สิ้นเปลืองพร้อมที่จะตอบสนองต่อการหยุดพัก:
- บางทีบริการระยะไกลเป็นสิ่งจำเป็นและบริการที่สิ้นเปลืองอาจตัดสินใจระงับตัวเอง (เช่นเบรกเกอร์วงจรภายใน)
- อาจเป็นเพราะบริการระยะไกลไม่จำเป็นและบริการที่สิ้นเปลืองสามารถตัดสินใจที่จะให้บริการต่อไปได้ แต่ในโหมดที่เสื่อมโทรม
- (เบรกเกอร์ตามการค้นหาบริการอาจจะไม่ล้มเหลว แต่พบบริการอื่นที่ใช้งานได้และผู้บริโภคจะไม่สังเกตเห็น)
จากมุมมองทั่วไปตัวเลือกประเภทนี้ในพฤติกรรมเป็นความรับผิดชอบของผู้ควบคุม: ตัวควบคุมประสานงานระหว่างองค์ประกอบของบริการและสามารถปรับการประมวลผลตามข้อมูล "ล้มเหลว"
อย่างไรก็ตามหากในกรณีของคุณเป็นเพียงการรับข้อมูลจากที่อื่นและหากกลยุทธ์การประมวลผลข้อผิดพลาดของคุณเหมือนกันเสมอ (ไม่มีความแตกต่างระหว่างสิ่งสำคัญและไม่จำเป็นตัวอย่างเช่นพยายามใช้ค่าที่แคชไว้หากมีและล้มเหลวอื่น ๆ สีขาว) คุณ สามารถตัดสินใจที่จะวางไว้ใน dao imho ได้อย่างสมบูรณ์แบบ