RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Exchange β€” ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π°. Π’ Π½Π΅Π³ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ сообщСния. Exchange распрСдСляСт сообщСниС Π² ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ. Он ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° основС созданных связСй (bindings) ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌ ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ.

Exchange Π½Π΅ являСтся Erlang-процСссом. Из сообраТСний ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ exchange β€” это строка (ссылка Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ, Π³Π΄Π΅ Π»Π΅ΠΆΠΈΡ‚ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ) Π²ΠΎ встроСнной Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… mnesia. 1 тысяч ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ всСго 1ΠœΠ‘ памяти.

ОглавлСниС

  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 1. Introduction. Erlang, AMQP ΠΈ RPC
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 3. РазбираСмся с Queues ΠΈ Bindings
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 4. РазбираСмся с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚Π°ΠΊΠΎΠ΅ сообщСния ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΡ‹
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 5. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ потрСблСния сообщСний
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 6. ΠžΠ±Π·ΠΎΡ€ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Federation ΠΈ Shovel
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 7. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΎ Connection ΠΈ Chanel
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 8. RabbitMQ Π² .NET
  • RabbitMQ. Π§Π°ΡΡ‚ΡŒ 9. ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³

Direct Exchange

Direct exchange β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сообщСниС Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ публикуСтся Π² ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π²ΠΎ всС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с этим ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠΎΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΠ»ΡŽΡ‡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” это строка. Поиск соотвСтствия происходит ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ строк Π½Π° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ.

ГрафичСскоС прСдставлСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщСний:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Π’ rabbitmq сущСствуСт понятиС ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ direct exchange Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ. Если примСняСтся ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡Ρƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сообщСния.

Topic Exchange

Topic exchange – Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ direct exchange Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ осущСствлСния Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚Π΅ΠΌ сравнСния ΠΊΠ»ΡŽΡ‡Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Но, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, ΠΊΠ»ΡŽΡ‡ задаСтся ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. ΠŸΡ€ΠΈ создании шаблона ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ 0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ слов (Π±ΡƒΠΊΠ²Ρ‹ AZ ΠΈ az ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ 0-9), Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ символы * ΠΈ #.

  • * β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° Ρ€ΠΎΠ²Π½ΠΎ 1 слово
  • # β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° 0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ слов

ГрафичСскоС прСдставлСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщСний:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Начиная с вСрсии RabbitMQ 2.4.0 Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для topic exchange стал Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄ΠΎ 145 Ρ€Π°Π· быстрСС. Π”ΠΎΠ±ΠΈΠ»ΠΈΡΡŒ ΠΎΠ½ΠΈ этого ΠΏΡƒΡ‚Π΅ΠΌ внСдрСния ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° trie implementation, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ прСдставлСниС шаблонов Π² Π²ΠΈΠ΄Π΅ структуры Π΄Π΅Ρ€Π΅Π²Π°. НапримСр ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ a.b.c, a.*.b.c, a.#.c ΠΈ b.b.c Π±ΡƒΠ΄ΡƒΡ‚ прСдставлСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ структурой:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Поиск соотвСтствия ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ осущСствляСтся, начиная с корня ΠΈ слСдуя свСрху Π²Π½ΠΈΠ·.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ:

  • ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этого ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ для Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ развития прилоТСния, Ρ‚.ΠΊ. ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ всСгда ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сообщСниС ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΎΡΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ direct exchange ΠΈΠ»ΠΈ fanout exchange
  • ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ * Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ #.
  • topic exchange ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ direct exchange

Fanout Exchange

Fanout exchange – всС сообщСния Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π²ΠΎ всС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΄Π°ΠΆΠ΅ Ссли Π² сообщСнии Π·Π°Π΄Π°Π½ ΠΊΠ»ΡŽΡ‡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ:

  • RabbitMQ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ шаблонами Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ самый быстрый exchange;
  • всС ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС сообщСния;

ГрафичСскоС прСдставлСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщСний:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Headers Exchange

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. РазбираСмся с Exchanges

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ:

  • Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ
  • Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° вычислСниС. ВсС ΠΏΠ°Ρ€Ρ‹ (ΠΊΠ»ΡŽΡ‡, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° headers Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»ΡŽΡ‡Π° ΠΏΠ΅Ρ€Π΅Π΄ вычислСниСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сообщСния. МСдлСннСС, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ exchange.

Consistent-Hashing Exchange

Π”Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ являСтся ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ ΠΈ Π½Π΅ встроСн Π² RabbitMQ.

Consistent-hashing exchange (exchange с согласованным Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ) – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ нСсколько ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ получатСлями сообщСния, ΠΈ ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠ±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Бвязь сообщСния с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ происходит ΠΏΠΎ вСсу (условноС строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 0 - n).

Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½Ρ‹ΠΉ вСс ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ – Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство сообщСний (ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ). Полной Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ распрСдСлСния сообщСний Π½Π΅Ρ‚.

ГрафичСскоС прСдставлСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщСний:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Hash вычисляСтся Π½Π° основС ΠΊΠ»ΡŽΡ‡Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ свойства headers сообщСния. Если всС ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌΡ‹Π΅ сообщСния ΠΈΠΌΠ΅Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ headers, Ρ‚ΠΎ распрСдСлСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ вСсу. Π˜Π½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ»ΡŽΡ‡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ headers.

Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠΎΠ³Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° пропускная ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ потрСбитСля нуТдаСтся Π² ростС Π±ΠΎΠ»Π΅Π΅ высоком Ρ‡Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с нСсколькими потрСбитСлями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠΎΠ² (E2E)

ПовСдСниС всСх ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ связи Exchange-to-Exchange (ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠΎΠ² Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ AMQP. Π­Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° со стороны RabbitMQ).

ГрафичСскоС прСдставлСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° сообщСний:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Π—Π° счСт E2E ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, которая ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ, Ρ‚Π°ΠΊ ΠΈ растущим трСбованиям.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Exchange

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊΠ° происходит ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ синхронного 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. РазбираСмся с Exchanges

Если созданиС exchange Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ сСрвСр ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ синхронный RPC ΠΎΡ‚Π²Π΅Ρ‚ Exchange.DeclareOk. Если созданиС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» ΠΎΡ‚ΠΊΠ°Π· ΠΏΠΎ запросу Exchange.Declare), Ρ‚ΠΎ ΠΊΠ°Π½Π°Π» закроСтся сСрвСром ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ асинхронной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Channel.Close ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ OperationInterruptedException, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ошибки ΠΈ Π΅Π΅ описаниС.

ОбмСнник Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ сообщСний. Если Π²Ρ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚Π΅ сообщСниС Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ β€” RabbitMQ Ρ‚ΠΈΡ…ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ Π΅Π³ΠΎ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Exchange Ρ‡Π΅Ρ€Π΅Π· графичСский интСрфСйс

Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² панСль администратора RabbitMQ ΠΏΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ guest (username: guest ΠΈ password: guest). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ guest ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с локального хоста. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Exchanges ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ Π½Π° Add a new exchange. ЗаполняСм свойства:

RabbitMQ. Π§Π°ΡΡ‚ΡŒ 2. РазбираСмся с Exchanges

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ свойств Π±Ρ‹Π»Π° описана Π²Ρ‹ΡˆΠ΅. Π—Π΄Π΅ΡΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π·Π°Π΄Π°Ρ‚ΡŒ Internal, Ρ‚ΠΎ ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для E2E. Producer Π½Π΅ смоТСт ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСния Π½Π° Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ систСмы ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡŽ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π³Ρ€Π°Ρ„Π°. Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Ρ€Π°Ρ„ стоит Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΠΈ с большим Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ, Ρ‚.ΠΊ. ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ (ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ). Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ. И ΡƒΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ.

Если Π² построСнном Π³Ρ€Π°Ρ„Π΅ сущСствуСт ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ мноТСтсво ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ, стоит ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² сторону Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… fanout exchange, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ 1:1 связаны с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Помним, Ρ‡Ρ‚ΠΎ fanout exchange самый быстрый.

Если число ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² стрСмится ΠΊ бСсконСчности, Ρ‚ΠΎ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° topic exchange ΠΈΠ»ΠΈ, Ссли шаблон Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ direct exchnge, Ρ‚.ΠΊ. ΠΎΠ½ быстрСС topic exchange.

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… exchange Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, которая ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ, Ρ‚Π°ΠΊ ΠΈ растущим трСбованиям систСмы.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ exchange ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ минимально ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с количСством ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ².

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π°Ρ‡Π½Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ с Queues ΠΈ Bindings.

Бсылки

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com