Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

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

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

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

SOA, MSA са систСмни Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ опрСдСлят ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° систСми, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° прСдоставят ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΈ Π·Π° тяхното внСдряванС.

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

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

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

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

БистСмнитС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ си взаимодСйстват Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π· Π±Ρ€ΠΎΠΊΠ΅Ρ€. ΠžΡ‚ позицията Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° всяка услуга ΠΈΠΌΠ° няколко ΠΆΠΈΠ·Π½Π΅Π½ΠΈ Ρ„Π°Π·ΠΈ:

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

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

ΠžΠ±ΠΌΠ΅Π½ΡŠΡ‚

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

МодСли Π½Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ (Π•ΠŸ)

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

Заявка-ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΈΠ»ΠΈ RPC

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

Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

Въй ΠΊΠ°Ρ‚ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° са напълно асинхронни, ΠΎΠ±ΠΌΠ΅Π½ΡŠΡ‚ Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ Π½Π° 2 Ρ„Π°Π·ΠΈ:

  1. ΠŸΠΎΠ΄Π°ΠΉΡ‚Π΅ заявка

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

    ΠΎΠ±ΠΌΠ΅Π½ β€’ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠΌΠ΅ Π½Π° ΠΎΠ±ΠΌΠ΅Π½Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°
    ResponseMatchingTag β€’ Π»ΠΎΠΊΠ°Π»Π΅Π½ Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π°. НапримСр, Π² случай Π½Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° няколко ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ заявки, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ.
    ДСфиниция Π½Π° заявка β€’ тяло Π½Π° заявката
    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.

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

Π—Π° Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΡ‚Π΅ заявка Π΄ΠΎ услуга, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°Ρ‚Π΅ API Π·Π° заявка Π·Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ навсякъдС Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

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

Π’ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма конфигурацията Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° заявката ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° ΠΌΠΎΠΆΠ΅ всС ΠΎΡ‰Π΅ Π΄Π° Π½Π΅ са Π·Π°ΠΏΠΎΡ‡Π½Π°Π»ΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΡŠΡ‚ Π½Π° услугата няма Π΄Π° Π΅ Π³ΠΎΡ‚ΠΎΠ² Π΄Π° обслуТи заявката. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, трябва Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° ΠΈ Π΄Π° сС справим с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.
Π‘Π»Π΅Π΄ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π΄ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, услугата Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΈΠ»ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ°.
НСка сС справим ΠΈ с Π΄Π²Π°Ρ‚Π° случая Π² 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};

Разкъсан ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° заявка

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

Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

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

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

Аз Π½Π°Ρ€ΠΈΡ‡Π°ΠΌ Ρ‚Π°ΠΊΠΈΠ²Π° Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π»ΠΎΠΊΠΎΠΌΠΎΡ‚ΠΈΠ². Π’ΡŠΠ² всСки случай 1024 ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΎΡ‚ 1MB са ΠΏΠΎ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΎΡ‚ Π΅Π΄Π½ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 1GB.

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

ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€ с исканС

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

Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅-Π°Π±ΠΎΠ½ΠΈΡ€Π°Π½Π΅ (Π΄ΡŠΡ€Π²ΠΎ Π·Π° разпространСниС Π½Π° Π΄Π°Π½Π½ΠΈ)

БистСмитС, управлявани ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, доставят Π΄Π°Π½Π½ΠΈ Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π²Π΅Π΄Π½Π°Π³Π° Ρ‰ΠΎΠΌ са Π³ΠΎΡ‚ΠΎΠ²ΠΈ. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ систСмитС са ΠΏΠΎ-склонни към ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° натисканС, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ към ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° изтСглянС ΠΈΠ»ΠΈ Π°Π½ΠΊΠ΅Ρ‚Π°. Π’Π°Π·ΠΈ функция Π²ΠΈ позволява Π΄Π° Π½Π΅ Π³ΡƒΠ±ΠΈΡ‚Π΅ рСсурси, ΠΊΠ°Ρ‚ΠΎ постоянно изискватС ΠΈ Ρ‡Π°ΠΊΠ°Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ.
Π€ΠΈΠ³ΡƒΡ€Π°Ρ‚Π° ΠΏΠΎΠΊΠ°Π·Π²Π° процСса Π½Π° разпространСниС Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅, Π°Π±ΠΎΠ½ΠΈΡ€Π°Π½ΠΈ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ‚Π΅ΠΌΠ°.

Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

ΠšΠ»Π°ΡΠΈΡ‡Π΅ΡΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠ΄Π΅Π» са Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ: свСта Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π° Π² ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π½ΠΈΡ‚Π΅ ΠΈΠ³Ρ€ΠΈ, ΠΏΠ°Π·Π°Ρ€Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° борси, ΠΏΠΎΠ»Π΅Π·Π½Π° информация Π² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ.

ΠŸΠΎΠΌΠΈΡΠ»Π΅Ρ‚Π΅ Π·Π° абонатния ΠΊΠΎΠ΄:

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:ack(Tack) β€’ ΠΈΠ·Π²ΠΈΠΊΠ²Π° сС ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ
  • messaging:nack(Tack) β€’ Π²ΠΈΠΊΠ°Π½ΠΈ ΠΏΡ€ΠΈ всички спСшни ситуации. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° сС Π²ΡŠΡ€Π½Π΅, ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° Ρ‰Π΅ я ΠΏΡ€Π΅Π΄Π°Π΄Π°Ρ‚ Π½Π° Π΄Ρ€ΡƒΠ³ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€.

Π“Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ прилоТСния. ΠŸΡŠΡ€Π²ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄

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

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ€Π΅Π·ΡŽΠΌΠ΅

НиС Ρ€Π°Π·Π±ΠΈΡ…ΠΌΠ΅ основнитС Π³Ρ€Π°Π΄ΠΈΠ²Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ‚Π΅ систСми ΠΈ ΠΏΡ€ΠΈΠ΄ΠΎΠ±ΠΈΡ…ΠΌΠ΅ основно Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° тяхното ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² Erlang/Elixir.

Π§Ρ€Π΅Π· ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° основни шаблони ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΈ слоТни ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠΈ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‰ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

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

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

Π€ΠΎΡ‚ΠΎ ΠœΠ°Ρ€ΠΈΡƒΡ ΠšΡ€ΠΈΡΡ‚Π΅Π½ΡΠ΅Π½
Π˜Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ са прСдоставСни с Π»ΡŽΠ±Π΅Π·Π½ΠΎΡ‚ΠΎ ΡΡŠΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ Π½Π° websequencediagrams.com

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€