ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠΊΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π±ΠΈΠ·Π½Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΊΡΡΠ½ΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° Π² Π΅ΡΠ°ΠΏ, ΠΊΠΎΠ³Π°ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅. Π ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½ΠΎΠ² ΠΈΠ½ΡΡΠ°Π½Ρ ΠΈ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅. ΠΠΎ ΠΈΠΌΠ° ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΡΡΠΈΠ²ΠΈΠ°Π»Π½ΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈΠΌ, ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π½ΠΎΠ΄ΠΈ Π·Π½Π°ΡΡ Π΅Π΄Π½Π° Π·Π° Π΄ΡΡΠ³Π° ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅.

Π’Π°ΠΊΠ° ΡΠ΅ ΡΠ»ΡΡΠΈ, ΡΠ΅ erlang, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·Π±ΡΠ°Ρ ΠΌΠ΅ Π·Π°ΡΠ°Π΄ΠΈ ΠΏΡΠΈΡΡΠ½ΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈ ΡΡΠΌΠ° ΠΎΠΊΠΎΠ»ΠΎ Π½Π΅Π³ΠΎ, ΠΈΠΌΠ° ΠΏΡΡΠ²ΠΎΠΊΠ»Π°ΡΠ½Π° . Π ΡΠ΅ΠΎΡΠΈΡΡΠ° ΡΠΎΠ²Π° Π·Π²ΡΡΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠΈΠ²ΠΈΠ°Π»Π½ΠΎ:
ΠΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈ ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈ, Π΅ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ [β¦]
ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ. Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ erlang Π±Π΅ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½, ΠΊΠΎΠ³Π°ΡΠΎ "ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ" ΠΎΠ·Π½Π°ΡΠ°Π²Π°ΡΠ΅ Π³ΠΎΠ»ΡΠΌ ΠΆΠ΅Π»Π΅Π·Π΅Π½ ΡΡΠΈΠΊ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ·, Π° "Π΄ΠΎΠΊΠ΅Ρ" Π±Π΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π½Π° ΠΏΠΎΡΡΠΎΠ² ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ. Π IP4 ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Π·Π°Π΅ΡΠΈ Π°Π΄ΡΠ΅ΡΠΈ, Π° Π·Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ ΡΠ°Π·ΠΊΡΡΠ²Π°Π½ΠΈΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π±ΡΡ Π° Π²ΠΈΠ½ΠΎΠ²Π½ΠΈ Π³ΡΠΈΠ·Π°ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅Π³ΡΠΈΠ·Π²Π°Ρ Π° ΠΊΠ°Π±Π΅Π»ΠΈΡΠ΅, Π° ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π±Π΅Π·ΠΎΡΠΊΠ°Π·Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°ΡΠ΅ Π² Π΄Π΅ΡΠ΅ΡΠΈΠ»Π΅ΡΠΈΡ.
Π‘Π΅Π³Π° Π²ΡΠΈΡΠΊΠΈ Π½ΠΈΠ΅ ΡΠΌΠ΅ Π½Π΅ΠΈΠΌΠΎΠ²Π΅ΡΠ½ΠΎ ΡΠ°ΠΌΠΎΠ΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ, ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½ΠΈ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ erlang Π² ΡΡΠ΅Π΄Π°, Π² ΠΊΠΎΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈΡΠ΅ IP Π°Π΄ΡΠ΅ΡΠΈ ΡΠ΅ ΡΠ°Π·Π΄Π°Π²Π°Ρ Π½Π° ΡΠ»ΡΡΠ°Π΅Π½ ΠΏΡΠΈΠ½ΡΠΈΠΏ, Π° Π²ΡΠ·Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ ΠΈ ΠΈΠ·ΡΠ΅Π·Π²Π°Ρ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π»ΡΠ²Π°ΡΠ° ΠΏΠ΅ΡΠ° Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠΈΡ. ΠΠ° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΠΈΠ»ΠΈΠ΅ ΠΎΡ ΡΠ°Π±Π»ΠΎΠ½Π΅Π½ ΠΊΠΎΠ΄ Π² Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ erlang, Π·Π° Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΠΌ Ρ Π²ΡΠ°ΠΆΠ΄Π΅Π±Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π΅ ΠΏΠΎΠΌΠΎΡ.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: Π·Π½Π°ΠΌ, ΡΠ΅ ΠΈΠΌΠ° . Π’ΠΎΠΉ Π΅ Π½Π°ΠΈΡΡΠΈΠ½Π° ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½, ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Ρ ΠΈΠ»ΡΠ΄Π° Π·Π²Π΅Π·Π΄ΠΈ, Π°Π²ΡΠΎΡΡΡ Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π² ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ°, ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠ°ΠΊΠΎΠ²Π°. ΠΠΊΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π½ΠΈΡΠ΅ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΏΠ°ΠΊΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ ΡΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ Π·Π° Π²Π°Ρ - ΡΠ°Π΄Π²Π°ΠΌ ΡΠ΅ Π·Π° Π²Π°Ρ. ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, Π½Π° ΠΌΠ΅Π½ ΠΌΠΈ ΡΡΡΠ±Π²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅. ΠΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π² Π΄Π΅ΡΠ°ΠΉΠ»ΠΈ ΠΈ Π΄Π° Π½Π΅ Π±ΡΠ΄Π° Π·ΡΠΈΡΠ΅Π» Π² ΡΠ΅Π°ΡΡΡ ΠΏΠΎ ΠΏΡΠ΅ΠΎΡΠΎΡΠΌΡΠ½Π΅ΡΠΎ Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ.
ΠΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ
ΠΠ°ΠΊΠ²ΠΎ ΠΌΠΈ Π±Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ, Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΡΠΎ Π΄Π° ΠΏΠΎΠ΅ΠΌΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΈ Π΄Π° ΠΏΡΠΈΡΠ΅ΠΆΠ°Π²Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°:
- ΠΏΡΠΎΠ·ΡΠ°ΡΠ½Π° ΡΠ°Π±ΠΎΡΠ° ΠΊΠ°ΠΊΡΠΎ Ρ ΡΠ²ΡΡΠ΄ΠΎ ΠΊΠΎΠ΄ΠΈΡΠ°Π½ΠΈ ΡΠΏΠΈΡΡΡΠΈ Π½Π° Π²ΡΠ·Π»ΠΈ, ΡΠ°ΠΊΠ° ΠΈ Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ ΡΡΠ΅Π· ΡΡΠ»ΡΠ³ΠΈ erlang;
- ΠΏΡΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ»Π±Π΅ΠΊ ΠΏΡΠΈ Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° (Π²ΡΠ·Π΅Π» ΡΡΠΊ, Π²ΡΠ·Π΅Π» ΡΠ°ΠΌ, Π½Π΅ΡΡΠ°Π±ΠΈΠ»Π½ΠΎΡΡ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ°, ΡΠ°Π·ΠΊΡΡΠ²Π°Π½ΠΈΡ);
- ΠΏΡΠΎΠ·ΡΠ°ΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ρ Π΄ΡΠ»Π³ΠΈ ΠΈ ΠΊΡΡΠΈ ΠΈΠΌΠ΅Π½Π°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Ρ
:nonode@nohost; - Π²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Docker ΠΎΡ ΠΊΡΡΠΈΡΡΠ°, Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ΅Π½ ΠΊΠΎΠ΄.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΡΠ²Π°ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π² :nonode@nohost, ΠΈΠ»ΠΈ Π² ΠΈΠ·ΠΊΡΡΡΠ²Π΅Π½ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠ΅Π΄Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° , ΠΈΡΠΊΠ°ΠΌ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌ docker-compose up --scale my_app=3 ΠΈ Π΄Π° Π²ΠΈΠ΄Ρ ΠΊΠ°ΠΊ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΡΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ Π² Docker Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π°. ΠΡΠΊΠ°ΠΌ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ mnesiaΒ β ΠΊΠΎΠ³Π°ΡΠΎ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ, Π·Π°Π΄ ΠΊΡΠ»ΠΈΡΠΈΡΠ΅ Π΄Π° ΠΏΡΠ΅ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π½Π°ΡΠΈΡΠΊΠΈ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Cloister Π½Π΅ Π΅ Π·Π°ΠΌΠΈΡΠ»Π΅Π½ ΠΊΠ°ΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΡΠΏΠΎΡΠΎΠ±Π½Π° Π½Π° Π²ΡΠΈΡΠΊΠΎ: ΠΎΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΄ΠΎ ΠΏΡΠΈΠ³ΠΎΡΠ²ΡΠ½Π΅ Π½Π° ΠΊΠ°ΡΠ΅. Π’ΠΎΠ²Π° Π½Π΅ Π΅ ΡΡΠ΅Π±ΡΡΠ½Π° ΠΊΡΡΡΡΠΌΠ°, ΡΡΡΠ΅ΠΌΡΡΠ° ΡΠ΅ Π΄Π° ΠΎΠ±Ρ Π²Π°Π½Π΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ, Π½ΠΈΡΠΎ Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡΠ½ΠΎ ΠΏΡΠ»Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΌΠΈΡΡΠ»Π°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠΈΡΠ΅ ΠΎΡ CS Π²Π»Π°Π³Π°Ρ Π² ΡΠΎΠ·ΠΈ ΡΠ΅ΡΠΌΠΈΠ½. Π’Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π°, Π·Π° Π΄Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ½Π° ΡΠ΅Π», Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ²ΠΎΡ Π½Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π³ΠΎΠ»ΡΠΌ ΠΎΠ±Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ° ΠΏΠ΅ΡΡΠ΅ΠΊΡΠ½ΠΎ. Π’Π°Π·ΠΈ ΡΠ΅Π» ΡΠ΅ Π±ΡΠ΄Π΅ Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈ ΠΏΡΠ»Π½Π° ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° Π΅Π»Π°ΡΡΠΈΡΠ½Π° ΡΡΠ΅Π΄Π°, ΠΏΡΠ»Π½Π° Ρ Π²ΡΠ°ΠΆΠ΄Π΅Π±Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ.
ΠΠ·Π±ΡΠ°Π½ΠΈΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄
Cloister ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ ΡΡΡ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΡΡΡΠ½ΠΎ, Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΠΊΠΈ Cloister.Manager Π² Π΄ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΡΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡΠΈΡΠ΅ Π½Π° ΡΠ΅Π»Π΅Π²ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ°Π·ΡΠΈΡΠ° Π½Π° config, ΠΎΡΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠ·ΡΠΈΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ:
config :cloister,
otp_app: :my_app,
sentry: :"cloister.local", # ΠΈΠ»ΠΈ ~w|n1@foo n2@bar|a
consensus: 3, # Π±ΡΠΎΠΉ Π½Π° Π²ΡΠ·Π»ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π΄Π° ΡΠ΅ ΡΡΠΈΡΠ°Ρ
# ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΅ Π°ΠΊΡΠΈΠ²Π΅Π½
listener: MyApp.Listener # ΡΠ»ΡΡΠ°ΡΠ΅Π», ΠΊΠΎΠΉΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½, ΠΊΠΎΠ³Π°ΡΠΎ
# ΠΏΡΡΡΡΠ΅Π½ΡΡ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π²Π°Ρ Π±ΡΠΊΠ²Π°Π»Π½ΠΎ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ: Cloister ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π·Π° OTP ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ :my_app, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° erlang service discovery Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π²ΡΠ·Π»ΠΈ, Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎ ΡΡΠΈ, ΠΈ MyApp.Listener ΠΌΠΎΠ΄ΡΠ» (ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Ρ ) Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΈΠ·Π²Π΅ΡΡΠΈΡ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΡΠ°. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡΠ»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² .
ΠΡΠΈ ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Cloister ΡΠ΅ Π±ΡΠ΄Π΅ , ΠΎΡΠ»Π°Π³Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π³Π»Π°Π²Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΏΠΎΡΡΠΈΠ³Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡ (ΡΡΠΈ Π²ΡΠ·Π΅Π»Π° ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈ, ΠΊΠ°ΠΊΡΠΎ Π² Π³ΠΎΡΠ½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ.) Π’ΠΎΠ²Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½Π° Π³Π»Π°Π²Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈ, ΡΠ΅ ΠΊΠΎΠ³Π°ΡΠΎ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΎ, ΠΊΠ»Π°ΡΡΠ΅ΡΡΡ Π²Π΅ΡΠ΅ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½. ΠΡΠΈ Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° (ΠΊΠΎΡΠΎΡΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ, Π·Π°ΡΠΎΡΠΎ Π²ΡΠ·Π»ΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ), ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ . Π ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΡΡ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ %Cloister.Monitor{status: :up}, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°: βΠ°Π»Γ³, ΠΊΠ»Π°ΡΡΠ΅ΡΡΡ Π΅ ΡΡΠ±ΡΠ°Π½β.
Π ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° consensus: 3 Π΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½Π°, Π·Π°ΡΠΎΡΠΎ Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΠΎΡΠ°ΠΊΠ²Π°ΠΌΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²ΡΠ·Π»ΠΈ, ΠΎΠ±ΡΠ°ΡΠ½ΠΈΡΡ Π²ΠΈΠΊ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΏΡΠ΅Π· status: :rehashing β status: :up ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π½ΠΎΠ²ΠΎΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π°ΡΠΎ Π²ΡΠ·Π»ΠΎ.
ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ ΠΏΡΠΎΡΡΠΎ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ consensus: 1 ΠΈ Cloister Π²Π΅ΡΠ΅Π»ΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΎΡΠ°ΠΊΠ²Π°Π½Π΅ΡΠΎ Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ, Π²ΠΈΠ΄ΡΠ²Π°ΠΉΠΊΠΈ :nonode@nohost, ΠΈΠ»ΠΈ :node@host, ΠΈΠ»ΠΈ :node@host.domainΒ β Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΅ Π±ΠΈΠ»Π° Π½Π°ΡΡΡΠΎΠ΅Π½Π° Π²ΡΠ·Π»ΡΡ (:none | :shortnames | :longnames).
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π²ΡΠ² Π²Π°ΠΊΡΡΠΌ ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠ°ΡΠΎ mnesia. ΠΠ΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΡΡ
Π½Π°ΡΠ° ΠΏΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΡ ΡΡΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ Π²ΠΈΠΊ on_state_change/2. ΠΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠ΅Π½Π°ΡΡΡΠΎΠΈΠΌ mnesia Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² .
ΠΠ»Π°Π²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Cloister Π΅, ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ ΡΠ»Π΅Π΄ ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ°. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° Π² Π²Π΅ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠ΅Π΄Π°, Ρ Π²ΡΠΈΡΠΊΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈ Π²ΡΠ·Π»ΠΈ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄Π°Π»ΠΈ Π·Π½Π°Π΅ΠΌ IP Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° Π²ΡΠ·Π»ΠΈΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ, ΠΈΠ»ΠΈ ΡΠ΅ ΡΠ° Π±ΠΈΠ»Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈ/ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ. Π’ΠΎΠ²Π° Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Docker ΠΈ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½ΡΠΌΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠ΅Π΄Π° ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π½Π° :nonode@nohost. ΠΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅ Π² .
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ»ΠΎΠΆΠ½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π° ΡΡΠ΅Π· ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ MyApp.Listener, Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π³ΡΠ°Π½ΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅Π·ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈ ΠΏΡΠ΅Π΄ΡΠ±Π΅Π΄Π΅Π½ΠΈΡΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΠΊΠ°ΠΌΡΠΊ Π½Π° ΠΏΡΡΡ ΠΊΡΠΌ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅. Π’ΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΠ΅, ΠΏΡΠΎΡΡΠΎ Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎΡΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅ libcluster, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎ-ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½, ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ ΡΠ°ΠΌΠΈ. Π¦Π΅Π»ΡΠ° Π½Π° ΡΠ°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡ ΠΊΠΎΠ΄ Π΅ Π½Π΅ Π΄Π° ΠΎΠ±Ρ
Π²Π°ΡΠ° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π°ΠΉ-ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π±Π΅Π· Π½Π΅Π½ΡΠΆΠ½ΠΈ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±Π΅ΠΌΠΈΡΡΠΈ ΠΊΠΎΠΏΠΈ-ΠΏΠ΅ΠΉΡΡ.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: Π½Π° ΡΠΎΠ²Π° ΠΌΡΡΡΠΎ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π° Π±Π΅ΡΠ΅ ΡΡΠ°Π·Π°ΡΠ° βHappy clustering!β, ΠΈ Π―Π½Π΄Π΅ΠΊΡ, Ρ ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π°ΠΌ (Π½Π΅ ΠΌΠΎΠ³Π° ΡΠ°ΠΌ Π΄Π° ΡΠΎΠ²Ρ ΠΈΠ· ΡΠ΅ΡΠ½ΠΈΡΠΈΡΠ΅), ΠΌΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ Π²Π°ΡΠΈΠ°Π½Ρ βΠ‘ΡΠ°ΡΡΠ»ΠΈΠ²ΠΎΠ³ΠΎ ΡΠΊΠΎΠΏΠ»Π΅Π½ΠΈΡ!β. ΠΠΎ-Π΄ΠΎΠ±ΡΡ ΠΏΡΠ΅Π²ΠΎΠ΄, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π³Π΅ΠΎΠΏΠΎΠ»ΠΈΡΠΈΡΠ΅ΡΠΊΠ° ΡΠΈΡΡΠ°ΡΠΈΡ, Π΅Π΄Π²Π° Π»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΌΠΈΡΠ»ΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
