
Π ΠΌΠΈΠ½Π°Π»ΠΎΡΠΎ Π Π°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΈ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΠ²Π½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°. ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΠΏΡΡΠΈΡΠ°ΡΠ° Π·Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ 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 ΡΠ°Π·ΠΈ:
ΠΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).ΠΠ±ΠΌΠ΅Π½ β ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠΌΠ΅ Π½Π° ΡΠΎΡΠΊΠ°ΡΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½
ResponseMatchingTag β Π»ΠΎΠΊΠ°Π»Π΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
RequestDefinition β ΡΡΠ»ΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°
HandlerProcess β PID Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. ΠΠ° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ ΠΏΡΠΈΡΡΠΈΠ³Π½Π΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΎΡ ΡΡΡΠ²ΡΡΠ°.ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°
handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)ResponsePayload β ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° ΡΡΡΠ²ΡΡΠ°.
ΠΠ° ΡΡΡΠ²ΡΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΡΡΠΎ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ 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
