Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π’ ΠΌΠΈΠ½Π°Π»ΠΎΡ‚ΠΎ статии Π Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΡ‡Π½ΠΈΡ‚Π΅ основи Π½Π° Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° ΠΏΠΎΡ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΏΡŠΡ‚ΠΈΡ‰Π°Ρ‚Π° Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ систСми Erlang/Elixir ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π² тях:

  • Заявка-ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€
  • Заявка-Chunked ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€
  • ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€ с заявка
  • ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅-подписванС
  • ΠžΠ±ΡŠΡ€Π½Π°Ρ‚ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅-подписванС
  • Π Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ

SOA, MSA ΠΈ ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ

SOA, MSA – систСмни Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ опрСдСлят ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° построяванС Π½Π° систСми, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ messaging прСдоставя ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΈ Π·Π° тяхната рСализация.

НС искам Π΄Π° ΠΏΡ€ΠΎΠΏΠ°Π³Π°Π½Π΄ΠΈΡ€Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π½Π° систСми. ΠŸΠΎΠ΄ΠΊΡ€Π΅ΠΏΡΠΌ ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅Ρ‚ΠΎ Π½Π° максимално Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΈ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ бизнСс. ΠšΠ°ΠΊΠ²Π°Ρ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° систСмни Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с ΠΎΠ³Π»Π΅Π΄ Π½Π° Unix Π½Π°Ρ‡ΠΈΠ½Π°: ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎΡΡ‚, отговарящи Π·Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΡΡŠΡ‰Π½ΠΎΡΡ‚ΠΈ. ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° API ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ максимално прости дСйствия със ΡΡŠΡ‰Π½ΠΎΡΡ‚ΠΈΡ‚Π΅.

Messaging β€’ ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ Π²ΠΈΠ΄Π½ΠΎ ΠΎΡ‚ ΠΈΠΌΠ΅Ρ‚ΠΎ β€’ Π΅ Π±Ρ€ΠΎΠΊΠ΅Ρ€ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° ΠΌΡƒ Ρ†Π΅Π» Π΅ Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈ отправя ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. Π’ΠΎΠΉ отговаря Π·Π° интСрфСйситС Π·Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° информация, Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° логичСски ΠΊΠ°Π½Π°Π»ΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° информация Π²ΡŠΡ‚Ρ€Π΅ Π² систСмата, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ балансиранС, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΎΡ‚ΠΊΠ°Π·ΠΈ Π½Π° систСмно Π½ΠΈΠ²ΠΎ.
Разработваният messaging Π½Π΅ сС ΠΎΠΏΠΈΡ‚Π²Π° Π΄Π° ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€Π° rabbitmq ΠΈΠ»ΠΈ Π΄Π° Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈ. ΠžΡΠ½ΠΎΠ²Π½ΠΈΡ‚Π΅ ΠΌΡƒ характСристики са:

  • РазпрСдСлСност.
    Π’ΠΎΡ‡ΠΊΠΈ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ създадСни Π½Π° всички възли Π² кластСра, максимално Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°.
  • ЛСснота.
    ΠžΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΎΡΡ‚ към ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° шаблонния ΠΊΠΎΠ΄ ΠΈ удобството Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅.
  • Най-Π΄ΠΎΠ±Ρ€Π° производитСлност.
    НС сС ΠΎΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ функционалността Π½Π° rabbitmq, Π° ΠΈΠ·Ρ‚ΡŠΠ½ΡΠ²Π°ΠΌΠ΅ само архитСктурния ΠΈ транспортния слой, ΠΊΠΎΠΉΡ‚ΠΎ максимално лСсно ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°ΠΌΠ΅ Π² OTP, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΉΠΊΠΈ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅.
  • Π“ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚.
    ВсСки сСрвис ΠΌΠΎΠΆΠ΅ Π΄Π° обСдинява мноТСство шаблони Π·Π° ΠΎΠ±ΠΌΠ΅Π½.
  • ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚, Π²Π½Π΅Π΄Ρ€Π΅Π½Π° Π² Π΄ΠΈΠ·Π°ΠΉΠ½Π°.
  • ΠœΠ°Ρ‰Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚.
    Messaging растС Π·Π°Π΅Π΄Π½ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π‘ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ, Ρ‚ΠΎΡ‡ΠΊΠΈΡ‚Π΅ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ изнСсСни Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ машини.

Π—Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° организацията Π½Π° ΠΊΠΎΠ΄Π°, Π·Π° слоТни систСми Π½Π° Erlang/Elixir ΠΌΠ΅Ρ‚Π°-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅ са подходящи. ЦСлият ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° сС Π½Π°ΠΌΠΈΡ€Π° Π² Π΅Π΄Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ - Π·ΠΎΠ½Ρ‚ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈ Ρ‚ΠΎΠ²Π° микросСрвиситС са максимално ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½ΠΈ ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ прости ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π½ΠΈ Π·Π° ΠΎΡ‚Π΄Π΅Π»Π½Π° ΡΡŠΡ‰Π½ΠΎΡΡ‚. ΠŸΡ€ΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅ лСсно Π΄Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° API Π½Π° цялата систСма, лСсно сС внасят ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΅ Π΄Π° сС ΠΏΠΈΡˆΠ°Ρ‚ ΡŽΠ½ΠΈΡ‚ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ тСстовС.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° систСмата взаимодСйстват Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π· Π±Ρ€ΠΎΠΊΠ΅Ρ€. ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° messaging, всСки сСрвис ΠΈΠΌΠ° няколко Ρ„Π°Π·ΠΈ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚:

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

ИзглСТда доста слоТно, Π½ΠΎ Π² ΠΊΠΎΠ΄Π° Π½Π΅ Π΅ всичко Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ с ΠΊΠΎΠ΄ ΠΈ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ прСдоставСни Π² Ρ€Π°Π·ΠΎΠ±ΠΎΡ€Π° Π½Π° шаблони ΠΏΠΎ-късно.

Exchanges

Π’ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ - процСс Π½Π° messaging, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‰ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° взаимодСйствиС с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° шаблона Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. Π’ всички ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, прСдставСни ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ взаимодСйстват Ρ‡Ρ€Π΅Π· Ρ‚ΠΎΡ‡ΠΊΠΈ Π·Π° ΠΎΠ±ΠΌΠ΅Π½, Ρ‡ΠΈΠ΅Ρ‚ΠΎ ΡΡŠΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° messaging.

Π¨Π°Π±Π»ΠΎΠ½ΠΈ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ (MEPs)

Π’ Π³Π»ΠΎΠ±Π°Π»Π΅Π½ ΠΌΠ°Ρ‰Π°Π± ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° двустранни ΠΈ Сдностранни. ΠŸΡŠΡ€Π²ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠΆΠ΄Π°Ρ‚ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎΡ‚ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π΅. ΠšΠ»Π°ΡΠΈΡ‡Π΅ΡΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° двустранСн шаблон Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрната Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π΅ ΡˆΠ°Π±Π»ΠΎΠ½ΡŠΡ‚ Request-response. НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ шаблона ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Request–response ΠΈΠ»ΠΈ RPC

RPC сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½ΠΈ Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ процСс. Π’ΠΎΠ·ΠΈ процСс ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС стартиран Π½Π° ΡΡŠΡ‰ΠΈΡ възСл ΠΈΠ»ΠΈ Π΄Π° сС Π½Π°ΠΌΠΈΡ€Π° Π½Π° Π΄Ρ€ΡƒΠ³ ΠΊΠΎΠ½Ρ‚ΠΈΠ½Π΅Π½Ρ‚. По-Π΄ΠΎΠ»Ρƒ Π΅ прСдставСна схСмата Π½Π° взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ Ρ‡Ρ€Π΅Π· messaging.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Въй ΠΊΠ°Ρ‚ΠΎ messaging Π΅ напълно асинхронСн, Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΠ±ΠΌΠ΅Π½ΡŠΡ‚ сС раздСля Π½Π° 2 Ρ„Π°Π·ΠΈ:

  1. Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° заявката

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

    ОбмСн β€’ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠΌΠ΅ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½
    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;
    _ -> %% Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ нСуспСх
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};

Заявка-Chunked ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€

НСобходимо Π΄Π° сС избягва ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. Π’Π°Π·ΠΈ характСристика ΠΎΠΊΠ°Π·Π²Π° влияниС Π½Π° отзивчивостта ΠΈ стабилността Π½Π° цялата систСма. Ако ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΡŠΡ‚ Π½Π° заявката Π·Π°Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΠ΅Ρ‚, раздСлянС Π½Π° части Π΅ Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎ.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π©Π΅ Π΄Π°ΠΌ няколко ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π·Π° Ρ‚Π°ΠΊΠΈΠ²Π° случаи:

  • ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ обмСнят Π±ΠΈΠ½Π°Ρ€Π½ΠΈ Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. РаздСлянСто Π½Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΈ части ΠΏΠΎΠΌΠ°Π³Π° Π·Π° Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с всякакъв Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ прСдотвратява ΠΏΡ€Π΅ΠΏΡŠΠ»Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°.
  • Листинги. НапримСр, трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ всички записи ΠΎΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

Наричам Ρ‚Π°ΠΊΠΈΠ²Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ "Π»ΠΎΠΊΠΎΠΌΠΎΡ‚ΠΈΠ²ΠΈ". Π’ΡŠΠ² всСки случай 1024 ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΏΠΎ 1 Мб са ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ ΠΎΡ‚ Π΅Π΄Π½ΠΎ СдинствСно ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с Ρ€Π°Π·ΠΌΠ΅Ρ€ 1 Π“Π±.

Π’ Erlang ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° ΠΏΠΎΠ»Π·Π° - намаляванС Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π½Π° ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Π²Π΅Π΄Π½Π°Π³Π° ΠΎΡ‚ΠΈΠ²Π°Ρ‚ ΠΏΡ€ΠΈ получатСля, заобикаляйки Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π½Π° ΠΎΠ±ΠΌΠ΅Π½Π°.

ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€ с заявка

Π’ΠΎΠ²Π° Π΅ доста рядка модификация Π½Π° шаблона RPC Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΈ систСми.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Publish-subscribe (Π΄ΡŠΡ€Π²ΠΎ Π·Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ)

БистСми, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈ към ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, доставят Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ готовност. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ систСмитС са ΠΏΠΎ-склонни към 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).

ОбмСн β€’ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½,
ΠšΠ»ΡŽΡ‡ β€’ ΠΊΠ»ΡŽΡ‡ Π·Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ
Π‘ΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ β€’ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Ρ‚ΠΎΠ²Π°Ρ€

ΠžΠ±ΡŠΡ€Π½Π°Ρ‚ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅-подписванС

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ Π½Π° pub-sub, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ шаблон, ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° рСгистриранС. ΠΠ°Π±ΠΎΡ€ΡŠΡ‚ ΠΎΡ‚ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС напълно Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½. На ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ случай с Π΅Π΄ΠΈΠ½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈ мноТСство ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ.

Π¨Π°Π±Π»ΠΎΠ½ Π·Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ

Π’ ΠΏΠΎΡ‡Ρ‚ΠΈ всСки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, ΠΊΠ°Ρ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ, доставка Π½Π° извСстия, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ външни систСми. ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ»ΠΈΠ²ΠΎΡΡ‚Ρ‚Π° Π½Π° систСмата, която ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Ρ‚Π΅Π·ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ, лСсно ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π°Π½Π° Ρ‡Ρ€Π΅Π· добавянС Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ. Всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½ΠΈ остава, Π΅ Π΄Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ ΠΈ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Π΄Π° разпрСдСлямС Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ тях.

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‰ΠΈΡ‚Π΅ ситуации Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° 3 ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ. ΠžΡ‰Π΅ Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅ сС появява Π²ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π·Π° справСдливостта Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ ΠΏΡ€Π΅Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈΡ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ. Π—Π° справСдливостта Ρ‰Π΅ отговаря Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ round-robin, Π° Π·Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ ΠΏΡ€Π΅Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈΡ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ, Ρ‰Π΅ въвСдСм ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ prefetch_limit. Π’ ΠΏΡ€Π΅Ρ…ΠΎΠ΄Π½ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΈ prefetch_limit Π½Π΅ позволява Π½Π° Π΅Π΄Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ всичкитС Π·Π°Π΄Π°Ρ‡ΠΈ.

Messaging управлява ΠΎΠΏΠ°ΡˆΠΊΠΈΡ‚Π΅ ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π°. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈΡ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈ тяхното ΠΏΠΎΡΡ‚ΡŠΠΏΠ²Π°Π½Π΅. Π˜Π·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ с ΠΎΡ‚ΠΊΠ°Π·:

  • messaging:ack(Tack) β€’ ΠΈΠ·Π²ΠΈΠΊΠ²Π° сС Π² случай Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ
  • messaging:nack(Tack) β€’ ΠΈΠ·Π²ΠΈΠΊΠ²Π° сС ΠΏΡ€ΠΈ всички ΠΈΠ·Π²ΡŠΠ½Ρ€Π΅Π΄Π½ΠΈ ситуации. Π‘Π»Π΅Π΄ Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° messaging Ρ‰Π΅ я ΠΏΡ€Π΅Π΄Π°Π΄Π΅ Π½Π° Π΄Ρ€ΡƒΠ³Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π°.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅

Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°ΡΡ‚ΡŠΠΏΠΈ слоТСн ΠΎΡ‚ΠΊΠ°Π·: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° 1 слСд ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΅ спаднала, Π±Π΅Π· Π΄Π° успСС Π΄Π° ΡΡŠΠΎΠ±Ρ‰ΠΈ Π½Π΅Ρ‰ΠΎ Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½. Π’ Ρ‚ΠΎΠ·ΠΈ случай Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ слСд ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° ack timeout Ρ‰Π΅ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π½Π° Π΄Ρ€ΡƒΠ³Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π°. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π° 3 ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΅ ΠΎΡ‚ΠΊΠ°Π·Π°Π»Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΈ Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠ»Π° nack, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΡΡŠΡ‰ΠΎ Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π»Π° Π½Π° Π΄Ρ€ΡƒΠ³Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π°, която я Π΅ изпълнила ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π΅Π½ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚

Π˜Π·ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ основнитС строитСлни Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ‚Π΅ систСми ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π±Π°Π·ΠΎΠ²ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° тяхното ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Erlang/Elixir.

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΉΠΊΠΈ основнитС шаблони, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ слоТни ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠΈ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‰ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° част Π½Π° Ρ†ΠΈΠΊΡŠΠ»Π° Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠ±Ρ‰ΠΈΡ‚Π΅ Π²ΡŠΠΏΡ€ΠΎΡΠΈ Π·Π° организацията Π½Π° услугитС, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡΡ‚Π° ΠΈ балансиранСто, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Ρ‰Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° практичСската страна Π½Π° мащабируСмостта ΠΈ устойчивостта Π½Π° систСмитС.

ΠšΡ€Π°ΠΉ Π½Π° Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° част.

Π‘Π½ΠΈΠΌΠΊΠ° ΠœΠ°Ρ€ΠΈΡƒΡ ΠšΡ€ΠΈΡΡ‚Π΅Π½ΡΠ΅Π½
Π˜Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ са ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° websequencediagrams.com

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster