Exchange
- จุดแลกเปลี่ยนหรือจุดแลกเปลี่ยน ข้อความถูกส่งถึงมัน Exchange
กระจายข้อความ ในหนึ่งหรือหลายคิว เขา กำหนดเส้นทางข้อความไปยังคิว ตามลิงค์ที่สร้างขึ้น (bindings
) ระหว่างคิวกับคิว
Exchange
ไม่ใช่ exchange
เป็นสตริง (ลิงก์ไปยังโมดูลที่มีโค้ดซึ่งมีตรรกะการกำหนดเส้นทาง) ในฐานข้อมูลแบบฝัง
สารบัญ
แรบบิทเอ็มคิว. ส่วนที่ 1 บทนำ Erlang, AMQP และ RPC แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน - แรบบิทเอ็มคิว. ส่วนที่ 3 ทำความเข้าใจคิวและการโยง
- แรบบิทเอ็มคิว. ส่วนที่ 4 การจัดการกับข้อความและเฟรมคืออะไร
- แรบบิทเอ็มคิว. ส่วนที่ 5: การเผยแพร่และการใช้ประสิทธิภาพของข้อความ
- แรบบิทเอ็มคิว. ส่วนที่ 6 ภาพรวมของโมดูลสหพันธ์และพลั่ว
- แรบบิทเอ็มคิว. ตอนที่ 7 รายละเอียดเกี่ยวกับ Connection และ Chanel
- แรบบิทเอ็มคิว. ส่วนที่ 8 RabbitMQ ใน. NET
- แรบบิทเอ็มคิว. ส่วนที่ 9 การตรวจสอบ
แลกเปลี่ยนโดยตรง
Direct exchange
- ใช้เมื่อจำเป็น ส่งข้อความไปยังคิวเฉพาะ. ข้อความจะถูกเผยแพร่ไปยังผู้แลกเปลี่ยนโดยระบุเฉพาะ รหัสเส้นทาง และเข้าสู่คิวทั้งหมดที่เกี่ยวข้องกับตัวแลกเปลี่ยนนี้ด้วยคีย์การกำหนดเส้นทางที่คล้ายกัน คีย์เส้นทางเป็นสตริง. การจับคู่เสร็จสิ้นโดยใช้ ตรวจสอบสตริงเพื่อความเท่าเทียมกัน.
การแสดงการไหลของข้อความแบบกราฟิก:
В rabbitmq
มีแนวคิดอยู่ การแลกเปลี่ยนเริ่มต้น. มัน direct exchange
ไม่มีชื่อ. หากใช้ตัวแลกเปลี่ยนเริ่มต้น ข้อความจะถูกส่งไปยังคิวที่มีชื่อเท่ากับ คีย์การกำหนดเส้นทางข้อความ.
แลกเปลี่ยนหัวข้อ
Topic exchange
- คล้ายกัน direct exchange
เปิดใช้งานการกำหนดเส้นทางแบบเลือกโดยการเปรียบเทียบคีย์การกำหนดเส้นทาง แต่ในกรณีนี้จะมีการมอบกุญแจให้ ตามเทมเพลต. เมื่อสร้างเทมเพลตให้ใช้ 0
หรือคำอื่น ๆ อีกมากมาย (ตัวอักษร AZ
и az
และตัวเลข 0-9
) คั่นด้วยจุด เช่นเดียวกับสัญลักษณ์ *
и #
.
*
- สามารถแทนที่ได้อย่างแน่นอน1
คำ#
- สามารถทดแทนได้0
หรือคำเพิ่มเติม
การแสดงการไหลของข้อความแบบกราฟิก:
เริ่มจากรุ่น RabbitMQ 2.4.0
อัลกอริธึมการกำหนดเส้นทางสำหรับ topic exchange
เริ่มทำงานจนกระทั่ง 145
เร็วขึ้นเท่าตัว พวกเขาบรรลุเป้าหมายนี้โดยการนำแนวทางดังกล่าวไปใช้ a.b.c
, a.*.b.c
, a.#.c
и b.b.c
จะแสดงด้วยโครงสร้างดังต่อไปนี้:
การจับคู่รูปแบบจะถูกค้นหาโดยเริ่มจากรากและไปจากบนลงล่าง
คุณสมบัติ:
- การใช้เครื่องแลกเปลี่ยนนี้สามารถเป็นได้ ทางเลือกที่ดีสำหรับการพัฒนาแอพในอนาคต, เพราะ เทมเพลตสามารถปรับแต่งได้เสมอเพื่อให้ข้อความได้รับการเผยแพร่ในทำนองเดียวกัน
direct exchange
หรือfanout exchange
- แม่แบบที่ใช้
*
เร็วกว่ามากกว่าเทมเพลตที่ใช้#
. topic exchange
ช้าลงdirect exchange
การแลกเปลี่ยน Fanout
Fanout exchange
- ข้อความทั้งหมดจะถูกส่งไปยังทุกคิว แม้ว่าจะมีการระบุรหัสเส้นทางไว้ในข้อความก็ตาม
คุณสมบัติ:
RabbitMQ
ใช้ไม่ได้กับคีย์การกำหนดเส้นทางและเทมเพลต ซึ่งส่งผลดีต่อประสิทธิภาพการทำงาน นี่คือวิธีที่เร็วที่สุดexchange
;- ผู้บริโภคทุกคนจะต้องสามารถประมวลผลข้อความทั้งหมดได้
การแสดงการไหลของข้อความแบบกราฟิก:
การแลกเปลี่ยนส่วนหัว
Headers exchange
- ส่งข้อความไปยังคิวที่เกี่ยวข้องโดยอิงจากการเปรียบเทียบคู่ของคุณสมบัติ (คีย์, ค่า) headers
คุณสมบัติการผูกและข้อความที่คล้ายกัน headers
คือ a Dictionary<ключ, значение>
.
หากคุณเพิ่มคีย์พิเศษลงในพจนานุกรม x-match
ด้วยความหมาย any
จากนั้นข้อความจะถูกส่งต่อหากคู่ (คีย์, ค่า) ตรงกันบางส่วน ลักษณะการทำงานนี้จะคล้ายกับตัวดำเนินการ or
.
var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");
คีย์เริ่มต้น x-match
มีค่า all
. ซึ่งหมายความว่าข้อความจะถูกส่งไปเมื่อคู่ (คีย์, ค่า) ตรงกันโดยสมบูรณ์ ลักษณะการทำงานนี้จะคล้ายกับตัวดำเนินการ and
.
การแสดงการไหลของข้อความแบบกราฟิก:
คุณสมบัติ:
- ความยืดหยุ่นเพิ่มเติม
- ค่าใช้จ่ายในการคำนวณเพิ่มเติม คู่ทั้งหมด (คีย์, ค่า) ของแอตทริบิวต์
headers
ต้องเรียงลำดับตามชื่อคีย์ก่อนคำนวณค่าการกำหนดเส้นทางข้อความ ช้ากว่าการแลกเปลี่ยนประเภทอื่น.
การแลกเปลี่ยนแฮชที่สอดคล้องกัน
เครื่องแลกเปลี่ยนนี้คือ RabbitMQ
.
Consistent-hashing exchange
(แลกเปลี่ยนด้วยการแฮชที่สอดคล้องกัน) - ใช้เมื่อมีหลายคิวที่อาจผู้รับข้อความและเมื่อคุณต้องการสมดุลการโหลดระหว่างคิวเหล่านั้น ข้อความเชื่อมโยงกับคิวตามน้ำหนัก (ค่าสตริงแบบมีเงื่อนไขจาก 0 - n
).
น้ำหนักคิวที่เท่ากัน - ระบุว่าแต่ละคิวจะได้รับ ประมาณจำนวนเดียวกัน ข้อความ (แต่ละข้อความจะถูกใส่ไว้ในคิวเดียวเท่านั้น) ไม่มีการรับประกันอย่างสมบูรณ์ถึงการกระจายข้อความที่สม่ำเสมอ.
การแสดงการไหลของข้อความแบบกราฟิก:
Hash
คำนวณตามคีย์เส้นทางหรือคุณสมบัติ headers
ข้อความ หากข้อความที่เผยแพร่ทั้งหมดมีคีย์เส้นทางที่แตกต่างกันหรือ headers
แล้วการกระจายตัวจะเกิดขึ้นตามน้ำหนัก มิฉะนั้นจะใช้รหัสเส้นทางหรือ headers
.
ควรช่วยเมื่อปริมาณงานของผู้บริโภคจำเป็นต้องเติบโตสูงกว่าโซลูชันที่มีผู้บริโภคหลายรายใช้คิวเดียวกัน
การรวมกันของเครื่องแลกเปลี่ยน (E2E)
พฤติกรรมของผู้แลกเปลี่ยนทั้งหมดสามารถรวมกันได้โดยใช้การสื่อสาร แลกเปลี่ยนเพื่อแลกเปลี่ยน (การรวมกันของตัวแลกเปลี่ยนไม่รวมอยู่ในข้อกำหนด AMQP
. นี่คือส่วนขยายโปรโตคอลจากด้านข้าง RabbitMQ
).
การแสดงการไหลของข้อความแบบกราฟิก:
ค่าใช้จ่ายของ E2E
เราสามารถค้นหาการกำหนดค่าที่ปรับขนาดได้ที่เหมาะสมซึ่งตรงตามข้อกำหนดทั้งในปัจจุบันและที่กำลังเติบโต
สร้างการแลกเปลี่ยน
ตัวแลกเปลี่ยนถูกสร้างขึ้นโดยใช้ซิงโครนัส RPC
ร้องขอไปยังเซิร์ฟเวอร์ การขอใช้เมธอด Exchange.Declare
เรียกด้วยพารามิเตอร์:
- ชื่อผู้แลกเปลี่ยน
- ประเภทการแลกเปลี่ยน
- ตัวเลือกอื่น
ตัวอย่างการสร้าง exchange
โดย
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...
exchange
- ชื่อผู้แลกเปลี่ยนที่เราต้องการสร้าง ชื่อจะต้องไม่ซ้ำกันtype
- ประเภทของเครื่องแลกเปลี่ยนdurable
- หากติดตั้งแล้วtrue
แล้วexchange
จะเป็นแบบถาวร มันจะถูกจัดเก็บไว้ในดิสก์และจะสามารถอยู่รอดได้เมื่อเซิร์ฟเวอร์/นายหน้ารีสตาร์ท หากมีค่าfalse
แล้วexchange
เป็นการชั่วคราวและจะถูกลบออกเมื่อเซิร์ฟเวอร์/นายหน้ารีสตาร์ทautoDelete
- การลบอัตโนมัติExchange
จะถูกลบเมื่อคิวที่เกี่ยวข้องทั้งหมดถูกลบarguments
เป็นอาร์กิวเมนต์ที่เป็นทางเลือก ส่วนใหญ่มักจะผ่านการโต้แย้งที่ตั้งไว้alternative exchange
(เครื่องแลกเปลี่ยนทางเลือก). หากข้อความไม่สามารถผ่านเส้นทางเดิมได้ สามารถส่งไปยังการแลกเปลี่ยนอื่นเพื่อกำหนดเส้นทางไปตามเส้นทางอื่นได้
ถ้าสร้าง exchange
บางทีจากนั้นเซิร์ฟเวอร์จะส่งไคลเอนต์แบบซิงโครนัส RPC
ตอบ Exchange.DeclareOk
. หากสร้างสรรค์ เป็นไปไม่ได้ (มีการปฏิเสธคำขอ Exchange.Declare
) แล้ว ช่องจะปิด เซิร์ฟเวอร์โดยใช้คำสั่งอะซิงโครนัส Channel.Close
และลูกค้าจะได้รับข้อยกเว้น
ต้องสร้างตัวแลกเปลี่ยนก่อนที่จะโพสต์ หากคุณเผยแพร่ข้อความไปยังผู้แลกเปลี่ยนที่ไม่มีอยู่จริง - RabbitMQ
ลบมันออกอย่างเงียบ ๆ
สร้าง GUI การแลกเปลี่ยน
ไปที่แผงผู้ดูแลระบบ RabbitMQ
ภายใต้ผู้ใช้ guest
(ชื่อผู้ใช้: guest
และรหัสผ่าน: guest
). โปรดทราบว่าผู้ใช้ guest
สามารถเชื่อมต่อจาก localhost เท่านั้น ตอนนี้ไปที่แท็บ Exchanges
และคลิกที่ Add a new exchange
. กรอกคุณสมบัติ:
คุณสมบัติส่วนใหญ่ได้อธิบายไว้ข้างต้นแล้ว ที่นี่เราสังเกตว่าถ้าเราตั้งค่า Internal
จากนั้นการแลกเปลี่ยนสามารถใช้ได้เฉพาะกับเท่านั้น E2E
. Producer
จะไม่สามารถส่งข้อความถึงการแลกเปลี่ยนดังกล่าวได้
ข้อสรุป
เมื่อพัฒนาระบบ จะสะดวกในการอธิบายโทโพโลยี
หากในกราฟที่สร้างขึ้นมีอยู่จริง ชุดจำกัด ปุ่มกำหนดเส้นทางนั้นก็คุ้มค่าที่จะดูหลาย ๆ อัน fanout exchange
ซึ่งเป็นอัตราส่วน 1:1 ที่เกี่ยวข้องกับคีย์การกำหนดเส้นทาง จำไว้ fanout exchange
ที่เร็วที่สุด.
หากมีจำนวนเส้นทาง มีแนวโน้มที่จะไม่มีที่สิ้นสุดมันคุ้มค่าที่จะให้ความสนใจ topic exchange
หรือหากไม่จำเป็นต้องใช้เทมเพลต คุณก็สามารถเลือกได้ direct exchnge
, เพราะ เขาเร็วขึ้น topic exchange
.
การผสมผสานที่แตกต่างกัน exchange
ควรช่วยคุณค้นหาสิ่งที่ถูกต้อง การกำหนดค่าที่ปรับขนาดได้ซึ่งตรงตามข้อกำหนดของระบบทั้งในปัจจุบันและที่กำลังเติบโต
จำนวน exchange
และคิวควรจะน้อยที่สุดเมื่อเทียบกับจำนวนเส้นทาง
ในบทความถัดไป เราจะเริ่มเข้าใจเพิ่มเติมเกี่ยวกับ Queues and Bindings
การอ้างอิง
ที่มา: will.com