แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

Exchange - จุดแลกเปลี่ยนหรือจุดแลกเปลี่ยน ข้อความถูกส่งถึงมัน Exchange กระจายข้อความ ในหนึ่งหรือหลายคิว เขา กำหนดเส้นทางข้อความไปยังคิว ตามลิงค์ที่สร้างขึ้น (bindings) ระหว่างคิวกับคิว

Exchange ไม่ใช่ กระบวนการเออร์แลง. ด้วยเหตุผลของความสามารถในการขยายขนาด exchange เป็นสตริง (ลิงก์ไปยังโมดูลที่มีโค้ดซึ่งมีตรรกะการกำหนดเส้นทาง) ในฐานข้อมูลแบบฝัง ความจำเสื่อม. ผู้แลกเปลี่ยน 1 รายจะใช้หน่วยความจำเพียง 1MB

สารบัญ

  • แรบบิทเอ็มคิว. ส่วนที่ 1 บทนำ Erlang, AMQP และ RPC
  • แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน
  • แรบบิทเอ็มคิว. ส่วนที่ 3 ทำความเข้าใจคิวและการโยง
  • แรบบิทเอ็มคิว. ส่วนที่ 4 การจัดการกับข้อความและเฟรมคืออะไร
  • แรบบิทเอ็มคิว. ส่วนที่ 5: การเผยแพร่และการใช้ประสิทธิภาพของข้อความ
  • แรบบิทเอ็มคิว. ส่วนที่ 6 ภาพรวมของโมดูลสหพันธ์และพลั่ว
  • แรบบิทเอ็มคิว. ตอนที่ 7 รายละเอียดเกี่ยวกับ Connection และ Chanel
  • แรบบิทเอ็มคิว. ส่วนที่ 8 RabbitMQ ใน. NET
  • แรบบิทเอ็มคิว. ส่วนที่ 9 การตรวจสอบ

แลกเปลี่ยนโดยตรง

Direct exchange - ใช้เมื่อจำเป็น ส่งข้อความไปยังคิวเฉพาะ. ข้อความจะถูกเผยแพร่ไปยังผู้แลกเปลี่ยนโดยระบุเฉพาะ รหัสเส้นทาง และเข้าสู่คิวทั้งหมดที่เกี่ยวข้องกับตัวแลกเปลี่ยนนี้ด้วยคีย์การกำหนดเส้นทางที่คล้ายกัน คีย์เส้นทางเป็นสตริง. การจับคู่เสร็จสิ้นโดยใช้ ตรวจสอบสตริงเพื่อความเท่าเทียมกัน.

การแสดงการไหลของข้อความแบบกราฟิก:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

В rabbitmq มีแนวคิดอยู่ การแลกเปลี่ยนเริ่มต้น. มัน direct exchange ไม่มีชื่อ. หากใช้ตัวแลกเปลี่ยนเริ่มต้น ข้อความจะถูกส่งไปยังคิวที่มีชื่อเท่ากับ คีย์การกำหนดเส้นทางข้อความ.

แลกเปลี่ยนหัวข้อ

Topic exchange - คล้ายกัน direct exchange เปิดใช้งานการกำหนดเส้นทางแบบเลือกโดยการเปรียบเทียบคีย์การกำหนดเส้นทาง แต่ในกรณีนี้จะมีการมอบกุญแจให้ ตามเทมเพลต. เมื่อสร้างเทมเพลตให้ใช้ 0 หรือคำอื่น ๆ อีกมากมาย (ตัวอักษร AZ и az และตัวเลข 0-9) คั่นด้วยจุด เช่นเดียวกับสัญลักษณ์ * и #.

  • * - สามารถแทนที่ได้อย่างแน่นอน 1 คำ
  • # - สามารถทดแทนได้ 0 หรือคำเพิ่มเติม

การแสดงการไหลของข้อความแบบกราฟิก:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

เริ่มจากรุ่น RabbitMQ 2.4.0 อัลกอริธึมการกำหนดเส้นทางสำหรับ topic exchange เริ่มทำงานจนกระทั่ง 145 เร็วขึ้นเท่าตัว พวกเขาบรรลุเป้าหมายนี้โดยการนำแนวทางดังกล่าวไปใช้ ลองใช้ซึ่งแสดงถึงการแสดงเทมเพลตเป็นโครงสร้างแบบต้นไม้ ยกตัวอย่างแม่แบบ a.b.c, a.*.b.c, a.#.c и b.b.c จะแสดงด้วยโครงสร้างดังต่อไปนี้:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

การจับคู่รูปแบบจะถูกค้นหาโดยเริ่มจากรากและไปจากบนลงล่าง

คุณสมบัติ:

  • การใช้เครื่องแลกเปลี่ยนนี้สามารถเป็นได้ ทางเลือกที่ดีสำหรับการพัฒนาแอพในอนาคต, เพราะ เทมเพลตสามารถปรับแต่งได้เสมอเพื่อให้ข้อความได้รับการเผยแพร่ในทำนองเดียวกัน direct exchange หรือ fanout exchange
  • แม่แบบที่ใช้ * เร็วกว่ามากกว่าเทมเพลตที่ใช้ #.
  • topic exchange ช้าลง direct exchange

การแลกเปลี่ยน Fanout

Fanout exchange - ข้อความทั้งหมดจะถูกส่งไปยังทุกคิว แม้ว่าจะมีการระบุรหัสเส้นทางไว้ในข้อความก็ตาม

คุณสมบัติ:

  • RabbitMQ ใช้ไม่ได้กับคีย์การกำหนดเส้นทางและเทมเพลต ซึ่งส่งผลดีต่อประสิทธิภาพการทำงาน นี่คือวิธีที่เร็วที่สุด exchange;
  • ผู้บริโภคทุกคนจะต้องสามารถประมวลผลข้อความทั้งหมดได้

การแสดงการไหลของข้อความแบบกราฟิก:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

การแลกเปลี่ยนส่วนหัว

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.

การแสดงการไหลของข้อความแบบกราฟิก:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

คุณสมบัติ:

  • ความยืดหยุ่นเพิ่มเติม
  • ค่าใช้จ่ายในการคำนวณเพิ่มเติม คู่ทั้งหมด (คีย์, ค่า) ของแอตทริบิวต์ headers ต้องเรียงลำดับตามชื่อคีย์ก่อนคำนวณค่าการกำหนดเส้นทางข้อความ ช้ากว่าการแลกเปลี่ยนประเภทอื่น.

การแลกเปลี่ยนแฮชที่สอดคล้องกัน

เครื่องแลกเปลี่ยนนี้คือ เสียบเข้าไป и ไม่ได้สร้างขึ้นใน в RabbitMQ.

Consistent-hashing exchange (แลกเปลี่ยนด้วยการแฮชที่สอดคล้องกัน) - ใช้เมื่อมีหลายคิวที่อาจผู้รับข้อความและเมื่อคุณต้องการสมดุลการโหลดระหว่างคิวเหล่านั้น ข้อความเชื่อมโยงกับคิวตามน้ำหนัก (ค่าสตริงแบบมีเงื่อนไขจาก 0 - n).

น้ำหนักคิวที่เท่ากัน - ระบุว่าแต่ละคิวจะได้รับ ประมาณจำนวนเดียวกัน ข้อความ (แต่ละข้อความจะถูกใส่ไว้ในคิวเดียวเท่านั้น) ไม่มีการรับประกันอย่างสมบูรณ์ถึงการกระจายข้อความที่สม่ำเสมอ.

การแสดงการไหลของข้อความแบบกราฟิก:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

Hash คำนวณตามคีย์เส้นทางหรือคุณสมบัติ headers ข้อความ หากข้อความที่เผยแพร่ทั้งหมดมีคีย์เส้นทางที่แตกต่างกันหรือ headersแล้วการกระจายตัวจะเกิดขึ้นตามน้ำหนัก มิฉะนั้นจะใช้รหัสเส้นทางหรือ headers.

ควรช่วยเมื่อปริมาณงานของผู้บริโภคจำเป็นต้องเติบโตสูงกว่าโซลูชันที่มีผู้บริโภคหลายรายใช้คิวเดียวกัน

การรวมกันของเครื่องแลกเปลี่ยน (E2E)

พฤติกรรมของผู้แลกเปลี่ยนทั้งหมดสามารถรวมกันได้โดยใช้การสื่อสาร แลกเปลี่ยนเพื่อแลกเปลี่ยน (การรวมกันของตัวแลกเปลี่ยนไม่รวมอยู่ในข้อกำหนด AMQP. นี่คือส่วนขยายโปรโตคอลจากด้านข้าง RabbitMQ).

การแสดงการไหลของข้อความแบบกราฟิก:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

ค่าใช้จ่ายของ E2E เราสามารถค้นหาการกำหนดค่าที่ปรับขนาดได้ที่เหมาะสมซึ่งตรงตามข้อกำหนดทั้งในปัจจุบันและที่กำลังเติบโต

สร้างการแลกเปลี่ยน

ตัวแลกเปลี่ยนถูกสร้างขึ้นโดยใช้ซิงโครนัส RPC ร้องขอไปยังเซิร์ฟเวอร์ การขอใช้เมธอด Exchange.Declareเรียกด้วยพารามิเตอร์:

  • ชื่อผู้แลกเปลี่ยน
  • ประเภทการแลกเปลี่ยน
  • ตัวเลือกอื่น

ตัวอย่างการสร้าง exchange โดย RabbitMQ.ไคลเอนต์:

//...
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 (เครื่องแลกเปลี่ยนทางเลือก). หากข้อความไม่สามารถผ่านเส้นทางเดิมได้ สามารถส่งไปยังการแลกเปลี่ยนอื่นเพื่อกำหนดเส้นทางไปตามเส้นทางอื่นได้

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

ถ้าสร้าง exchange บางทีจากนั้นเซิร์ฟเวอร์จะส่งไคลเอนต์แบบซิงโครนัส RPC ตอบ Exchange.DeclareOk. หากสร้างสรรค์ เป็นไปไม่ได้ (มีการปฏิเสธคำขอ Exchange.Declare) แล้ว ช่องจะปิด เซิร์ฟเวอร์โดยใช้คำสั่งอะซิงโครนัส Channel.Close และลูกค้าจะได้รับข้อยกเว้น การดำเนินการขัดจังหวะข้อยกเว้นซึ่งจะมีรหัสข้อผิดพลาดและคำอธิบาย

ต้องสร้างตัวแลกเปลี่ยนก่อนที่จะโพสต์ หากคุณเผยแพร่ข้อความไปยังผู้แลกเปลี่ยนที่ไม่มีอยู่จริง - RabbitMQ ลบมันออกอย่างเงียบ ๆ

สร้าง GUI การแลกเปลี่ยน

ไปที่แผงผู้ดูแลระบบ RabbitMQ ภายใต้ผู้ใช้ guest (ชื่อผู้ใช้: guest และรหัสผ่าน: guest). โปรดทราบว่าผู้ใช้ guest สามารถเชื่อมต่อจาก localhost เท่านั้น ตอนนี้ไปที่แท็บ Exchanges และคลิกที่ Add a new exchange. กรอกคุณสมบัติ:

แรบบิทเอ็มคิว. ส่วนที่ 2 ทำความเข้าใจการแลกเปลี่ยน

คุณสมบัติส่วนใหญ่ได้อธิบายไว้ข้างต้นแล้ว ที่นี่เราสังเกตว่าถ้าเราตั้งค่า Internalจากนั้นการแลกเปลี่ยนสามารถใช้ได้เฉพาะกับเท่านั้น E2E. Producer จะไม่สามารถส่งข้อความถึงการแลกเปลี่ยนดังกล่าวได้

ข้อสรุป

เมื่อพัฒนาระบบ จะสะดวกในการอธิบายโทโพโลยี การกำหนดเส้นทาง โดยใช้กราฟ แต่ก่อนที่คุณจะเริ่มสร้างกราฟ คุณควรเน้นเส้นทางที่มีการเข้าชมสูงก่อน เนื่องจาก พวกเขาต้องการ ปริมาณงานที่สูงขึ้น (ผลงาน). จากนั้น คุณสามารถจัดประเภทการรับส่งข้อมูลได้ แล้วจึงเริ่มสร้าง

หากในกราฟที่สร้างขึ้นมีอยู่จริง ชุดจำกัด ปุ่มกำหนดเส้นทางนั้นก็คุ้มค่าที่จะดูหลาย ๆ อัน fanout exchangeซึ่งเป็นอัตราส่วน 1:1 ที่เกี่ยวข้องกับคีย์การกำหนดเส้นทาง จำไว้ fanout exchange ที่เร็วที่สุด.

หากมีจำนวนเส้นทาง มีแนวโน้มที่จะไม่มีที่สิ้นสุดมันคุ้มค่าที่จะให้ความสนใจ topic exchange หรือหากไม่จำเป็นต้องใช้เทมเพลต คุณก็สามารถเลือกได้ direct exchnge, เพราะ เขาเร็วขึ้น topic exchange.

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

จำนวน exchange และคิวควรจะน้อยที่สุดเมื่อเทียบกับจำนวนเส้นทาง

ในบทความถัดไป เราจะเริ่มเข้าใจเพิ่มเติมเกี่ยวกับ Queues and Bindings

การอ้างอิง

ที่มา: will.com

เพิ่มความคิดเห็น