RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Exchange - солилцуур эсвэл солилцооны цэг. Түүн рүү мессеж илгээгддэг. Exchange мессежийг түгээдэг нэг буюу хэд хэдэн дараалалд. Тэр мессежийг дараалал руу чиглүүлдэг үүсгэсэн холбоос дээр үндэслэсэн (bindings) болон дарааллын хооронд.

Exchange биш Эрлангийн үйл явц. Өргөтгөсөн шалтгааны улмаас exchange суулгагдсан өгөгдлийн сан дахь мөр (чиглүүлэлтийн логик байгаа код бүхий модулийн холбоос) юм. мнези. 1 мянган солилцогч ердөө 1 МБ санах ой зарцуулна.

Агуулга

  • RabbitMQ. 1-р хэсэг. Оршил. Erlang, AMQP болон RPC
  • RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт
  • RabbitMQ. 3-р хэсэг. Дараалал ба холболтын тухай ойлголт
  • RabbitMQ. 4-р хэсэг. Мессеж, фрейм гэж юу болох талаар ярилцах
  • RabbitMQ. 5-р хэсэг: Зурвасыг хэвлэн нийтлэх, хэрэглэх
  • RabbitMQ. 6-р хэсэг. Холбооны болон хүрзний модулиудын тойм
  • RabbitMQ. 7-р хэсэг. Холболт ба Chanel-ийн талаарх дэлгэрэнгүй мэдээлэл
  • RabbitMQ. 8-р хэсэг. .NET дэх RabbitMQ
  • RabbitMQ. 9-р хэсэг. Хяналт

Шууд солилцоо

Direct exchange - шаардлагатай үед хэрэглэнэ тодорхой дараалалд мессеж хүргэх. Мессежийг солилцогчдод тодорхой зааж өгдөг чиглүүлэлтийн түлхүүр мөн ижил төстэй чиглүүлэлтийн түлхүүрээр энэ солилцогчтой холбоотой бүх дараалалд ордог. Чиглүүлэлтийн түлхүүр нь мөр юм. Тохируулгыг ашиглан хийдэг мөрүүдийг тэгш байдлыг шалгах.

Зурвасын урсгалын график дүрслэл:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

В rabbitmq гэсэн ойлголт байдаг анхдагч солилцогч. Энэ нь direct exchange Нэргүй. Хэрэв өгөгдмөл солилцогчийг ашигласан бол мессеж нь ижил нэртэй дараалал руу чиглэнэ мессежийг чиглүүлэх түлхүүр.

Сэдвийн солилцоо

Topic exchange - төстэй direct exchange чиглүүлэлтийн түлхүүрийг харьцуулах замаар сонгомол чиглүүлэлт хийх боломжийг олгодог. Гэхдээ энэ тохиолдолд түлхүүрийг өгнө загвараар. Загвар үүсгэхдээ ашиглана уу 0 эсвэл түүнээс олон үг (үсэг AZ и az болон тоонууд 0-9), цэгээр, түүнчлэн тэмдэгээр тусгаарлагдсан * и #.

  • * - яг сольж болно 1 үг
  • # -аар сольж болно 0 эсвэл илүү олон үг

Зурвасын урсгалын график дүрслэл:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Хувилбараас эхлэн RabbitMQ 2.4.0 чиглүүлэлтийн алгоритм topic exchange хүртэл ажиллаж эхэлсэн 145 дахин хурдан. Тэд хандлагыг хэрэгжүүлснээр ийм амжилтанд хүрсэн хэрэгжүүлэхийг хичээ, энэ нь загваруудыг модны бүтэц болгон төлөөлдөг гэсэн үг юм. Жишээ нь загварууд a.b.c, a.*.b.c, a.#.c и b.b.c дараах бүтцээр төлөөлүүлнэ.

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Загвар тохирохыг эхээс нь эхлээд дээрээс доош нь хайна.

Онцлог:

  • Энэ солилцогчийг ашиглах нь болно ирээдүйн програм хөгжүүлэх сайн сонголт, учир нь Загваруудыг үргэлж өөрчлөх боломжтой бөгөөд мессежийг ижил төстэй байдлаар нийтлэх боломжтой direct exchange буюу fanout exchange
  • ашигладаг загварууд * хамаагүй хурданашигладаг загваруудаас илүү #.
  • topic exchange удаан direct exchange

Fanout Exchange

Fanout exchange - бүх мессежийг бүх дараалалд хүргэдэг зурваст чиглүүлэлтийн түлхүүр заасан байсан ч гэсэн.

Онцлог:

  • RabbitMQ чиглүүлэлтийн түлхүүрүүд болон загваруудтай ажиллахгүй гүйцэтгэлд эерэг нөлөө үзүүлдэг. Энэ бол хамгийн хурдан exchange;
  • бүх хэрэглэгчид бүх мессежийг боловсруулах чадвартай байх ёстой;

Зурвасын урсгалын график дүрслэл:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Толгойн солилцоо

Headers exchange - хос (түлхүүр, утга) шинж чанаруудын харьцуулалт дээр үндэслэн мессежийг холбогдох дараалалд чиглүүлдэг. headers холбох ба ижил төстэй мессежийн шинж чанар. headers нь Dictionary<ключ, значение>.

Хэрэв та толь бичигт тусгай түлхүүр нэмбэл x-match үнэ цэнэтэй any, дараа нь хосууд (түлхүүр, утга) хэсэгчлэн таарч байвал мессежийг чиглүүлнэ. Энэ зан үйл нь оператортой төстэй or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Өгөгдмөл түлхүүр x-match утгыг агуулдаг all. Энэ нь хосууд (түлхүүр, утга) бүрэн тохирох үед мессежийг чиглүүлдэг гэсэн үг юм. Энэ зан үйл нь оператортой төстэй and.

Зурвасын урсгалын график дүрслэл:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Онцлог:

  • нэмэлт уян хатан байдал
  • тооцооны нэмэлт зардал. Атрибутын бүх хос (түлхүүр, утга). headers зурвасын чиглүүлэлтийн утгыг тооцоолохын өмнө түлхүүр нэрээр нь эрэмбэлсэн байх ёстой. Бусад төрлийн солилцооноос удаан.

Тогтвортой Hashing солилцоо

Энэ солилцогч нь залгах и суулгаагүй в RabbitMQ.

Consistent-hashing exchange (хэш тууштай солилцоо) - мессеж хүлээн авах боломжит олон дараалал байгаа үед болон тэдгээрийн хооронд тэнцвэрийг ачаалах шаардлагатай үед ашиглагддаг. Мессеж нь жингээр нь дараалалтай холбоотой (нөхцөлт мөрийн утга 0 - n).

Дарааллын эквивалент жин - дараалал бүрийг хүлээн авахыг заана ойролцоогоор ижил хэмжээний мессеж (мессеж бүрийг зөвхөн нэг дараалалд оруулах болно). Мессежийг жигд тараах бүрэн баталгаа байхгүй.

Зурвасын урсгалын график дүрслэл:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Hash чиглүүлэлтийн түлхүүр эсвэл өмч дээр үндэслэн тооцоолно headers зурвасууд. Хэрэв нийтлэгдсэн бүх мессежүүд өөр өөр чиглүүлэлтийн түлхүүртэй байсан бол, эсвэл headers, дараа нь хуваарилалт жингээр явагдана. Үгүй бол чиглүүлэлтийн түлхүүрийг ашиглах болно, эсвэл headers.

Хэрэглэгчийн дамжуулах чадвар нь нэг дараалал ашиглаж байгаа олон хэрэглэгчтэй шийдлээс өндөр өсөх шаардлагатай үед туслах ёстой.

Солигчуудын хослол (E2E)

Бүх солилцооны зан үйлийг харилцаа холбоо ашиглан нэгтгэж болно Exchange-to-Exchange (шилжүүлэгчийн хослолыг техникийн үзүүлэлтэд оруулаагүй болно AMQP. Энэ нь протоколын хажуугийн өргөтгөл юм RabbitMQ).

Зурвасын урсгалын график дүрслэл:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Ийн зардлаар E2E Бид одоогийн болон өсөн нэмэгдэж буй шаардлагын аль алинд нь тохирсон зөв өргөтгөх боломжтой тохиргоог олж чадна.

Бирж үүсгэх

Солигчийг синхрон ашиглан бүтээдэг RPC серверт хүсэлт гаргах. Хүсэлтийг аргыг ашиглан хийдэг Exchange.Declareпараметрүүдээр дуудагдсан:

  • солилцооны нэр
  • солилцуурын төрөл
  • бусад сонголтууд

Бүтээлийн жишээ exchange тусламжтайгаар RabbitMQ.Client:

//...
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 (өөр солилцогч). Хэрэв мессеж нь анхны маршрутаар дамжих боломжгүй бол түүнийг өөр замаар дамжуулахын тулд өөр солилцоо руу илгээж болно.

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Хэрэв бүтээл бол exchange магадгүй, дараа нь сервер үйлчлүүлэгч рүү синхрон илгээх болно RPC хариулт Exchange.DeclareOk. Хэрэв бүтээл бол боломжгүй юм (хүсэлтээс татгалзсан Exchange.Declare), дараа нь суваг хаагдах болно асинхрон команд ашиглан сервер Channel.Close мөн үйлчлүүлэгч онцгой тохиолдол авах болно OperationInterruptedException, алдааны код болон түүний тайлбарыг агуулсан болно.

Нийтлэхээс өмнө солилцогчийг бий болгох ёстой. Хэрэв та байхгүй солилцогч руу мессеж нийтэлвэл - RabbitMQ чимээгүйхэн арилга.

Exchange GUI үүсгэх

Админ самбар руу очно уу RabbitMQ хэрэглэгчийн доор guest (хэрэглэгчийн нэр: guest болон нууц үг: guest). Хэрэглэгч гэдгийг анхаарна уу guest зөвхөн localhost-оос холбогдох боломжтой. Одоо таб руу орцгооё Exchanges болон дээр дарна уу Add a new exchange. шинж чанаруудыг бөглөнө үү:

RabbitMQ. 2-р хэсэг. Солилцооны тухай ойлголт

Ихэнх үл хөдлөх хөрөнгийг дээр дурдсан болно. Энд бид тогтоосон бол гэдгийг анхаарна уу Internal, дараа нь солилцоог зөвхөн ашиглаж болно E2E. Producer ийм солилцоо руу мессеж илгээх боломжгүй болно.

дүгнэлт

Системийг боловсруулахдаа топологийг тайлбарлах нь тохиромжтой чиглүүлэлт график ашиглан. Гэхдээ график зурж эхлэхээсээ өмнө ачаалал ихтэй замыг тодруулах нь зүйтэй. тэд шаарддаг илүү өндөр дамжуулах чадвар (гүйцэтгэл). Дараа нь та замын хөдөлгөөнийг ангилж болно. Тэгээд барьж эхэлнэ.

Хэрэв баригдсан графикт байгаа бол хязгаарлагдмал олонлог чиглүүлэлтийн түлхүүрүүд, дараа нь, энэ нь хэд хэдэн хайх нь зүйтэй юм fanout exchange, тэдгээр нь чиглүүлэлтийн түлхүүртэй холбоотой 1:1 байна. Гэдгийг санах fanout exchange хамгийн хурдан.

Хэрэв маршрутын тоо хязгааргүй рүү тэмүүлдэг, үүнд анхаарлаа хандуулах нь зүйтэй topic exchange эсвэл загвар шаардлагагүй бол та сонгож болно direct exchnge, учир нь тэр илүү хурдан topic exchange.

Төрөл бүрийн хослолууд exchange зөвийг олоход тань туслах ёстой. өргөтгөх боломжтой тохиргоо, энэ нь одоогийн болон өсөн нэмэгдэж буй системийн шаардлагуудыг хангадаг.

Тоо exchange болон дараалал нь маршрутын тоотой харьцуулахад хамгийн бага байх ёстой.

Дараагийн өгүүллээр бид дараалал ба холболтын талаар илүү ихийг ойлгож эхлэх болно.

лавлагаа

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх