Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ тСорСтичСскиС основы Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, путях Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Erlang/Elixir систСм ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями Π² Π½ΠΈΡ…:

  • Request-response
  • Request-Chunked Response
  • Response with Request
  • Publish-subscribe
  • Inverted Publish-subscribe
  • Task distribution

SOA, MSA ΠΈ ΠΎΠ±ΠΌΠ΅Π½ сообщСниями

SOA, MSA – систСмныС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° построСния систСм, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ messaging прСдоставляСт ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ для ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π― Π½Π΅ Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€ΠΎΠΏΠ°Π³Π°Π½Π΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ построСния систСм. Π― Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ максимально эффСктивных ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ бизнСса ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ. ΠšΠ°ΠΊΡƒΡŽ Π±Ρ‹ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ ΠΌΡ‹ Π½ΠΈ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ систСмныС Π±Π»ΠΎΠΊΠΈ Π»ΡƒΡ‡ΡˆΠ΅ с оглядкой Π½Π° Unix-way: ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с минимальной ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ сущности. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ API Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ максимально простыС дСйствия с сущностями.

Messaging β€’ ΠΊΠ°ΠΊ понятно ΠΈΠ· названия β€’ Π±Ρ€ΠΎΠΊΠ΅Ρ€ сообщСний. Π•Π³ΠΎ основная Ρ†Π΅Π»ΡŒ β€’ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ сообщСния. Он ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° интСрфСйсы ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ логичСских ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ систСмы, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ балансировку, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΡ‚ΠΊΠ°Π·ΠΎΠ² Π½Π° систСмном ΡƒΡ€ΠΎΠ²Π½Π΅.
Π Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ messaging Π½Π΅ пытаСтся ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с rabbitmq ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ. Π•Π³ΠΎ основныС Ρ‡Π΅Ρ€Ρ‚Ρ‹:

  • Π Π°ΡΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ.
    Π’ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π° всСх ΡƒΠ·Π»Π°Ρ… кластСра, максимально Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ ΠΊΠΎΠ΄Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΈΡ….
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°.
    ΠΠ°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ шаблонного ΠΊΠΎΠ΄Π° ΠΈ удобство использования.
  • Π›ΡƒΡ‡ΡˆΠ°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
    ΠœΡ‹ Π½Π΅ пытаСмся ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» rabbitmq, Π° выдСляСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΈ транспортный слой, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ максимально просто вписываСм Π² OTP, минимизируя ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ.
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ.
    ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π² сСбС мноТСство шаблонов ΠΎΠ±ΠΌΠ΅Π½Π°.
  • ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ, залоТСнная Π² Π΄ΠΈΠ·Π°ΠΉΠ½Π΅.
  • ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ.
    Messaging растСт вмСстС с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. По ΠΌΠ΅Ρ€Π΅ увСличСния Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, для слоТных систСм Π½Π° Erlang/Elixir Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят ΠΌΠ΅Ρ‚Π°-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° находится Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ β€’ Π·ΠΎΠ½Ρ‚ΠΈΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. ΠŸΡ€ΠΈ этом микросСрвисы максимально ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ простыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ API всСй систСмы, просто Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния, ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡŽΠ½ΠΈΡ‚ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ систСмы Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ»ΠΈ ΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°. Π‘ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ messaging, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹Ρ… Ρ„Π°Π·:

  • Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ сСрвиса.
    На Π΄Π°Π½Π½ΠΎΠΌ этапС происходит конфигурация ΠΈ запуск ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎ сСрвис процСсса ΠΈ зависимостСй.
  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°.
    БСрвис ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΎΠ±ΠΌΠ΅Π½Π°, Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡƒΠ·Π»Π°, Π»ΠΈΠ±ΠΎ ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° динамичСски.
  • РСгистрация сСрвиса.
    Π§Ρ‚ΠΎΠ±Ρ‹ сСрвис ΠΌΠΎΠ³ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ запросы, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π°.
  • ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.
    БСрвис ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.
  • Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹.
    Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ 2 Π²ΠΈΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΡˆΡ‚Π°Ρ‚Π½ΠΎΠ΅ ΠΈ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅. ΠŸΡ€ΠΈ ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΌ сСрвис ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈ останавливаСтся. Π’ Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹Ρ… случаях messaging выполняСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ· сцСнариСв ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚ΠΊΠ°Π·ΠΎΠ².

Выглядит довольно слоТно, Π½ΠΎ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ всС Ρ‚Π°ΠΊ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° с коммСнтариями Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ€Π°Π·Π±ΠΎΡ€Π΅ шаблонов Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

Exchanges

Π’ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° β€’ процСсс messaging, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π»ΠΎΠ³ΠΈΠΊΡƒ взаимодСйствия с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… шаблона ΠΎΠ±ΠΌΠ΅Π½Π° сообщСниями. Π’ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, прСдставлСнных Π½ΠΈΠΆΠ΅, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°, комбинация ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ messaging.

Message exchange patterns (MEPs)

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° двусторонниС ΠΈ односторонниС. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅Π΅ сообщСниС, Π²Ρ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Ρ‚. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ двустороннСго шаблона Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ являСтся Request-response шаблон. Рассмотрим шаблон ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Request–response ΠΈΠ»ΠΈ RPC

RPC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса. Π­Ρ‚ΠΎΡ‚ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ΡƒΠ·Π»Π΅ ΠΈΠ»ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠ½Ρ‚ΠΈΠ½Π΅Π½Ρ‚Π΅. НиТС прСдставлСна схСма взаимодСйствия ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра Ρ‡Π΅Ρ€Π΅Π· messaging.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ messaging ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ асинхронный, Ρ‚ΠΎ для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΠ±ΠΌΠ΅Π½ дСлится Π½Π° 2 Ρ„Π°Π·Ρ‹:

  1. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° запроса

    messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).

    Exchange β€’ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°
    ResponseMatchingTag β€’ локальная ΠΌΠ΅Ρ‚ΠΊΠ° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°. НапримСр Π² случаС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… запросов, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ.
    RequestDefinition β€’ Ρ‚Π΅Π»ΠΎ запроса
    HandlerProcess β€’ PID ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π­Ρ‚ΠΎΠΌΡƒ процСссу ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСра.

  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚Π°

    handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)

    ResponsePayload β€’ ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра.

Для сСрвСра процСсс Ρ‚Π°ΠΊΠΆΠ΅ состоит ΠΈΠ· 2 Ρ„Π°Π·:

  1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°
  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΡ… запросов

ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ шаблон. Допустим, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ простой сСрвис, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ СдинствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Код сСрвСра

ВынСсСм ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ API сСрвиса Π² api.hrl:

%% =====================================================
%%  entities
%% =====================================================
-record(time, {
  unixtime :: non_neg_integer(),
  datetime :: binary()
}).

-record(time_error, {
  code :: non_neg_integer(),
  error :: term()
}).

%% =====================================================
%%  methods
%% =====================================================
-record(time_req, {
  opts :: term()
}).
-record(time_resp, {
  result :: #time{} | #time_error{}
}).

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ сСрвиса Π² time_controller.erl

%% Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄. Вставив Π΅Π³ΠΎ Π² шаблон gen_server ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ сСрвис.

%% инициализация gen_server
init(Args) ->
  %% ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π°
  messaging:monitor_exchange(req_resp, ?EXCHANGE, default, self())
  {ok, #{}}.

%% ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° события ΠΏΠΎΡ‚Π΅Ρ€ΠΈ связи с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½Π°. Π­Ρ‚ΠΎ ΠΆΠ΅ событиС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ.
handle_info(#exchange_die{exchange = ?EXCHANGE}, State) ->
  erlang:send(self(), monitor_exchange),
  {noreply, State};

%% ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° API
handle_info(#time_req{opts = _Opts}, State) ->
  messaging:response_once(Client, #time_resp{
result = #time{ unixtime = time_utils:unixtime(now()), datetime = time_utils:iso8601_fmt(now())}
  });
  {noreply, State};

%% Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ gen_server
terminate(_Reason, _State) ->
  messaging:demonitor_exchange(req_resp, ?EXCHANGE, default, self()),
  ok.

Код ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос сСрвису, Π² любом мСстС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ messaging request API:

case messaging:request(?EXCHANGE, tag, #time_req{opts = #{}}, self()) of
    ok -> ok;
    _ -> %% repeat or fail logic
end

Π’ распрСдСлСнной систСмС конфигурация ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ самой Ρ€Π°Π·Π½ΠΎΠΉ ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ запроса messaging ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ сСрвиса Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ запрос. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ messaging ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ случай ΠΎΡ‚ΠΊΠ°Π·Π°.
ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΎΡ‚ сСрвиса ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈΠ»ΠΈ ошибка.
ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΎΠ±Π° случая Π² handle_info:

handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time{unixtime = Utime}}}, State) ->
  ?debugVal(Utime),
  {noreply, State};

handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time_error{code = ErrorCode}}}, State) ->
  ?debugVal({error, ErrorCode}),
  {noreply, State};

Request-Chunked Response

Π›ΡƒΡ‡ΡˆΠ΅ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… сообщСний. ΠžΡ‚ этого зависит ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° всСй систСмы. Если ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° запрос Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ памяти, Ρ‚ΠΎ Ρ€Π°Π·Π±ΠΈΠ²ΠΊΠ° Π½Π° части являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΠ°Ρ€Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… случаСв:

  • ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π Π°Π·Π±ΠΈΠ²ΠΊΠ° ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° нСбольшиС части ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ любого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Π½Π΅ Π»ΠΎΠ²ΠΈΡ‚ΡŒ пСрСполнСния памяти.
  • Листинги. НапримСр, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС записи ΠΈΠ· ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ.

Π― Π½Π°Π·Ρ‹Π²Π°ΡŽ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΏΠ°Ρ€ΠΎΠ²ΠΎΠ·ΠΎΠΌ. Π’ любом случаС,1024 сообщСний ΠΏΠΎ 1 Мб Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ СдинствСнноС сообщСниС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 1 Π“Π±.

Π’ Erlang кластСрС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ β€’ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈ ΡΠ΅Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ сразу Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ, минуя Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΎΠ±ΠΌΠ΅Π½Π°.

Response with Request

Π­Ρ‚ΠΎ довольно рСдкая модификация ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° RPC для построСния Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… систСм.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Publish-subscribe (data distribution tree)

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉΠ½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ систСмы ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ готовности Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΡ… потрСбитСлям. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, систСмы Π±ΠΎΠ»Π΅Π΅ склонны ΠΊ push-ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρ‡Π΅ΠΌ ΠΊ pull ΠΈΠ»ΠΈ poll. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ позволяСт Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²ΠΏΡƒΡΡ‚ΡƒΡŽ рСсурсы, постоянно Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ ΠΈ оТидая Π΄Π°Π½Π½Ρ‹Π΅.
На рисункС прСдставлСн процСсс распространСния сообщСния ΠΊ потрСбитСлям, подписанным Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ использования этого шаблона являСтся распространСниС состояния: ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π° Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΈΠ³Ρ€Π°Ρ…, Ρ€Ρ‹Π½ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π±ΠΈΡ€ΠΆΠ°Ρ…, ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Π΄Π°Ρ‚Π°Ρ„ΠΈΠ΄Π°Ρ….

Рассмотрим ΠΊΠΎΠ΄ подписчика:

init(_Args) ->
  %% подписываСмся Π½Π° ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ, ΠΊΠ»ΡŽΡ‡ = key
  messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
  {ok, #{}}.

handle_info(#exchange_die{exchange = ?SUBSCRIPTION}, State) ->
  %% Ссли Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° нСдоступна, Ρ‚ΠΎ пытаСмся ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ
  messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
  {noreply, State};

%% ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠ΅ сообщСния
handle_info(#'$msg'{exchange = ?SUBSCRIPTION, message = Msg}, State) ->
  ?debugVal(Msg),
  {noreply, State};

%% ΠΏΡ€ΠΈ остановкС потрСбитСля - ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°
terminate(_Reason, _State) ->
  messaging:unsubscribe(?SUBSCRIPTION, key, tag, self()),
  ok.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ сообщСния Π² любом ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ мСстС :

messaging:publish_message(Exchange, Key, Message).

Exchange β€’ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΠΌΠ΅Π½Π°,
Key β€’ ΠΊΠ»ΡŽΡ‡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ
Message β€’ полСзная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

Inverted Publish-subscribe

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π Π°Π·Π²Π΅Ρ€Π½ΡƒΠ² pub-sub, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ для логирования. Набор источников ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ. На рисункС прСдставлСн случай с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΈ мноТСством источников.

Task distribution pattern

ΠŸΠΎΡ‡Ρ‚ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², доставка ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· сторонних систСм. ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ систСмы, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉ эти Π·Π°Π΄Π°Ρ‡ΠΈ, Π»Π΅Π³ΠΊΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ добавлСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Всё, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ остаСтся, β€’ это ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ кластСр ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ.

Рассмотрим Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ситуации Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 3 ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π•Ρ‰Π΅ Π½Π° этапС распрСдСлСния Π·Π°Π΄Π°Ρ‡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос справСдливости распрСдСлСния ΠΈ пСрСполнСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π—Π° ΡΠΏΡ€Π°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ round-robin распрСдСлСниС, Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ ситуации пСрСполнСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π²Π²Π΅Π΄Π΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ prefetch_limit. Π’ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… prefetch_limit Π½Π΅ даст ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС Π·Π°Π΄Π°Ρ‡ΠΈ.

Messaging управляСт очСрСдями ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… поступлСния. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΆΠ΅ ΠΎΡ‚ΠΊΠ°Π·ΠΎΠΌ:

  • messaging:ack(Tack) β€’ вызываСтся Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния
  • messaging:nack(Tack) β€’ вызываСтся Π²ΠΎ всСх Π½Π΅ΡˆΡ‚Π°Ρ‚Π½Ρ‹Ρ… ситуациях. ПослС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π°Π΄Π°Ρ‡ΠΈ messaging пСрСдаст Π΅Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ‚Ρ€Π΅Ρ… Π·Π°Π΄Π°Ρ‡ случился слоТный ΠΎΡ‚ΠΊΠ°Π·: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ 1 послС получСния Π·Π°Π΄Π°Ρ‡ΠΈ ΡƒΠΏΠ°Π», Π½Π΅ успСв ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π°. Π’ этом случаС Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠ±ΠΌΠ΅Π½Π° послС истСчСния ack timeout пСрСдаст Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ 3 ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ отказался ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» nack, Π² ΠΈΡ‚ΠΎΠ³Π΅ Π·Π°Π΄Π°Ρ‡Π° Ρ‚ΠΎΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΡˆΠ»Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ».

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΡ‚ΠΎΠ³

ΠœΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ основныС ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊΠΈ распрСдСлСнных систСм ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΡ… примСнСния Π² Erlang/Elixir.

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ слоТныС ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ части Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ рассмотрим ΠΎΠ±Ρ‰ΠΈΠ΅ вопросы ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвисов, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ балансировки, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ практичСской сторонС ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ ΠΈ отказоустойчивости систСм.

ΠšΠΎΠ½Π΅Ρ† Π²Ρ‚ΠΎΡ€ΠΎΠΉ части.

Π€ΠΎΡ‚ΠΎ Marius Christensen
Π˜Π»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ websequencediagrams.com

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ