ความเข้าใจแนวคิดที่ดีเกี่ยวกับสิ่งที่โปรโตคอล AMQP ทำ "ภายใต้ประทุน" มีประโยชน์ที่นี่ ฉันขอเสนอว่าเอกสารและ API ที่ AMQP 0.9.1 เลือกที่จะปรับใช้ทำให้เกิดความสับสนโดยเฉพาะอย่างยิ่งดังนั้นคำถามตัวเองเป็นคำถามที่หลายคนต้องต่อสู้ด้วย
TL; DR
การเชื่อมต่อเป็นซ็อกเก็ต TCP แบบต่อรองทางกายภาพกับเซิร์ฟเวอร์ AMQP ไคลเอนต์ที่ใช้งานอย่างถูกต้องจะมีหนึ่งในแอปพลิเคชันเหล่านี้ต่อเธรดที่ปลอดภัย
ช่องเป็นเซสชั่นโปรแกรมเดียวในการเชื่อมต่อ เธรดจะมีเซสชันเหล่านี้ตั้งแต่หนึ่งเซสชันขึ้นไป สถาปัตยกรรม AMQP 0.9.1 คือสิ่งเหล่านี้จะไม่ถูกใช้ร่วมกันระหว่างเธรดและควรถูกปิด / ทำลายเมื่อเธรดที่สร้างเสร็จแล้ว พวกเขายังถูกปิดโดยเซิร์ฟเวอร์เมื่อการละเมิดโปรโตคอลต่างๆเกิดขึ้น
ผู้บริโภคเป็นเสมือนการสร้างที่แสดงถึงการปรากฏตัวของ "กล่องจดหมาย" ในช่องทางโดยเฉพาะอย่างยิ่ง การใช้งานของผู้บริโภคบอกให้นายหน้าเพื่อผลักดันข้อความจากคิวเฉพาะไปยังจุดสิ้นสุดของช่องนั้น
ข้อเท็จจริงการเชื่อมต่อ
ก่อนอื่นตามที่คนอื่นชี้อย่างถูกต้องการเชื่อมต่อคือวัตถุที่แสดงถึงการเชื่อมต่อ TCP จริงไปยังเซิร์ฟเวอร์ การเชื่อมต่อถูกระบุที่ระดับโปรโตคอลใน AMQP และการสื่อสารทั้งหมดกับนายหน้าเกิดขึ้นผ่านการเชื่อมต่อหนึ่งหรือมากกว่า
- เนื่องจากเป็นการเชื่อมต่อ TCP จริงจึงมีที่อยู่ IP และพอร์ต #
- พารามิเตอร์พิธีสารมีการเจรจาบนพื้นฐานต่อลูกค้าเป็นส่วนหนึ่งของการตั้งค่าการเชื่อมต่อ (กระบวนการที่เรียกว่าการจับมือกัน
- มันถูกออกแบบมาให้ยาวอาศัยอยู่ ; มีบางกรณีที่การปิดการเชื่อมต่อเป็นส่วนหนึ่งของการออกแบบโปรโตคอล
- จากมุมมองของ OSI มันอาจอยู่ที่ไหนสักแห่งรอบ ๆเลเยอร์ 6
- สามารถตั้งค่า Heartbeats เพื่อตรวจสอบสถานะการเชื่อมต่อได้เนื่องจาก TCP ไม่มีสิ่งใดที่อยู่ภายในตัวเองเพื่อทำสิ่งนี้
- วิธีที่ดีที่สุดคือให้เธรดเฉพาะจัดการอ่านและเขียนไปยังซ็อกเก็ต TCP พื้นฐาน ส่วนใหญ่หากไม่ใช่ทั้งหมดลูกค้า RabbitMQ จะทำสิ่งนี้ ในเรื่องนั้นพวกเขามักจะปลอดภัยเธรด
- ความสัมพันธ์ค่อนข้าง "แพง" ในการสร้าง (เนื่องจากการจับมือกัน) แต่การพูดจริงแล้วสิ่งนี้ไม่สำคัญ กระบวนการส่วนใหญ่จะต้องใช้วัตถุการเชื่อมต่อเดียวเท่านั้น แต่คุณสามารถรักษาการเชื่อมต่อในพูลหากคุณพบว่าคุณต้องการปริมาณงานมากกว่าเธรด / ซ็อกเก็ตเดียวที่สามารถให้ได้ (ไม่น่าจะเกิดขึ้นกับเทคโนโลยีการคำนวณปัจจุบัน)
ข้อเท็จจริงช่องทาง
ช่องทางคือเซสชั่นโปรแกรมที่เปิดสำหรับชิ้นส่วนของแอปของคุณในแต่ละที่จะสื่อสารกับโบรกเกอร์ RabbitMQ มันทำงานผ่านการเชื่อมต่อเดียวและแสดงถึงเซสชั่นกับนายหน้า
- เนื่องจากเป็นส่วนหนึ่งของตรรกะของแอปพลิเคชันแต่ละช่องมักจะมีอยู่ในเธรดของตัวเอง
- โดยทั่วไปช่องทั้งหมดที่แอปของคุณเปิดจะแชร์การเชื่อมต่อเดียว (เป็นเซสชันที่มีน้ำหนักเบาซึ่งทำงานบนการเชื่อมต่อ) การเชื่อมต่อเป็น thread-safe ดังนั้นจึงเป็นสิ่งที่ตกลง
- การดำเนินการ AMQP ส่วนใหญ่เกิดขึ้นผ่านช่องทาง
- จากมุมมองของชั้น OSI ช่องอาจจะรอบชั้น 7
- ช่องถูกออกแบบมาให้ชั่วคราว ; ส่วนหนึ่งของการออกแบบของ AMQP คือโดยทั่วไปแล้วช่องทางจะปิดเพื่อตอบสนองต่อข้อผิดพลาด (เช่นการประกาศคิวอีกครั้งด้วยพารามิเตอร์ที่แตกต่างกันก่อนที่จะลบคิวที่มีอยู่)
- เนื่องจากแอพพลิเคชั่นนั้นไม่ได้รวมแอพของคุณไว้
- เซิร์ฟเวอร์ใช้จำนวนเต็มเพื่อระบุช่อง เมื่อเธรดที่จัดการการเชื่อมต่อได้รับแพ็คเก็ตสำหรับช่องสัญญาณใดช่องหนึ่งจะใช้หมายเลขนี้เพื่อบอกนายหน้าว่าช่องทางใด / เซสชันที่แพ็คเก็ตเป็นของ
- โดยทั่วไปแชแนลจะไม่ปลอดภัยสำหรับเธรดเนื่องจากจะไม่มีความหมายในการแบ่งปันระหว่างเธรด หากคุณมีเธรดอื่นที่จำเป็นต้องใช้นายหน้าคุณจำเป็นต้องมีช่องทางใหม่
ข้อมูลผู้บริโภค
Consumer คือวัตถุที่กำหนดโดยโปรโตคอล AMQP ไม่ใช่ช่องหรือการเชื่อมต่อแทนที่จะเป็นสิ่งที่แอปพลิเคชันของคุณใช้เป็น "กล่องจดหมาย" หลายประเภทเพื่อวางข้อความ
- "การสร้างผู้บริโภค" หมายความว่าคุณบอกนายหน้า (ใช้ช่องทางผ่านการเชื่อมต่อ ) ว่าคุณต้องการให้ข้อความที่ส่งถึงคุณผ่านช่องทางนั้น ในการตอบสนองนายหน้าซื้อขายจะลงทะเบียนว่าคุณมีลูกค้าในช่องและเริ่มส่งข้อความถึงคุณ
- แต่ละข้อความที่ส่งผ่านการเชื่อมต่อจะอ้างอิงทั้งหมายเลขช่องและหมายเลขผู้ใช้บริการ ด้วยวิธีนี้เธรดการจัดการการเชื่อมต่อ (ในกรณีนี้ภายใน Java API) จะรู้ว่าต้องทำอย่างไรกับข้อความ จากนั้นเธรดการจัดการช่องสัญญาณก็รู้ว่าจะทำอย่างไรกับข้อความ
- การใช้งานของผู้บริโภคมีความหลากหลายมากที่สุดเนื่องจากเป็นแอปพลิเคชันเฉพาะอย่างแท้จริง ในการใช้งานของฉันฉันเลือกที่จะแยกงานออกทุกครั้งที่มีข้อความมาถึงผู้บริโภค ดังนั้นฉันมีเธรดที่จัดการการเชื่อมต่อเธรดที่จัดการช่องสัญญาณ (และโดยส่วนขยายผู้บริโภค) และหนึ่งหรือหลายเธรดงานสำหรับแต่ละข้อความที่ส่งผ่านผู้บริโภค
- การปิดการเชื่อมต่อจะปิดช่องทั้งหมดในการเชื่อมต่อ การปิดช่องจะเป็นการปิดช่องของผู้บริโภคทั้งหมด นอกจากนี้ยังเป็นไปได้ที่จะยกเลิกผู้บริโภค (โดยไม่ต้องปิดช่อง) มีหลายกรณีที่เหมาะสมที่จะทำสามสิ่งนี้
- โดยทั่วไปแล้วการใช้งานของผู้บริโภคในไคลเอนต์ AMQP จะจัดสรรหนึ่งช่องทางเฉพาะให้กับผู้บริโภคเพื่อหลีกเลี่ยงความขัดแย้งกับกิจกรรมของกระทู้หรือรหัสอื่น ๆ (รวมถึงการเผยแพร่)
ในแง่ของสิ่งที่คุณหมายถึงกลุ่มผู้บริโภคด้ายฉันสงสัยว่าลูกค้า Java กำลังทำสิ่งที่คล้ายกับสิ่งที่ฉันตั้งโปรแกรมลูกค้าของฉันที่จะทำ (ฉันเป็นไปตามไคลเอนต์. Net