Π ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
- ΠΠ°ΡΠ²ΠΊΠ°-ΠΎΡΠ³ΠΎΠ²ΠΎΡ
- Π Π°Π·ΠΊΡΡΠ°Π½ ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°
- ΠΡΠ³ΠΎΠ²ΠΎΡ Ρ ΠΈΡΠΊΠ°Π½Π΅
- ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅-Π°Π±ΠΎΠ½ΠΈΡΠ°Π½Π΅
- ΠΠ±ΡΡΠ½Π°Ρ ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ ΠΠ±ΠΎΠ½ΠΈΡΠ°Π½Π΅
- Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°ΡΠΈΡΠ΅
SOA, MSA ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ
SOA, MSA ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΈ Π·Π° ΡΡΡ Π½ΠΎΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
ΠΠ΅ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΏΡΠΎΠΏΠ°Π³Π°Π½Π΄ΠΈΡΠ°ΠΌ ΡΠ°Π·ΠΈ ΠΈΠ»ΠΈ ΠΎΠ½Π°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°. ΠΠ· ΡΡΠΌ Π·Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΠΉ-Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ. ΠΠ°ΠΊΠ²Π°ΡΠΎ ΠΈ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ, ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Ρ ΠΏΠΎΠ³Π»Π΅Π΄ ΠΊΡΠΌ Unix-way: ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΡΠ²ΡΡΠ·Π°Π½ΠΎΡΡ, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΈ Π·Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈΡΠ΅ ΠΎΠ±Π΅ΠΊΡΠΈ. API ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ.
Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΡ - ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π²Π° ΠΈΠΌΠ΅ΡΠΎ - Π±ΡΠΎΠΊΠ΅Ρ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΌΡ ΡΠ΅Π» Π΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π’ΠΎΠΉ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠ°Π½Π°Π»ΠΈ Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°.
Π Π°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΠ°Ρ ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡ rabbitmq. ΠΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΌΡ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ:
- Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅.
Π’ΠΎΡΠΊΠΈΡΠ΅ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°. - ΠΡΠΎΡΡΠΎΡΠ°.
Π‘ΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠ΅ΡΠ΅ ΡΠ΅ Π²ΡΡΡ Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π±Π»ΠΎΠ½Π½ΠΈΡ ΠΊΠΎΠ΄ ΠΈ Π»Π΅ΠΊΠΎΡΠ°ΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. - ΠΠΎ-Π΄ΠΎΠ±ΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅.
ΠΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ²ΡΠ°ΡΡΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° rabbitmq, Π½ΠΎ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΈΡ ΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΠΈΡ ΡΠ»ΠΎΠΉ, ΠΊΠΎΠΉΡΠΎ Π²ΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π² OTP Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΎ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅. - ΠΡΠ²ΠΊΠ°Π²ΠΎΡΡ.
ΠΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π·Π° ΠΎΠ±ΠΌΠ΅Π½. - Π£ΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½.
- ΠΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ.
Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΡΠ°ΡΡΠ°Ρ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΠΎΡΠΊΠΈ Π½Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π°, ΠΌΠ΅ΡΠ°-ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈ Π·Π° ΡΠ»ΠΎΠΆΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Erlang/Elixir. Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π² Π΅Π΄Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ - ΠΎΠ±Ρ ΠΏΡΠΎΠ΅ΠΊΡ. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΡΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΎΠ±Π΅ΠΊΡ. Π‘ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° API Π½Π° ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, Π»Π΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ΄ΠΎΠ±Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΈΡΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Π½ΠΈ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅.
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ»ΠΈ ΡΡΠ΅Π· Π±ΡΠΎΠΊΠ΅Ρ. ΠΡ ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π²ΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΆΠΈΠ·Π½Π΅Π½ΠΈ ΡΠ°Π·ΠΈ:
- ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°.
ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅. - Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π½Π° ΡΠΎΡΠΊΠ°.
Π£ΡΠ»ΡΠ³Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ°ΡΠΈΡΠ½Π° ΡΠΎΡΠΊΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½, ΠΏΠΎΡΠΎΡΠ΅Π½Π° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Ρ ΠΎΡΡΠ°, ΠΈΠ»ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° ΡΠΎΡΠΊΠΈ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ. - Π‘Π΅ΡΠ²ΠΈΠ·Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ.
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° Π·Π°ΡΠ²ΠΊΠΈ, ΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π° Π² ΠΎΠ±ΠΌΠ΅Π½Π½Π°ΡΠ° ΡΠΎΡΠΊΠ°. - ΠΠΎΡΠΌΠ°Π»Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ.
Π£ΡΠ»ΡΠ³Π°ΡΠ° Π²ΡΡΡΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π° ΡΠ°Π±ΠΎΡΠ°. - ΠΠ°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ°.
ΠΠΌΠ° 2 Π²ΠΈΠ΄Π° ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅: ΡΠ΅Π΄ΠΎΠ²Π½ΠΎ ΠΈ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ. ΠΡΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅Π½ ΡΠ΅ΡΠ²ΠΈΠ· ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π° ΠΎΡ ΠΎΠ±ΠΌΠ΅Π½Π½Π°ΡΠ° ΡΠΎΡΠΊΠ° ΠΈ ΡΠΏΠΈΡΠ°. Π ΡΠΏΠ΅ΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅Ρ ΠΎΠ΄ ΠΏΡΠΈ ΡΡΠΈΠ².
ΠΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄ΠΎΡΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΊΠΎΠ΄ΡΡ Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΡΡΡΠ°ΡΠ΅Π½. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΠ΄ Ρ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π΄Π°Π΄Π΅Π½ΠΈ Π² Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΡΠ°Π±Π»ΠΎΠ½ΠΈΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ.
ΠΠ±ΠΌΠ΅Π½ΡΡ
Π’ΠΎΡΠΊΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π΅ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΡΡΠ΅Π· ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈ ΡΠΎΡΠΊΠΈ, ΡΠΈΡΡΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΡΠΎΡΠΌΠΈΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ.
ΠΠΎΠ΄Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ (ΠΠ)
Π ΡΠ²Π΅ΡΠΎΠ²Π΅Π½ ΠΌΠ°ΡΠ°Π± ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ Π½Π° Π΄Π²ΡΡΡΡΠ°Π½Π½ΠΈ ΠΈ Π΅Π΄Π½ΠΎΡΡΡΠ°Π½Π½ΠΈ. ΠΡΡΠ²ΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π²ΡΠΎΡΠΈΡΠ΅ Π½Π΅. ΠΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π΄Π²ΡΠΏΠΎΡΠΎΡΠ΅Π½ ΠΌΠΎΠ΄Π΅Π» Π² Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΡΡΠ²ΡΡ Π΅ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π·Π°ΡΠ²ΠΊΠ°-ΠΎΡΠ³ΠΎΠ²ΠΎΡ. Π Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
ΠΠ°ΡΠ²ΠΊΠ°-ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΈΠ»ΠΈ RPC
RPC ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΎΡ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ. Π’ΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π½Π° ΡΡΡΠΈΡ Ρ ΠΎΡΡ ΠΈΠ»ΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΊΠΎΠ½ΡΠΈΠ½Π΅Π½Ρ. ΠΠΎ-Π΄ΠΎΠ»Ρ Π΅ Π΄Π°Π΄Π΅Π½Π° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΡΡΠ²ΡΡΠ° ΡΡΠ΅Π· ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΡΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ, ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π·Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ Π½Π° 2 ΡΠ°Π·ΠΈ:
-
ΠΠΎΠ΄Π°ΠΉΡΠ΅ Π·Π°ΡΠ²ΠΊΠ°
messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).
ΠΎΠ±ΠΌΠ΅Π½ β ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΈΠΌΠ΅ Π½Π° ΠΎΠ±ΠΌΠ΅Π½Π½Π° ΡΠΎΡΠΊΠ°
ResponseMatchingTag β Π»ΠΎΠΊΠ°Π»Π΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
ΠΠ΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ° β ΡΡΠ»ΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°
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.
ΠΠΎΠ΄ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ΠΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠ° Π΄ΠΎ ΡΡΠ»ΡΠ³Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅ 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