Π“Ρ€Π°Π΄Π΅ΠΆΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° дистрибуирани Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠŸΡ€Π²ΠΈΠΎΡ‚ пристап

Π“Ρ€Π°Π΄Π΅ΠΆΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° дистрибуирани Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠŸΡ€Π²ΠΈΠΎΡ‚ пристап

Π’ΠΎ послСдниот Π§Π»Π΅Π½ Π“ΠΈ испитавмС тСорСтскитС основи Π½Π° Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° Ρ‚Π΅ΠΊΠΎΠ²ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ 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 ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΎΠ΄ 1 MB сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ ΠΎΠ΄ Π΅Π΄Π½Π° ΠΏΠΎΡ€Π°ΠΊΠ° ΠΎΠ΄ 1 GB.

Π’ΠΎ кластСрот 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 Ρ€Π°ΠΊΡƒΠ²Π°Ρ‡ΠΈ. Π”ΡƒΡ€ΠΈ ΠΈ Π²ΠΎ Ρ„Π°Π·Π°Ρ‚Π° Π½Π° распрСдСлба Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅, сС поставува ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ Π·Π° правичноста Π½Π° распрСдСлбата ΠΈ ΠΏΡ€Π΅Π»Π΅Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π°ΠΊΡƒΠ²Π°Ρ‡ΠΈΡ‚Π΅. Π”ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΊΡ€ΡƒΠΆΠ΅Π½ ΠΏΠ°Ρ‚ ќС Π±ΠΈΠ΄Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π½Π° Π·Π° правичноста, Π° Π·Π° Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€Π΅Π»Π΅Π²Π°ΡšΠ΅ Π½Π° Ρ€Π°ΠΊΡƒΠ²Π°Ρ‡ΠΈ, ќС Π²ΠΎΠ²Π΅Π΄Π΅ΠΌΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ΅ prefetch_limit. Π’ΠΎ ΠΌΠΈΠ½Π»ΠΈΠ²ΠΈ услови prefetch_limit ќС спрСчи Π΅Π΄Π΅Π½ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΈΠΌΠ° ситС Π·Π°Π΄Π°Ρ‡ΠΈ.

ΠŸΠΎΡ€Π°ΠΊΠΈ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π° со Ρ€Π΅Π΄ΠΈΡ†ΠΈ ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. ΠŸΡ€ΠΎΡ†Π΅ΡΠΎΡ€ΠΈΡ‚Π΅ Π΄ΠΎΠ±ΠΈΠ²Π°Π°Ρ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ пристигнуваат. Π—Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π²Ρ€ΡˆΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ Π΄Π° Π½Π΅ успСС:

  • messaging:ack(Tack) - ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ Π°ΠΊΠΎ ΠΏΠΎΡ€Π°ΠΊΠ°Ρ‚Π° Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½Π°
  • messaging:nack(Tack) - ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ΠΈ Π²ΠΎ ситС ΠΈΡ‚Π½ΠΈ ситуации. Π¨Ρ‚ΠΎΠΌ ќС сС Π²Ρ€Π°Ρ‚ΠΈ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°, ΠΏΠΎΡ€Π°ΠΊΠΈΡ‚Π΅ ќС Π³ΠΈ прСнСсат Π½Π° Π΄Ρ€ΡƒΠ³ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡.

Π“Ρ€Π°Π΄Π΅ΠΆΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° дистрибуирани Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠŸΡ€Π²ΠΈΠΎΡ‚ пристап

Π”Π° прСтпоставимС Π΄Π΅ΠΊΠ° сС случил комплСксСн нСуспСх ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ: процСсорот 1, ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ја ΠΏΡ€ΠΈΠΌΠΈΠ» Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°, ΠΏΠ°Π΄Π½Π°Π» Π±Π΅Π· Π΄Π° ΠΈΠΌΠ° Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° ΠΏΡ€ΠΈΡ˜Π°Π²ΠΈ Π½Π΅ΡˆΡ‚ΠΎ Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° Ρ€Π°Π·ΠΌΠ΅Π½Π°. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π·Π° Ρ€Π°Π·ΠΌΠ΅Π½Π° ќС ја ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π½Π° Π΄Ρ€ΡƒΠ³ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС истСчС Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° Π°ΠΊΡƒΠΌΡƒΠ»ΠΈΡ€Π°ΡšΠ΅. ΠŸΠΎΡ€Π°Π΄ΠΈ нСкоја ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ΠΎΡ‚ 3 ја Π½Π°ΠΏΡƒΡˆΡ‚ΠΈ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΈ испрати Π½Π°ΠΊ; ΠΊΠ°ΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° бСшС ΠΏΡ€Π΅Ρ„Ρ€Π»Π΅Π½Π° ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ кој ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ја Π·Π°Π²Ρ€ΡˆΠΈ.

ΠŸΡ€Π΅Π»ΠΈΠΌΠΈΠ½Π°Ρ€Π½ΠΎ Ρ€Π΅Π·ΠΈΠΌΠ΅

Π“ΠΈ ΠΎΠΏΡ„Π°Ρ‚ΠΈΠ²ΠΌΠ΅ основнитС Π³Ρ€Π°Π΄Π΅ΠΆΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π½Π° дистрибуиранитС систСми ΠΈ стСкнавмС основно Ρ€Π°Π·Π±ΠΈΡ€Π°ΡšΠ΅ Π·Π° Π½ΠΈΠ²Π½Π°Ρ‚Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π²ΠΎ Erlang/Elixir.

Π‘ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΡšΠ΅ Π½Π° основнитС обрасци, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ слоТСни ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠΈ Π·Π° Π΄Π° Π³ΠΈ Ρ€Π΅ΡˆΠΈΡ‚Π΅ Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

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

ΠšΡ€Π°Ρ˜ Π½Π° Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π΄Π΅Π».

Π€ΠΎΡ‚ΠΎ ΠœΠ°Ρ€ΠΈΡƒΡ ΠšΡ€ΠΈΡΡ‚Π΅Π½ΡΠ΅Π½
Π˜Π»ΡƒΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ со помош Π½Π° websequencediagrams.com

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€