ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° Π²ΠΈ ΠΊΠ°ΠΆΠ° Π΅Π΄ΠΈΠ½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ Π΅Π·ΠΈΠΊ (Scala) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅. Π’Π°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΡΡΠ»ΠΎΡΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°.
Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π° Ρ Π΄ΡΡΠ³ΠΈ Π²ΡΠ·Π»ΠΈ. DevOps ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΡΠ΅ (teraform, ansible ΠΈΠ»ΠΈ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ) ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (ΡΠ΅ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π²ΡΠ·Π΅Π»). Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°ΡΠΈ Π²ΡΠ·Π»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° Π²Π΅ΡΡΠΈΡ). Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π² Π½Π°ΡΠ°ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π²Π³ΡΠ°Π΄Π΅Π½Π° Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ. Π ΡΠ²Π΅ΡΠ° Π½Π° JVM Π΅Π΄Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΠΎΡ ΡΠΎΠ²Π° ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ Π΅, ΡΠ΅ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π°Π²ΡΡΠΊΡΠ΄Π΅.
ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°? Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½ΠΈΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΈΠΌΠ°Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅. (ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΅ΠΊΡΡΡΠ°ΠΏΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ΅ΡΡΠ° ΠΊΡΠΌ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΡΡΡΠ±Π²Π° ΡΡΡΠΎ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.)
ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅, ΡΠ΅ΡΡΠΎ Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΏΡΡΠ΅ΠΊΠ° Π½Π° ΠΊΠ»Π°ΡΠ° Π½Π°Π²ΡΡΠΊΡΠ΄Π΅ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ, Π΅ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡΠ°ΡΠ° ΠΏΡΡΠ΅ΠΊΠ° ΠΊΡΠΌ ΠΊΠ»Π°ΡΠ°. (ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΡΠ΅ΠΊΠΈ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅, ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΠΊΡΠΌ ΡΡΠ»ΠΎΡΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ.) ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½ΠΈΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΏΡΡΠ΅ΠΊΠ° Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²Π΅ΡΡΠΈΠΈ, Π·Π° Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΅ΡΠ°ΠΏΠΈ ΠΎΡ Π΅Π²ΠΎΠ»ΡΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π° Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. Π ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅. ΠΠΊΠΎ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ°. ΠΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π΅ΡΠΈΠΊΠ΅Ρ Π² Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π²Π΅ΡΡΠΈΡΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠ»ΠΎΠ½Π°). ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ½ΠΎ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΡΠ΅ΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π²ΡΠ·Π»ΠΈ, ΠΏΠΎΡΡΠΎΠ²Π΅, Π²ΡΠ½ΡΠ½ΠΈ ΡΠ΅ΡΡΡΡΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ. ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΊΠ»ΠΎΠ½ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡ Π½Π°ΡΠΈΠ½, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡΠΈ ΡΠΈΡΠ»Π°, ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ Ρ ΡΠΎΡΠΊΠ° (1.2.3).
Π ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΡΡΠ½ΠΎ. ΠΠΎ-ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΠΈ Π²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ Π΄ΠΎΠΊΠΎΡΠ²Π°Ρ (ΡΠ°ΠΊΠ° ΡΠ΅
Π ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠΎΡΡΠΈΠΌ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ.
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Π’ΠΎΠ·ΠΈ ΡΠ°Π·Π΄Π΅Π» ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ°ΡΠΈΡΠ½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. Π Π΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ° Π΄Π²Π΅ ΠΏΡΠΎΡΡΠΈ ΡΡΠ»ΡΠ³ΠΈ - ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅Ρ ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅Ρ ΠΎ. ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠ΅Π·ΠΈ Π΄Π²Π΅ ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Ρ Π΄Π²Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΎΠΏΡΠΈΠΈ. Π Π΅Π΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ Π²ΡΠ·Π΅Π», Π² Π΄ΡΡΠ³ Π²Π°ΡΠΈΠ°Π½Ρ - Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅Π΄Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΡΠ΄ΡΡΠΆΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ·Π΅Π»Π°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΡΠ΅ Π²ΡΠ·Π»ΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΎΡ Π½ΡΠΊΠ°ΠΊΡΠ² ΡΠΈΠΏ NodeId
:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId
ΠΈΠ»ΠΈ
case class NodeId(hostName: String)
ΠΈΠ»ΠΈ
object Singleton
type NodeId = Singleton.type
ΠΡΠ·Π»ΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΎΠ»ΠΈ, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΡΠ»ΡΠ³ΠΈ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Ρ TCP/HTTP Π²ΡΡΠ·ΠΊΠΈ.
ΠΠ° Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ TCP Π²ΡΡΠ·ΠΊΠ°, ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΏΠΎΠ½Π΅ ΠΎΡ Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΏΠΎΡΡ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΠΎΡΡΠ°Π·ΠΈΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ, Π·Π° Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ, ΠΈ ΡΡΡΠ²ΡΡΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ». Π©Π΅ ΠΎΠΏΠΈΡΠ΅ΠΌ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠ»Π°Ρ:
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])
ΠΊΡΠ΄Π΅ΡΠΎ Port
- ΠΏΡΠΎΡΡΠΎ ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ Int
ΡΠΊΠ°Π·Π²Π°Ρ ΠΎΠ±Ρ
Π²Π°ΡΠ° Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ:
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]
ΠΠ·ΠΈΡΠΊΠ°Π½ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅
ΠΠΈΠΆΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°
ΠΠ° HTTP (REST) ββΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ, Π² Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΈ ΠΎΡ ΠΏΡΡΡ Π΄ΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ°:
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)
Π’ΠΈΠΏΠΎΠ²Π΅ ΡΠ°Π½ΡΠΎΠΌΠΈ
ΠΠ° Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏ, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΊΠ»Π°ΡΠ°. Π’ΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΠ°ΡΠΎ ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ Π½Π΅ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ° ΡΡΠ»ΡΠ³Π° ΠΊΠ°ΡΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ.
ΠΠ΄ΠΈΠ½ ΠΎΡ ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π΅ REST API Ρ Json ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
ΠΊΡΠ΄Π΅ΡΠΎ RequestMessage
- ΡΠΈΠΏ Π·Π°ΡΠ²ΠΊΠ°, ResponseMessage
β ΡΠΈΠΏ ΠΎΡΠ³ΠΎΠ²ΠΎΡ.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΡΡΠ³ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° ΡΠΎΡΠ½ΠΎΡΡ Π½Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ.
ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΠΏΡΠΎΡΡΠ΅Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
Π’ΡΠΊ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π΅ Π½ΠΈΠ·, Π΄ΠΎΠ±Π°Π²Π΅Π½ ΠΊΡΠΌ URL Π°Π΄ΡΠ΅ΡΠ°, Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΡΡ Π΅ Π²ΡΡΠ½Π°ΡΠΈΡΡ Π½ΠΈΠ· Π² ΡΡΠ»ΠΎΡΠΎ Π½Π° HTTP ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° ΠΎΡ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°, ΠΏΠΎΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅. Π’Π΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π² Scala ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° (Π½Π°ΠΏΡ. HList
-s, Π°Π»Π³Π΅Π±ΡΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ). ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΡΠΎΡΡΠ° ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° trait
'ΠΎΠ². (ΠΠΎΠ΄Π΅Π»ΡΡ Π·Π° ΡΠΎΡΡΠ° Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ Π΅Π΄Π½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅.)
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ ΠΊΠ°ΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΡΡΡΠ°Ρ ΠΏΠΎΡΡΠΎΠ²Π΅ EndPoint
Π½Π° Π΄ΡΡΠ³ΠΈ Π²ΡΠ·Π»ΠΈ:
type EchoProtocol[A] = SimpleHttpGetRest[A, A]
trait EchoConfig[A] extends ServiceConfig {
def portNumber: PortNumber = 8081
def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
}
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΅Ρ ΠΎ ΡΡΠ»ΡΠ³Π°, Π²ΡΠΈΡΠΊΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΡΠ΅, Π΅ Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΏΠΎΡΡ ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΡ, ΡΠ΅ ΠΏΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π΅Ρ ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΏΠΎΡΡ, Π·Π°ΡΠΎΡΠΎ... Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π±Π΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ (Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ). Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΡ Π½Π°Ρ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΏΠΎΡΡ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΌΠ΅ Π²Π½Π΅Π΄ΡΠΈΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΠΏΠΎΡΠΎΡΠΈΠΌ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΏΠΎΡΡ. Π©Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½ΠΈΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΠΌΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΡΠ»ΡΠ³Π°ΡΠ° echo:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° Π΅ ΠΎΡ ΡΡΡΠΈΡ ΡΠΈΠΏ ΠΊΠ°ΡΠΎ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π°ΡΠ° ΡΡΠ»ΡΠ³Π° echoService
. ΠΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, Π² Π΅Ρ
ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠ·ΠΈΡΠΊΠ²Π°ΠΌΠ΅ ΡΡΡΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ». Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ Π΄Π²Π΅ ΡΡΠ»ΡΠ³ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ.
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° Π΅ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°. (ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ ΠΎΡ ΡΠ΅ΡΠ°Π²Π°ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ.) ΠΡΠ½ΠΎΠ²ΠΎ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠΏΡΠΈΠΈ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°ΠΊΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΈΠΏΠΎΠ²ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠΈΠΏΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ). ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΡΠΎΡΡΠ°. Π©Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΡΠ»ΡΠ³Π°ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°Ρ cats.Resource
, Π·Π°ΡΠΎΡΠΎ Π’ΠΎΠ·ΠΈ ΠΊΠ»Π°Ρ Π²Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅ΡΡΡΡ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ Π³ΠΎΡΠΎΠ² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅. Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]
trait ServiceImpl[F[_]] {
type Config
def resource(
implicit
resolver: AddressResolver[F],
timer: Timer[F],
contextShift: ContextShift[F],
ec: ExecutionContext,
applicative: Applicative[F]
): ResourceReader[F, Config, Unit]
}
ΠΊΡΠ΄Π΅ΡΠΎ
Config
β ΡΠΈΠΏ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π°AddressResolver
β ΠΎΠ±Π΅ΠΊΡ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΡΠ΅ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈ Π²ΡΠ·Π»ΠΈ (Π²ΠΈΠΆΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ)
ΠΈ Π΄ΡΡΠ³ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° cats
:
F[_]
β Π²ΠΈΠ΄ Π΅ΡΠ΅ΠΊΡ (Π² Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉF[A]
ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ() => A
. Π ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅cats.IO
.)Reader[A,B]
- ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΡA => B
cats.Resource
- ΡΠ΅ΡΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½Timer
β ΡΠ°ΠΉΠΌΠ΅Ρ (ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° Π·Π°ΡΠΏΠΈΡΠ΅ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π΄Π° ΠΈΠ·ΠΌΠ΅ΡΠ²Π°ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅)ContextShift
- Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ExecutionContext
Applicative
β ΠΊΠ»Π°Ρ ΡΠΈΠΏ Π΅ΡΠ΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π΅ΡΠ΅ΠΊΡΠΈ (ΠΏΠΎΡΡΠΈ ΠΌΠΎΠ½Π°Π΄Π°). Π ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Monad
/ConcurrentEffect
.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠΎΠ·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΏΠΎΠ΄ΠΏΠΈΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ»ΡΠ³ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ Π½Π΅ ΠΏΡΠ°Π²ΠΈ Π½ΠΈΡΠΎ:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}
(Π‘ΠΌ.
ΠΈ
ΠΡΠ·Π΅Π»ΡΡ Π΅ ΠΎΠ±Π΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ»ΡΠ³ΠΈ (ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²Π΅ΡΠΈΠ³Π° ΠΎΡ ΡΠ΅ΡΡΡΡΠΈ ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΠΎΡ Cake Pattern):
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
ΠΠΎΠ»Ρ, ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π½ΠΈΠ΅ ΡΡΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΡΠΎΡΠ½ΠΈΡ ΡΠΈΠΏ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π·Π° ΡΠΎΠ·ΠΈ Π²ΡΠ·Π΅Π». ΠΠΊΠΎ Π·Π°Π±ΡΠ°Π²ΠΈΠΌ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈ ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠ»ΡΠ³Π°, ΡΠ΅ ΠΈΠΌΠ° Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π²ΡΠ·Π΅Π», ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΎΠ±Π΅ΠΊΡ ΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ ΡΠΈΠΏ Ρ Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π΄Π°Π½Π½ΠΈ.
Π Π΅Π·ΠΎΠ»ΡΡΠΈΡ Π½Π° ΠΈΠΌΠ΅ Π½Π° Ρ ΠΎΡΡ
ΠΠ° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΠΌ Ρ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ Ρ ΠΎΡΡ, ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΡΠ΅Π°Π»Π΅Π½ IP Π°Π΄ΡΠ΅Ρ. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π°Π΄ΡΠ΅ΡΡΡ Π΄Π° ΡΡΠ°Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΎΡ ΠΎΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. Π’Π°ΠΊΠ° ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ° ID Π½Π° Π²ΡΠ·Π΅Π»Π° ΠΊΡΠΌ Π°Π΄ΡΠ΅Ρ:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ:
- ΠΠΊΠΎ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½ΠΈ ΡΡΠ°Π½Π°Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΏΡΠ΅Π΄ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ Scala ΠΊΠΎΠ΄ Ρ
Π°Π΄ΡΠ΅ΡΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ°. Π’ΠΎΠ²Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π² ΠΊΠΎΠ΄ ΠΊΠ°ΡΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅Map[NodeId, NodeAddress]
. - Π Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈΡΡ Π°Π΄ΡΠ΅Ρ Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΠ°ΠΌΠΎ ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ·Π΅Π»Π°.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ βΡΡΠ»ΡΠ³Π° Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅β, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΡΠ΅Π΄ΠΈ Π΄ΡΡΠ³ΠΈ Π²ΡΠ·Π»ΠΈ ΠΈ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Ρ Ρ ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π° ΠΈ ΡΠ΅ ΠΏΠΎΠΈΡΠΊΠ°Ρ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈ Π²ΡΠ·Π»ΠΈ. - ΠΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ
/etc/hosts
, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ ΠΎΡΡΠΎΠ²Π΅ (ΠΊΠ°ΡΠΎmy-project-main-node
ΠΈecho-backend
) ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΡΠ΅Π·ΠΈ ΠΈΠΌΠ΅Π½Π°
Ρ IP Π°Π΄ΡΠ΅ΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅.
Π ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠ΅Π·ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ. ΠΠ° Π½Π°ΡΠΈΡΠ΅
Π² ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΈΠ³ΡΠ°ΡΠΊΠ° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΠΈΠΌΠ°Ρ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ IP Π°Π΄ΡΠ΅Ρ - 127.0.0.1
.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π΄Π²Π΅ ΠΎΠΏΡΠΈΠΈ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°:
- ΠΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π».
- Π Ρ ΠΎΡΡΠ²Π°Π½Π΅ Π½Π° Π΅Ρ ΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ Π΅Ρ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π°
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Ρ Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π»
object SingleNodeConfig extends EchoConfig[String]
with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
case object Singleton // identifier of the single node
// configuration of server
type NodeId = Singleton.type
def nodeId = Singleton
/** Type safe service port specification. */
override def portNumber: PortNumber = 8088
// configuration of client
/** We'll use the service provided by the same host. */
def echoServiceDependency = echoService
override def testMessage: UrlPathElement = "hello"
def pollInterval: FiniteDuration = 1.second
// lifecycle controller configuration
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}
ΠΠ±Π΅ΠΊΡΡΡ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΊΠ°ΠΊΡΠΎ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠ°ΠΊΠ° ΠΈ Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΆΠΈΠ²ΠΎΡ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ»Π΅Π΄ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° lifetime
ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°. (Ctrl-C ΡΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ΡΡΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ.)
Π‘ΡΡΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ΅ΡΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΡΡΠΎΡΡΠ° ΡΠ΅ ΠΎΡ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Ρ Π΄Π²Π° Π²ΡΠ·Π΅Π»Π°
object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
{
type NodeId = NodeIdImpl
def nodeId = NodeServer
override def portNumber: PortNumber = 8080
}
object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
// NB! dependency specification
def echoServiceDependency = NodeServerConfig.echoService
def pollInterval: FiniteDuration = 1.second
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.
def testMessage: String = "dolly"
}
Π²Π°ΠΆΠ½ΠΎ! ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ ΠΊΠ°ΠΊ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈΡΠ΅. ΠΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ ΡΡΠ»ΡΠ³Π°, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΎΡ Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π», ΠΊΠ°ΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ Π½Π° Π΄ΡΡΠ³ Π²ΡΠ·Π΅Π». Π’ΠΈΠΏΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°, Ρ.ΠΊ ΡΡΠ΄ΡΡΠΆΠ° ΡΠΈΠΏΠ° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈ Π²ΡΠ·Π΅Π». ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡ Π΅ΠΌΠ°, Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠ° ΡΠΎΡΠ½ΠΎ Π²Π΅Π΄Π½ΡΠΆ ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½ΠΎ, ΡΠ΅ ΡΠ΅ ΠΎΡΠ½Π°ΡΡΠΌΠ΅ ΠΊΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡ ΠΏΠΎΡΡ.
ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π΄Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ Π²ΡΠ·Π΅Π»Π°
ΠΠ° ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΡΠΈΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅, ΡΠ΅ ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΠΎΠ±Π΅ΠΊΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈ:
object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
type Config = EchoConfig[String] with SigTermLifecycleConfig
}
object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
ΠΡΡΠ²ΠΈΡΡ Π²ΡΠ·Π΅Π» ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΡΡΠ²ΡΡΠ° ΠΈ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΡΠ°ΠΌΠΎ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΡΠΎΡΠΈΡΡ Π²ΡΠ·Π΅Π» Π²Π½Π΅Π΄ΡΡΠ²Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°Π·Π»ΠΈΡΠ½Π° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈ Π΄Π²Π°ΡΠ° Π²ΡΠ·Π΅Π»Π° ΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡ ΠΎΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π· ΡΠ΅Π»ΠΈΡ ΠΆΠΈΠ²ΠΎΡ. Π‘ΡΡΠ²ΡΡΠ½ΠΈΡΡ Π²ΡΠ·Π΅Π» ΡΠ°Π±ΠΎΡΠΈ Π·Π° Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅ ΡΠΏΡΡΠ½ SIGTERM
'om ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΡ Π²ΡΠ·Π΅Π» ΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π° ΡΠ»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅. Π‘ΠΌ.
ΠΠ±Ρ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΈΡΠΈΠ΅
ΠΠ΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π²Π»ΠΈΡΠ΅ Π½Π° ΡΡΠ»ΠΎΡΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΎΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ (.jar). ΠΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ. Π’ΠΎΠ²Π° Π΅ ΡΠ°ΠΊΠ°, Π·Π°ΡΠΎΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΊΠΎΠ΄. ΠΡΠ½ΠΎΠ²ΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅. ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ ΡΠ΅Π·ΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ΡΠΈΠΌ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ ΡΠ°Π·ΠΈ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ° Π² ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΊΠΎΠ΄Π°. Π ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π²ΡΠ΅ΠΊΠΈ
ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΡΠΈΡΠ° ΠΎΡ Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ:
ΠΠΈΠ»Π΅Ρ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ -> PR -> ΠΏΡΠ΅Π³Π»Π΅Π΄ -> ΡΠ»ΠΈΠ²Π°Π½Π΅ ΡΡΡ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ->
ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ -> Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°:
-
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½Π° Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ.
-
ΠΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ Π΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ°ΠΌΠΎ Π² Π΅Π΄ΠΈΠ½ ΠΎΡ Π²ΡΠ·Π»ΠΈΡΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ βΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°β Π΅ ΠΌΠ°Π»ΠΊΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ.
-
Π‘ΡΠ°Π²Π° ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΌΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
-
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π½Π°ΡΡΡΠΏΡΡ ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΡΠ»ΠΎΡΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ Π½Π° ΠΏΡΠ΅Π³Π»Π΅Π΄.
ΠΠΌΠ°ΠΌ Π»ΠΈ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΎΡΠ΄Π΅Π»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ? Π’Π°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈ Π΄ΡΡΠ³Π° ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π΄ΠΎ ΠΊΠΎΡΡΠΎ Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏΠ°. ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² ΠΎΡΠ΄Π΅Π»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ - Π΅Π΄Π½Π°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΈ Π΅Π΄Π½Π°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. Π’ΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π΄Π° ΠΈΠΌΠ°Ρ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΎΠ±ΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. Π’ΠΎΠ²Π° ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π° Π»Π΅ΡΠ½ΠΎ, ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΈ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ°Π²Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Ρ Π½ΡΠΊΠΎΠΈ ΠΎΠ±ΡΠΈ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΈ:
- Π’Π΅ΠΊΡΡΠΎΠ² ΡΠ°ΠΉΠ» Π½Π° ΡΠ΅Π»Π΅Π²Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
- Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ (
etcd
/zookeeper
). - ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ/ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈ Π±Π΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°.
- Π‘ΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·Π²ΡΠ½ ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ΅ ΠΈ Π²Π΅ΡΡΠΈΠΈΡΠ΅.
Π’Π΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π»Π΅Π·Π΅ Π² ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ·Π΅Π», Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ°. ΠΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΎΠ±Π°ΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½Π°. ΠΠ°ΠΏΡΠ°Π²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ ΠΎΡΡΠ°Π²ΡΡ ΡΠ»Π΅Π΄ΠΈ Π² Π΄ΡΡΠ³ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠΈΠΊΠΎΠΉ Π½Π΅ ΠΏΡΠ΅Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅. Π’ΡΡΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΊΠΎΠΉ ΡΠΎΡΠ½ΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π°. ΠΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΡΠ΅ΡΡΠ²Π°Ρ. ΠΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°, ΡΠΎΠ³Π°Π²Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±ΡΠ°Π²ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π΄ΡΡΠ³ΠΈ Π²ΡΠ·Π»ΠΈ.
(Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π΅ Π·Π°ΡΠ²Π°ΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π±ΡΠ΄Π΅ΡΠ΅. Π©Π΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΡΡΠΈΡ ΡΠΈΠΏ ΠΊΠ°ΡΠΎ ΠΈΠ·Ρ
ΠΎΠ΄ Config
ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΡ ΡΠΎΠ²Π° Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄Π²Π°, ΡΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Ρ.ΠΊ. ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΠΊΠΎΠ΄.)
Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎΡΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π΅ Π΄ΠΎΠ±ΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅ΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ΡΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ° ΠΏΡΠΎΡΡΠΎ Π΄Π°Π½Π½ΠΈ. ΠΠ΅ΠΊΠ° ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡ C => A => B
, ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ C
ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΠΈ Π΄Π°Π½Π½ΠΈ A
- ΡΠ΅ΡΡΠΎ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ ΡΠΎΠ²Π° C
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ A
- Π΄Π°Π½Π½ΠΈ. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΠΎ ΡΠΎΠ²Π°, ΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΏΠΎ-ΡΡΠ΄ΠΊΠΎ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ΄Π²Π°Ρ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ (ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ), Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΎΡ Π΄ΡΡΠ³ (ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ).
ΠΠΊΠΎ ΡΡΠ΄ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΡΡΠΈΡΠ΅ ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π±Π΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠΎΠ³Π°Π²Π° ΡΠΎΠ²Π° ΡΠ΅ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, Π·Π°ΡΠΎΡΠΎ ΡΠ΅ ΡΡΡΠ±Π²Π° ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π΄Π° Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π΄Π° ΡΡΡ ΡΠ°Π½ΠΈΠΌ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΠΈ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ Π±ΡΠΎΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠΎ Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ°ΠΊΠΈΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ).
ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. ΠΠΊΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ΠΌ ΡΠ°ΠΊΠΈΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ. Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΠΎΠΏΡΠΈΠΈΡΠ΅ ΡΠ° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΏΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΡΡΠΈ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Ρ Π½ΠΎΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. (Π‘ΠΏΠΎΡΠ΅Π΄ Π½Π°Ρ Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΡΠ³Π²Π° ΠΏΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. ΠΠΊΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΠΠ‘ Π·Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅.)
ΠΠ΄ΠΈΠ½ Π²Π°ΠΆΠ΅Π½ Π°ΡΠΏΠ΅ΠΊΡ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΊΠ°ΡΠ° Ρ
ΠΎΡΠ°ΡΠ° Π΄Π° ΠΎΠ±ΠΌΠΈΡΠ»ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΏΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅, Π΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΠ»Π΅Π΄ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° (ΠΏΡΠ΅ΡΡΠΎΠΉ). ΠΡΡΡΠ½ΠΎΡΡ, Π°ΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΡΠ°ΡΠΈΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π·Π° Π΄Π° Π²Π»ΡΠ·Π°Ρ Π² ΡΠΈΠ»Π° Π½ΠΎΠ²ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Ρ ΠΏΡΠ΅ΡΡΠΎΡ Π²Π°ΡΠΈΡΠ° ΠΏΠΎ ΡΠ΅ΠΆΠ΅ΡΡ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ. Π Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ. ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈΡΠ΅ Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅
ΠΠ΅ΠΊΠ° ΡΠ΅Π³Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠΏΡΠΎΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π²ΡΡΡΠ΅ ΠΈΠ»ΠΈ ΠΈΠ·Π²ΡΠ½ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°. ΠΠΊΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π²ΡΡΡΠ΅ Π² Π°ΡΡΠ΅ΡΠ°ΠΊΡ, ΡΠΎΠ³Π°Π²Π° ΠΏΠΎΠ½Π΅ ΠΈΠΌΠ°Ρ ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°. ΠΠΊΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΈΠ·Π²ΡΠ½ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡ, Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ ΠΊΠΎΠΉ Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΠΈ Π·Π°ΡΠΎ. ΠΠΎΠ»ΠΊΠΎ Π²Π°ΠΆΠ½ΠΎ Π΅? Π‘ΠΏΠΎΡΠ΅Π΄ Π½Π°Ρ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΈΠΌΠ°Ρ ΡΡΠ°Π±ΠΈΠ»Π½Π° ΠΈ Π²ΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
ΠΠ΅ΡΡΠΈΡΡΠ° Π½Π° Π΄Π°Π΄Π΅Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΊΠΎΠ³Π° Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½, ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΡΠ΄ΡΡΠΆΠ°, ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ/Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ ΠΈ ΠΊΠΎΠΉ Π΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΡΡΠΈΠ»ΠΈΡ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ°Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΠΌΠΈΠ½ΡΡΠΈ
ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΡΠ΅ ΡΠΏΡΠ° Π½Π° ΠΏΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΌΠΈΠ½ΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ.
ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°
ΠΠΎ-Π΄ΠΎΠ»Ρ Π΅ Π΄Π°Π΄Π΅Π½ ΡΠΏΠΈΡΡΠΊ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°:
- Π‘ΡΠ°ΡΠΈΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° ΡΡΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°. - ΠΠΎΠ³Π°Ρ Π΅Π·ΠΈΠΊ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎ Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π² Π½ΠΈΠ·. ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Scala, ΡΠΈΡΠΎΠΊ Π½Π°Π±ΠΎΡ ΠΎΡ Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π°ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅
ΡΠ΅ΡΡΠΈ Π·Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π·Π° Π³ΡΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΌΠ΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΌΠΎ Π²Π΅Π΄Π½ΡΠΆ (DRY) Π² ΠΎΠ±Ρ Π²Π°ΡΠ°ΡΠΈΡ ΠΎΠ±Ρ Π²Π°Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π²ΡΠ΅ΠΊΠΈ ΠΊΠ»Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° (Seq
,Map
, ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅). - DSL. Scala ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ»Π΅ΡΠ½ΡΠ²Π°Ρ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° DSL. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡ ΡΠ΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ Π΅Π·ΠΈΠΊ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π΅Π½ Π·Π° ΡΠ΅Π»Π΅Π²Π°ΡΠ° Π³ΡΡΠΏΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ½Π΅ ΡΠ΅ΡΠ»ΠΈΠ²Π° ΠΎΡ Π΅ΠΊΡΠΏΠ΅ΡΡΠΈΡΠ΅ Π² ΠΎΠ±Π»Π°ΡΡΡΠ°. Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° ΡΡΠ°ΡΡΠ²Π°Ρ Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
- Π¦ΡΠ»ΠΎΡΡΠ½ΠΎΡΡ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅. ΠΠ΄Π½ΠΎ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΡΠ»Π°ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π° Π² Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°, Π΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Ρ ΡΠΎΡΠ½ΠΎ Π²Π΅Π΄Π½ΡΠΆ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π½ΡΠΎΠΌΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π·Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠΎΠ²Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠ·Π»ΠΈΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΈΠ·ΡΠΈΡΠ½ΠΈ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ.
- ΠΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ·Π²ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΡΠ΅Π· ΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΈΠ³Π°Π½Π΅ΡΠΎ Π½Π° Π²ΠΈΡΠΎΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠΈ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
- ΠΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠ»Π΅Π΄ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ.
- ΠΠΏΡΠΎΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. Π’ΠΎΠ²Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. (Π§Π°ΡΡ ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, Π½Π°Π±Π»ΡΠ΄Π°Π²Π°Π½Π° Π² Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ Π΅ Π°ΡΡΠΈΠ±ΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π° ΡΠ°ΠΌΠΎ ΡΡΠ·Π½Π°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ΄Π΅Π½ΠΎ ΠΎΡ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π½Π° ΡΠΈΠΏΠ°.) ΠΠΎΡΡΠ° Π»Π΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ - ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈΠΏΡΠ²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠ°ΡΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π΅Π½ΡΠΆΠ½ΠΈ ΡΠ°ΡΡΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΈΡΡΠΈΠ½Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ.
- ΠΠ΅ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ»Π΅Π΄Π²Π°Ρ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½Π°ΡΠ° ΡΡΠ΄Π±Π° Π½Π° Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅, Π΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Ρ ΡΠ½ΠΈΠΊΠ°Π»Π½Π° Π²Π΅ΡΡΠΈΡ. Π’ΠΎΠ²Π° Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. ΠΠΎΠΆΠ΅ΠΌ Π΄ΠΎΡΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΎΡΠΏΡΠ΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½. Π‘ΡΠ°Π±ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½Π° Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, Π΅ Π΄ΠΎΡΡΠ° ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π»ΡΠΈΡΠΈΡΠΈΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ.
- ΠΠΎΠ΄ΡΠ»Π½ΠΎΡΡ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ°ΠΌΠΊΠ° Π΅ ΠΌΠΎΠ΄ΡΠ»Π½Π° ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Ρ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΠ΅Π½ Π²ΡΠ·Π΅Π» Π² Π΅Π΄Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠ·Π»ΠΈ Π² Π΄ΡΡΠ³ΠΎ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
- Π’Π΅ΡΡΠ²Π°Π½Π΅. ΠΠ°ΡΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Ρ ΡΠ°Π»ΡΠΈΠ²ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΡΠ΄ΠΎΠ±Π½ΠΈ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅.
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° ΡΡΠ»Π°ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π° ΡΡΠ΅Π΄Π° ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅. ΠΠ΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΅ΠΌΡΠ»ΠΈΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π½ΡΠΊΠΎΠΈ Π²ΡΠ·Π»ΠΈ ΡΡΠ°Π²Π°Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ° Π·Π° Π½ΡΠΊΠΎΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎ-Π΄ΠΎΠ»Ρ ΡΠ° Π½ΡΠΊΠΎΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ:
- Π‘ΡΠ°ΡΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΡΡΠ±Π²Π° Π±ΡΡΠ·ΠΎ Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ, Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠΉΠΊΠΈ Π²ΡΠΈΡΠΊΠΈ Π·Π°ΡΠΈΡΠ½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ. Π‘ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ. ΠΠ°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅. Π’ΠΎΠ²Π° Π΅ ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°, ΡΠ°ΠΊΠ° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ Π² Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ.
- ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΡ ΡΠ°ΠΉΠ» Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΎΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΡΠΈΠ»ΠΈΡ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅.
- ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ. ΠΠΎΠ½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π°Ρ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ/ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π½Π°Π»ΠΈΡΠ½ΠΈ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
- ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π΅ ΠΏΡΠΎΠΌΡΠ½Π° Π² Π½Π°Π³Π»Π°ΡΠΈΡΠ΅. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΈ DevOps ΡΠ° ΡΠ²ΠΈΠΊΠ½Π°Π»ΠΈ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π°ΠΌΠ°ΡΠ° ΠΈΠ΄Π΅Ρ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΌΠ°Π»ΠΊΠΎ Π½Π΅ΠΎΡΠ°ΠΊΠ²Π°Π½Π° ΠΈ Π½Π΅ΠΎΠ±ΠΈΡΠ°ΠΉΠ½Π° ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΠΎΡΡ Π²ΡΡΠ»ΡΠ½Π΅.
- ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΅ Π²ΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ° ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡΠ»Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ (CI/CD). Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ° Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ.
ΠΠ΅ΠΊΠ° ΡΠ΅ ΡΠΏΡΠ΅ΠΌ ΠΈ Π½Π° ΡΠ΅Π΄ΠΈΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
- ΠΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π½Π΅Π½ΡΠΆΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ Π²ΡΠ·Π΅Π»Π°, ΡΠΎΠ³Π°Π²Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π½ΡΠΌΠ° Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΠΌ Π»ΠΈΠΏΡΠ²Π°ΡΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. Π’ΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ ΡΡΠ΅Π· ΠΈΠ·ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Cake Pattern ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎ-ΡΠ²ΡΡΠ΄ΠΈ ΡΠΈΠΏΠΎΠ²Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
HList
ΠΈΠ»ΠΈ Π°Π»Π³Π΅Π±ΡΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ (ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΠΊΠ°Π·ΡΡΠΈ) Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. - Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΈΠΌΠ° ΡΠ΅Π΄ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΡΡ ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ: (
package
,import
,ΠΎΠ±Π΅ΠΊΡΠ½ΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ;override def
Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅). Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΈΠ·Π±Π΅Π³Π½Π°ΡΠΎ, Π°ΠΊΠΎ Π²Π½Π΅Π΄ΡΠΈΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ DSL. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Π΄ΡΡΠ³ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ XML) ΡΡΡΠΎ Π½Π°Π»Π°Π³Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π²ΡΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ°. - ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π΅ ΠΎΠ±ΠΌΠΈΡΠ»ΡΠΌΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΠΏΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅Ρ ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠΎΡΡΠΈΡ ΠΌΠ΅ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠΈΠΏ Scala. Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠΎ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° xml ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π½Π°ΡΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ Π² Scala, ΡΡΡΠΈΡΠ΅ ΠΈΠ΄Π΅ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Ρ Π²ΡΡΠ»Π΅Π½ΠΈ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈ Π΅Π·ΠΈΡΠΈ (ΠΊΠ°ΡΠΎ Kotlin, C#, Swift, ...). ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π² Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ, Π°ΠΊΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ, ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡ ΡΠ°ΠΉΠ», ΠΊΠ°ΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π»ΠΈΠΏΡΠ²Π°ΡΠΈΡΠ΅ ΡΠ°ΡΡΠΈ.
ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π²ΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. Π Π·Π°ΠΌΡΠ½Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° Π²ΠΈΡΠΎΠΊΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅.
Π Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½:
- ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΠ°ΠΊΡΠΎΡΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅.
- ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ DSL, Π·Π° Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎ Π½Π°ΡΠΈΠ½, ΠΊΠΎΠΉΡΠΎ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
- ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π½Π° Π±ΡΠΎΡ Π½Π° Π²ΡΠ·Π»ΠΈΡΠ΅ Π² ΠΊΠ»ΡΡΡΠ΅Ρ ΠΈΠ·ΠΈΡΠΊΠ²Π° (1) Π²ΡΠ΅ΠΊΠΈ Π²ΡΠ·Π΅Π» Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π·Π»ΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ; (2) ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΡΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΏΠΎΠ»ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π½ΠΎΠ²ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΡΠΈΠ·Π½Π°Π½ΠΈΡ
ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΠ½Π΄ΡΠ΅ΠΉ Π‘Π°ΠΊΡΠΎΠ½ΠΎΠ², ΠΠ°Π²Π΅Π» ΠΠΎΠΏΠΎΠ² ΠΈ ΠΠ½ΡΠΎΠ½ ΠΠ΅Ρ Π°Π΅Π² Π·Π° ΡΡΡ Π½Π°ΡΠ° Π³ΡΠ°Π΄ΠΈΠ²Π½Π° ΠΊΡΠΈΡΠΈΠΊΠ° ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡΡΠ°ΡΠΈΡΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com