ΠΡΠΊΠ°ΠΌ Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π΅Π΄ΠΈΠ½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ Π΅Π·ΠΈΠΊ (Scala) ΡΡΠ΅Π· Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅. Π ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΠΎΠ±ΡΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°.

()
ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°, ΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π° Ρ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ DevOps ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ (terraform, ansible ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ) Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (ΡΠ΅ΡΡΠΎ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π²ΡΠ·Π΅Π»). Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΅ Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ²Π°ΡΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ, ΡΡΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ). Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π² Π½Π°ΡΠ°ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ Π²ΡΠ·Π½ΠΈΠΊΠ½Π΅ Π½Π΅ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ. Π ΡΠ²Π΅ΡΠ° Π½Π° JVM Π΅Π΄Π½ΠΎ ΠΎΡ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡΡΠ° Π½Π° ΡΠΎΠ²Π° ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅ Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°? Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΏΡΠ΅Π΄Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½ΠΈ unit ΡΠ΅ΡΡΠΎΠ²Π΅, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅. (ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΅ΠΊΡΡΡΠ°ΠΏΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° runtime, Π½ΠΈΠ΅ ΡΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² Π΅ΡΠ°ΠΏΠ° Π½Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ Π² runtime.)
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄ΠΈΠ½Π½ΠΈ classpath Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ. ΠΡΡΠ°Π²Π° Π½ΠΈ ΡΠ°ΠΌΠΎ Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈΠΌ, ΡΠ΅ ΡΡΡΠΈΡΡ classpath Π΅ Π·Π°Π΅Ρ ΠΈ Π² runtime. (ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ classpath, ΡΠΎΠ²Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Ρ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ΡΠΎ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅.) Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ ΠΈΠ·Ρ ΠΎΠ΄Π½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π΅, ΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ classpath.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π΅ΡΠ°ΠΏΠΈ Π½Π° Π΅Π²ΠΎΠ»ΡΡΠΈΡ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²Π΅ΡΡΠΈΠΈ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅. Π ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅. ΠΠΊΠΎ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡΠΎΡΡΠΎ Π½ΠΎΠΌΠ΅Ρ Π½Π° Π²Π΅ΡΡΠΈΡ. ΠΠΊΠΎ ΠΎΠ±Π°ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, ΡΠ΅ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π°
ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° Π΅ΡΠΈΠΊΠ΅ΡΠ°, ΡΠ°Π·Π»ΠΈΡΠ½Π° ΠΎΡ Π²Π΅ΡΡΠΈΡΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠ»ΠΎΠ½Π°). Π’Π°ΠΊΠ° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡΠ½ΠΎ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΡΠ΅ΠΊΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ½ΠΈΠΊΠ°Π»Π½ΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π²ΡΠ·Π»ΠΈ, ΠΏΠΎΡΡΠΎΠ²Π΅, Π²ΡΠ½ΡΠ½ΠΈ ΡΠ΅ΡΡΡΡΠΈ ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ ΡΠ΅ ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΊΠ»ΠΎΠ½ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡ Π½Π°ΡΠΈΠ½ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡΠΈ ΡΠΈΡΠ»Π°, ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ Ρ ΡΠΎΡΠΊΠ° (1.2.3).
Π ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΡΡΠ½ΠΎ. ΠΠ°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π½Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ (Π·Π° Π΄Π° ). ΠΠ·Π½ΠΈΠΊΠ²Π° Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ΅Π½ Π²ΡΠΏΡΠΎΡ: Π·Π°ΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠΎΡΠΌΠ°Ρ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°? ΠΠ΄ΠΈΠ½ ΠΆΠΈΠ·Π½Π΅ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΠΊΠΎΠ΄ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΡΡΠ΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ°.
Π Π½Π°ΡΡΠΎΡΡΠΈΡ ΠΏΠΎΡΡ ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°ΠΌΠ΅ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡ.
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Π ΡΠΎΠ·ΠΈ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ°ΡΠΈΡΠ½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. Π Π΅Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΠ΅ Π΄Π²Π° ΠΏΡΠΎΡΡΠΈ ΡΡΠ»ΡΠ³ΠΈ β echo ΡΡΠ»ΡΠ³Π° ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π° echo ΡΡΠ»ΡΠ³Π°ΡΠ°. ΠΠ° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠ΅Π·ΠΈ Π΄Π²Π° ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Ρ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. Π Π΅Π΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π½Π° Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π», Π° Π² Π΄ΡΡΠ³ΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ β Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΡΠ΄ΡΡΠΆΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ·Π΅Π»Π°. ΠΡΠ·Π»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠΈΠΏ 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])ΠΊΡΠ΄Π΅ΡΠΎ ΠΠΎΡΡ β ΠΏΡΠΎΡΡΠΎ ΡΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ Int Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π½Π° Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ:
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]Π£ΡΠΎΡΠ½Π΅Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅
ΠΠΈΠΆΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈ . ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΊΡΠΌ ΡΠΈΠΏΠΎΠ²Π΅ΡΠ΅, ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Π½ΠΈ Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠ° ΡΠ° ΡΠ΅Π»ΠΈ 16-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΈΡΠ»Π°. ΠΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° refined Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΠ° 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-ΠΈΡΠ΅, Π°Π»Π³Π΅Π±ΡΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ). ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π½Π°ΡΡΠΎΡΡΠΈΡ ΠΏΠΎΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Cake Pattern ΠΈ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° traitβΠΈ. (Cake Pattern Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΎΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ Π΅Π΄Π½Π° ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.)
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²ΡΡΡΠ°Ρ ΠΏΠΎΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° 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)
}ΠΠ° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΅Ρ ΠΎ-ΡΠ΅ΡΠ²ΠΈΡ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΡΠ°ΠΌΠΎ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΠΏΠΎΡΡΠ° ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΡΠΎ, ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π΅Ρ ΠΎ-ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΠΎΠΆΠ΅Ρ ΠΌΠ΅ Π΄Π° Π½Π΅ ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΏΠΎΡΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ trait-ΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΄Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΠΌΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π±Π΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ (Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ). Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ ΡΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΡ Π½Π°Ρ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΏΠΎΡΡΠ°. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΌΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π΅ ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π΄ΡΡΠ³ ΠΏΠΎΡΡ. Π©Π΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΠΌΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π΅Ρ ΠΎ-ΡΠ΅ΡΠ²ΠΈΡΠ°:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° ΠΈΠΌΠ° ΡΡΡΠΈΡ ΡΠΈΠΏ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ echoService. Π ΡΠ°ΡΡΠ½ΠΎΡΡ, Π² Π΅Ρ
ΠΎ-ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠ·ΠΈΡΠΊΠ²Π°ΠΌΠ΅ ΡΡΡΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ». Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΏΡΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π²Π°ΡΠ° ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΠ²Π΅ΡΠ΅Π½ΠΈ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅
ΠΠ° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠ° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ. (ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΡΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠ° Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π²Π°ΠΆΠ½Π° Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ.) ΠΡΠ½ΠΎΠ²ΠΎ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° Π·Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°ΠΊΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ ΡΠΈΠΏΠΎΠ²Π΅, ΠΎΡΠ½ΠΎΠ²Π°Π²Π°ΡΠΈ ΡΠ΅ Π½Π° ΡΠΈΠΏΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ). ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π½Π°ΡΡΠΎΡΡΠΈΡ ΠΏΠΎΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Cake Pattern. Π©Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°Ρ 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]
}ΠΊΡΠ΄Π΅ΡΠΎ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡβ ΡΠΈΠΏ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° ΡΠΎΠ·ΠΈ ΡΠ΅ΡΠ²ΠΈΡAddressResolverβ ΠΎΠ±Π΅ΠΊΡ Π½Π° Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ (Π²ΠΆ. ΠΏΠΎ-Π΄ΠΎΠ»Ρ)
ΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠΈΠΏΠΎΠ²Π΅ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° cats:
F[_]β ΡΠΈΠΏ Π΅ΡΠ΅ΠΊΡ (Π² Π½Π°ΠΉ-ΠΏΡΠΎΡΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉF[A]ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ() => A. Π Π½Π°ΡΡΠΎΡΡΠΈΡ ΠΏΠΎΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅cats.IO.)Reader[A,B]β ΠΏΠΎ-Π±Π»ΠΈΠ·ΡΠΊ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΡA => Bcats.Resourceβ ΡΠ΅ΡΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½Timerβ ΡΠ°ΠΉΠΌΠ΅Ρ (ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠΏΠΈΠΌ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π΄Π° ΠΈΠ·ΠΌΠ΅ΡΠ²Π°ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ)ContextShiftβ Π°Π½Π°Π»ΠΎΠ³ExecutionContextApplicativeβ ΠΊΠ»Π°Ρ ΠΎΡ ΡΠΈΠΏ Π΅ΡΠ΅ΠΊΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π΅ΡΠ΅ΠΊΡΠΈ (ΠΏΠΎΡΡΠΈ ΠΌΠΎΠ½Π°Π΄Π°). Π ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Monad/ConcurrentEffect.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ°Π·ΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ²ΠΈΡ, ΠΊΠΎΠΉΡΠΎ Π½ΠΈΡΠΎ Π½Π΅ ΠΏΡΠ°Π²ΠΈ:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config 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 Π°Π΄ΡΠ΅Ρ. ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π°Π΄ΡΠ΅ΡΡΡ Π΄Π° ΡΡΠ°Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΎΡ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΡΠΎ Π·Π°ΡΠΎ Π½ΠΈ ΡΡΡΠ±Π²Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π΄Π° ΠΎΡΡΠ°Π·ΡΠ²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° Π²ΡΠ·Π΅Π»Π° Π² Π°Π΄ΡΠ΅Ρ:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΊΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΡ:
- ΠΠΊΠΎ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΡΡΠ°Π½Π°Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ΡΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ Scala ΠΊΠΎΠ΄ Ρ
Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. ΠΡΠΈ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΈ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΡ ΡΠ΅ΡΡΠΎΠ²Π΅.
Π ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π² ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΎΡΡΠ°Π·ΡΠ²Π°Π½Π΅Map[NodeId, NodeAddress]. - Π Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΈΡΡ Π°Π΄ΡΠ΅Ρ ΡΡΠ°Π²Π° ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΠ°ΠΌΠΎ ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ·Π΅Π»Π°.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ βΡΡΠ»ΡΠ³Π° Π·Π° ΠΎΡΠΊΡΠΈΡΠΈΠ΅β (discovery), ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ ΠΈ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Ρ Π² ΡΠ°Π·ΠΈ ΡΡΠ»ΡΠ³Π° ΠΈ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Ρ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ. - ΠΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°ΠΌΠ΅
/etc/hosts, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ ΠΎΡΡΠΎΠ²Π΅ (ΠΊΠ°ΡΠΎmy-project-main-nodeΠΈecho-backend) ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ ΡΠ΅Π·ΠΈ ΠΈΠΌΠ΅Π½Π°
Ρ IP Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ΡΠΎ.
Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π½Π°ΡΡΠΎΡΡΠΎΡΠΎ ΠΏΠΎΡΡ Π½ΠΈΠ΅ Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠ΅Π·ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ. ΠΠ° Π½Π°ΡΠΈΡ
ΠΈΠ³ΡΠ°ΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΠΈΠΌΠ°Ρ Π΅Π΄ΠΈΠ½ IP Π°Π΄ΡΠ΅Ρ β 127.0.0.1.
ΠΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°:
- Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π».
- Π ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Π΅Ρ ΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈ Π΅Ρ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° :
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π»
ΠΎΠ±Π΅ΠΊΡ SingleNodeConfig ΡΠ°Π·ΡΠΈΡΡΠ²Π° EchoConfig[String]
Ρ EchoClientConfig[String] Ρ FiniteDurationLifecycleConfig
{
ΡΠ»ΡΡΠ°ΠΉΠ΅Π½ ΠΎΠ±Π΅ΠΊΡ Singleton \/\/ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡ Π²ΡΠ·Π΅Π»
\/\/ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΡΠ²ΡΡΠ°
ΡΠΈΠΏ NodeId = Singleton.type
Π΄Π΅Ρ nodeId = Singleton
\/** Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ ΡΠΈΠΏ Π·Π° ΠΏΠΎΡΡ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°. *\/
ΠΏΡΠ΅ΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π΅Ρ portNumber: PortNumber = 8088
\/\/ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
\/** Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π° ΠΎΡ ΡΡΡΠΈΡ Ρ
ΠΎΡΡ. *\/
Π΄Π΅Ρ echoServiceDependency = echoService
ΠΏΡΠ΅ΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π΅Ρ testMessage: UrlPathElement = "hello"
Π΄Π΅Ρ pollInterval: FiniteDuration = 1.second
\/\/ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ° Π½Π° ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ»
Π΄Π΅Ρ lifetime: FiniteDuration = 10500.milliseconds \/\/ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ 0.5 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ 10 Π·Π°ΡΠ²ΠΊΠΈ, Π° Π½Π΅ 9.
}ΠΠ±Π΅ΠΊΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΈ Π½Π° ΡΡΡΠ²ΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ, Π·Π° Π΄Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠ»Π΅Π΄ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΆΠΈΠ·Π½Π΅Π½ ΡΠΈΠΊΡΠ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΄Π° ΡΠ΅ Π·Π°ΡΠ²ΠΎΡΠΈ. (Ctrl-C ΡΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ΡΡΡΡΠΈ.)
Π‘ΡΡΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ trait'ΠΎΠ²Π΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΡΡΠΎΡΡΠ° ΡΠ΅ ΠΎΡ :
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° Π΄Π²Π° Π²ΡΠ·Π΅Π»Π°
ΠΎΠ±Π΅ΠΊΡ NodeServerConfig ΡΠ°Π·ΡΠΈΡΡΠ²Π° EchoConfig[String] Ρ SigTermLifecycleConfig
{
ΡΠΈΠΏ NodeId = NodeIdImpl
Π΄Π΅Ρ nodeId = NodeServer
ΠΏΡΠ΅ΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π΅Ρ portNumber: PortNumber = 8080
}
ΠΎΠ±Π΅ΠΊΡ NodeClientConfig ΡΠ°Π·ΡΠΈΡΡΠ²Π° EchoClientConfig[String] Ρ FiniteDurationLifecycleConfig
{
\/\/ NB! ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ
Π΄Π΅Ρ echoServiceDependency = NodeServerConfig.echoService
Π΄Π΅Ρ pollInterval: FiniteDuration = 1.second
Π΄Π΅Ρ lifetime: FiniteDuration = 10500.milliseconds \/\/ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ 0.5 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ 10 Π·Π°ΡΠ²ΠΊΠΈ, Π° Π½Π΅ 9.
Π΄Π΅Ρ testMessage: String = "dolly"
}ΠΠ°ΠΆΠ½ΠΎ! ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³ΠΈ. ΠΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΎΡ Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π», ΠΊΠ°ΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π°-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ Π½Π° Π΄ΡΡΠ³ΠΈΡ Π²ΡΠ·Π΅Π». Π’ΠΈΠΏΡΡ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΡΠΈΠΏΠ° Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠ° ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΡΠ΅Π»Π΅Π²ΠΈΡ Π²ΡΠ·Π΅Π». ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡ Π΅ΠΌΠ° ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠ° ΡΠ°ΠΌΠΎ Π²Π΅Π΄Π½ΡΠΆ ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½ΠΎ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡ ΠΏΠΎΡΡ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π΄Π²Π° Π²ΡΠ·Π΅Π»Π° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°
ΠΠ° ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΡΠΈΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΡΡΠ»ΡΠ³ΠΈ, Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅, ΡΠ΅ ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΠΎΠ±Π΅ΠΊΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈ:
ΠΎΠ±Π΅ΠΊΡ TwoJvmNodeServerImpl ΡΠ°Π·ΡΠΈΡΡΠ²Π° ZeroServiceImpl[IO] Ρ EchoServiceService ΠΈ SigIntLifecycleServiceImpl {
ΡΠΈΠΏ Config = EchoConfig[String] Ρ SigTermLifecycleConfig
}
ΠΎΠ±Π΅ΠΊΡ TwoJvmNodeClientImpl ΡΠ°Π·ΡΠΈΡΡΠ²Π° ZeroServiceImpl[IO] Ρ EchoClientService ΠΈ FiniteDurationLifecycleServiceImpl {
ΡΠΈΠΏ Config = EchoClientConfig[String] Ρ FiniteDurationLifecycleConfig
}ΠΡΡΠ²ΠΈΡΡ Π²ΡΠ·Π΅Π» ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΡΡΠ²ΡΡ ΠΈ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΡΠ°ΠΌΠΎ ΠΎΡ ΡΡΡΠ²ΡΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΡΠΎΡΠΈΡΡ Π²ΡΠ·Π΅Π» ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄ΡΡΠ³Π° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΈ Π΄Π²Π°ΡΠ° Π²ΡΠ·Π΅Π»Π° ΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡ ΠΎΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΆΠΈΠ·Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΡΠ». Π‘ΡΡΠ²ΡΡΠ½ΠΈΡΡ Π²ΡΠ·Π΅Π» ΡΠ°Π±ΠΎΡΠΈ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ Π΄ΡΠ»Π³ΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅ ΡΠΏΠΈΡΠ°Π½ SIGTERMΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΡ Π²ΡΠ·Π΅Π» Π·Π°Π²ΡΡΡΠ²Π° ΡΠ»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠΈΠΆΡΠ΅ .
ΠΠ±ΡΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°
ΠΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π²Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ±ΡΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΎΡΡΠ°Π½Π°Π»ΠΈΡ ΠΊΠΎΠ΄ ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ (.jar). Π―Π²Π½ΠΎ Π΅ ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ. Π’ΠΎΠ²Π° Π΅ ΡΠ²ΡΡΠ·Π°Π½ΠΎ Ρ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΠΊΠΎΠ΄. ΠΡΠ½ΠΎΠ²ΠΎ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ°Π΅Π΄Π½ΠΎ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅ ΠΈ ΡΠ΅Π·ΠΈ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈ Π΄Π° ΡΠ΅ΡΠΈΠΌ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ ΡΠ°Π·ΠΈ Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ° Π² ΠΏΡΠΎΠΌΡΠ½Π° Π² ΠΊΠΎΠ΄Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π²ΡΡΠΊΠ° ΡΠ°ΠΊΠ°Π²Π°
ΠΏΡΠΎΠΌΡΠ½Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΠ±Ρ
Π²Π°Π½Π°ΡΠ° ΠΎΡ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ:
ΠΠΈΠ»Π΅Ρ Π² Π±Π°Π³ΡΡΠ°ΠΊΠ΅ΡΠ° -> PR -> ΠΏΡΠ΅Π³Π»Π΅Π΄ -> ΡΠ»ΠΈΠ²Π°Π½Π΅ Ρ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΈΡΠ΅ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ ->
ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ -> ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΎΡ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π° Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ ΡΡΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΡ Π΅Π΄ΠΈΠ½ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ°ΠΌΠΎ Π² Π΅Π΄ΠΈΠ½ ΠΎΡ Π²ΡΠ·Π»ΠΈΡΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ βΠ΄ΠΈΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°β (configuration drift) Π΅ ΠΌΠ°Π»ΠΊΠΎ Π²Π΅ΡΠΎΡΡΠ½Π°.
Π‘ΡΠ°Π²Π° Π²ΡΠ΅ ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΌΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΎΠ±ΡΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ Π½Π° ΡΠ΅Π²Ρ.
ΠΡΠΆΠ΅Π½ Π»ΠΈ Π΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° production ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°? Π ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈ Π΄ΡΡΠ³Π° ΡΠ΅ΠΊΡΠ΅ΡΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π΄ΠΎΡΡΡΠΏΡΡ Π΄ΠΎ ΠΊΠΎΡΡΠΎ Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠΌ. ΠΡΡ ΠΎΠ΄Ρ ΠΎΡ ΡΠΎΠ²Π°, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ β Π΅Π΄Π½Π°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, ΠΈ Π΄ΡΡΠ³Π°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ. Π’ΠΎΠ²Π° ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π΄Π° ΠΈΠΌΠ°Ρ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΎΠ±ΡΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. Π’Π°ΠΊΠΎΠ²Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ trait-ΠΎΠ²Π΅, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΈ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΡΠ°Π²Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Ρ Π½ΡΠΊΠΎΠΈ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΈ:
- Π’Π΅ΠΊΡΡΠΎΠ² ΡΠ°ΠΉΠ» Π½Π° ΡΠ΅Π»Π΅Π²Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
- Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ (
etcd/zookeeper). - ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ/ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈ Π±Π΅Π· ΡΠ΅Π±ΡΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°.
- Π‘ΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈΠ·Π²ΡΠ½ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π²Π΅ΡΡΠΈΠΈΡΠ΅.
Π’Π΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΌΠ°Π»ΠΊΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π»Π΅Π·Π΅ Π² ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ Π²ΡΠ·Π΅Π», Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ°. ΠΠ° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΎΠ±Π°ΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½Π°. ΠΡ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ ΠΎΡΡΠ°Π²Π°Ρ ΡΠ»Π΅Π΄ΠΈ Π² Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠΈΠΊΠΎΠΉ Π½Π΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅. Π’ΡΡΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈ ΠΊΠΎΠΉ ΡΠΎΡΠ½ΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π°. ΠΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΡΠ΅ΡΡΠ²Π°Ρ. ΠΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±ΡΠ°Π²ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ.
(Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π±ΡΠ΄Π΅ΡΠ΅. ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΠ°ΡΡΠ΅Ρ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ, ΠΊΠΎΠΈΡΠΎ Π΄Π° Π΄Π°Π²Π°Ρ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π° ΡΡΡΠΈΡ ΡΠΈΠΏ ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΡΡΡΠΊ ΡΠ»Π΅Π΄Π²Π°, ΡΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π·Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΠΊΠΎΠ΄.)
Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ Π΅ Π΄ΠΎΠ±ΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅ΡΠ°-ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ - ΠΏΡΠΎΡΡΠΎ Π΄Π°Π½Π½ΠΈ. ΠΠ΅ΠΊΠ° ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡ C => A => B, ΠΊΠ°ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ C ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ, Π° Π΄Π°Π½Π½ΠΈΡΠ΅ A β ΡΠ΅ΡΡΠΎ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ C β ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π° A β Π΄Π°Π½Π½ΠΈ. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΏΠΎ ΡΠΎΠ²Π°, ΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΏΠΎ-ΡΡΠ΄ΠΊΠΎ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ΄Π²Π°Ρ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ (ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ), Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ - ΠΎΡ Π΄ΡΡΠ³ (ΠΎΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°).
ΠΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Ρ Π±Π΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠΎ ΡΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π° ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π΄Π° Π΄ΠΎΡΡΠ°Π²ΡΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, Π΄Π° Π³ΠΈ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅, ΠΏΠ°ΡΡΠ²Π°ΠΌΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅, ΠΈ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ Π±ΡΠΎΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠΎ Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ°ΠΊΠΈΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ).
ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Π½Π°ΡΡΠΎΡΡΠΈΡ ΠΏΠΎΡΡ, ΡΠ΅ ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠΈΠΌ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. ΠΠΊΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ΠΌ ΡΠ΅Π·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ. Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΠ° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½Π° ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°Π»ΠΎΠΆΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΡΡΠΈ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Ρ Π½ΠΎΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠΈΡΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. (ΠΠΎ Π½Π°ΡΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, Π΅ ΠΆΠ΅Π»Π°ΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΡΠ³Π²Π° ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π°ΡΠ°ΡΡΠ²Π°. ΠΠΊΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΠΠ‘ Π·Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅.)
ΠΠ΄ΠΈΠ½ ΠΎΡ Π²Π°ΠΆΠ½ΠΈΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΊΠ°ΡΠ° Ρ ΠΎΡΠ°ΡΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎΡΠΎ ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅, Π΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΠ»Π΅Π΄ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° (downtime). ΠΡΡΡΠ½ΠΎΡΡ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΡΠ°ΡΠΈΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π·Π° Π΄Π° Π²Π»ΡΠ·Π°Ρ Π½ΠΎΠ²ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π² ΡΠΈΠ»Π°. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Ρ downtime-Π° ΠΈΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ½Π° ΠΎΡΡΡΠΎΡΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. Π Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΎ Π·Π° Π²ΡΠ΅ΠΌΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΡΡΠ»ΡΠ³Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° . ΠΠΎΠ³Π°ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΠ°Π»Π΅Π»Π΅Π½ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°ΠΌΠ΅ Π±Π°Π»Π°Π½ΡΠΈΡΠ°ΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ ΠΊΡΠΌ Π½Π΅Π³ΠΎ ΠΈ ΠΈΠ·ΡΠ°ΠΊΠ²Π°ΠΌΠ΅, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ Π²ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈΠΊΠ»ΡΡΠ°Ρ. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ°ΡΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈΠΊΠ»ΡΡΠ°Ρ, ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°ΠΌΠ΅ ΡΡΠ°ΡΠΈΡ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
ΠΠ΅ΠΊΠ° ΡΠ΅Π³Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠΏΡΠΎΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π²ΡΡΡΠ΅ Π² Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° ΠΈΠ»ΠΈ ΠΈΠ·Π²ΡΠ½ Π½Π΅Π³ΠΎ. ΠΠΊΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π²ΡΡΡΠ΅ Π² Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ°, ΠΏΠΎΠ½Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ Π² ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΈΠ·Π²ΡΠ½ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡ, Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ ΠΊΠΎΠΉ ΠΈ Π·Π°ΡΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ». ΠΠ°ΠΊΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΎΠ²Π°? ΠΠ° Π½Π°ΡΠ΅ΡΠΎ ΠΌΠ½Π΅Π½ΠΈΠ΅, Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ production ΡΠΈΡΡΠ΅ΠΌΠΈ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΈΠΌΠ°Ρ ΡΡΠ°Π±ΠΈΠ»Π½Π° ΠΈ Π²ΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
ΠΠ΅ΡΡΠΈΡ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΊΠΎΠ³Π° Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½, ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΡΠ΄ΡΡΠΆΠ°, ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ/ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈ ΠΈ ΠΊΠΎΠΉ Π½ΠΎΡΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ Π·Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΡΠΈΠ»ΠΈΡ, Π·Π°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ΅ ΠΎΡΡΠ·Π½Π°ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
ΠΠ° ΠΈ ΠΏΡΠΎΡΠΈΠ²
ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΡΠ΅ ΡΠΏΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π½Π°ΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ.
ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°
ΠΠΎ-Π΄ΠΎΠ»Ρ Π΅ ΡΠΏΠΈΡΡΠΊ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°:
- Π‘ΡΠ°ΡΠΈΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΊΠΎΡΠ΅ΠΊΡΠ½Π°. - ΠΠΎΠ³Π°Ρ Π΅Π·ΠΈΠΊ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π΄ΠΎ ΠΏΠΎΠ΄ΠΌΡΠ½Π° Π½Π° ΡΡΡΠΈΠ½Π³ΠΎΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. ΠΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Scala ΡΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠΈΡΠΎΠΊ ΡΠΏΠ΅ΠΊΡΡΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅
trait'ΠΎΠ²Π΅ Π·Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Π΄Π° Π³ΡΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π΅ΠΌ Π½Π° val'ΠΎΠ²Π΅, ΠΎΠ±ΡΠ²Π΅Π½ΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎ Π²Π΅Π΄Π½ΡΠΆ (DRY) Π² ΠΎΠ±Ρ Π²Π°ΡΠ°ΡΠ°ΡΠ° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ. ΠΠΎΠΆΠ΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΄Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅ (Seq,Map, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅). - DSL. Π Scala ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΡΠ»Π΅ΡΠ½ΡΠ²Π°ΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° DSL. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ ΡΠ΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΅Π·ΠΈΠΊ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π΅Π½ Π·Π° ΡΠ΅Π»Π΅Π²Π°ΡΠ° Π³ΡΡΠΏΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ½Π΅ ΡΠ΅ΡΠΈΠΌΠ° ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈΡΠ΅ Π² ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΠΎΠ±Π»Π°ΡΡ. Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΡΠ°ΡΡΠ²Π°Ρ Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
- Π¦ΡΠ»ΠΎΡΡΠ½ΠΎΡΡ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅. ΠΠ΄Π½ΠΎ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΡΠ»Π°ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π½Π° Π΅Π΄Π½ΠΎ ΠΌΡΡΡΠΎ, Π΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΡΠ΅ ΠΎΠ±ΡΠ²ΡΠ²Π°Ρ ΡΠΎΡΠ½ΠΎ Π²Π΅Π΄Π½ΡΠΆ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π½ΡΠΎΠΌΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π·Π° ΠΎΠ±ΡΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠΎΠ²Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π²ΡΠ·Π»ΠΈΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ½ΠΈ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
- ΠΠΈΡΠΎΠΊΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡΠ°. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½ΠΈ Ρ ΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, ΠΏΡΠ°Π²ΡΡ Π²ΠΈΡΠΎΠΊΠΈΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
- Π‘ΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠ»Π΅Π΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΠ±Π½ΠΎΠ²Π΅Π½ΠΈ.
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΠ°ΡΡΠΈΠ½Π³, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ. Π’ΠΎΠ²Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. (ΠΡΠΊΠΎΠΈ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, Π½Π°Π±Π»ΡΠ΄Π°Π²Π°Π½ΠΈ Π² Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ ΡΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠ΅ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π° ΡΠ°ΠΌΠΎ ΠΎΡΡΠ·Π½Π°ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠ΄Π΅Π½ΠΎ ΠΎΡ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΡΠΎ Π·Π° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ.) ΠΠ΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊΡΠΌ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ β ΠΏΡΠΎΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΠΎΡΡΡΡΡΠ²Π°ΡΠΈΡΠ΅ ΡΠ°ΡΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΎΡΠ»Π°Π³Π°ΠΉΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π°ΠΈΡΡΠΈΠ½Π° ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ.
- ΠΠ΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ»Π΅Π΄Π²Π°Ρ ΡΡΡΠ°ΡΠ° ΡΡΠ΄Π±Π° ΠΊΠ°ΡΠΎ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ Π΄ΡΡΠ³ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π² ΠΊΡΠ°Ρ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Ρ ΡΠ½ΠΈΠΊΠ°Π»Π½Π° Π²Π΅ΡΡΠΈΡ. Π’ΠΎΠ²Π° Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΏΡΠ΅Π΄ΠΈΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ. ΠΠΎΠΆΠ΅ΠΌ Π΄ΠΎΡΠΈ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΡ ΠΏΡΠ΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠ°. Π‘ΡΠ°Π±ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½Π° Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, ΡΡ Π΅ Π΄ΠΎΡΡΠ° ΡΡΡΠ΄Π½Π° Π·Π° ΡΠ°Π»ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ.
- ΠΠΎΠ΄ΡΠ»Π°ΡΠ½ΠΎΡΡ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΡ ΡΡΠ΅ΠΉΠΌΡΡΡΠΊ Π΅ ΠΌΠΎΠ΄ΡΠ»Π΅Π½, ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠΈ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. Π ΡΠ°ΡΡΠ½ΠΎΡΡ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ Π²ΡΠ·Π΅Π» Π² Π΅Π΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ, Π° Π² Π΄ΡΡΠ³ β Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²ΡΠ·Π»ΠΈ. ΠΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
- Π’Π΅ΡΡΠΈΡΠ°Π½Π΅. ΠΠ°ΠΌΠ΅ΡΡΠ²Π°ΠΉΠΊΠΈ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ Ρ mock-ΠΎΠ±Π΅ΠΊΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΡΠ΄ΠΎΠ±Π½ΠΈ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅.
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΠ»Π°ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π° ΡΡΠ΅Π΄Π° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅. ΠΠ΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΅ΠΌΡΠ»ΠΈΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ Π½ΡΠΊΠΎΠΈ Π²ΡΠ·Π»ΠΈ ΡΡΠ°Π²Π°Ρ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΈ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ ΠΈ Π·Π° Π½ΡΠΊΠΎΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ°. ΠΠΎ-Π΄ΠΎΠ»Ρ ΡΠ° ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π½ΡΠΊΠΎΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ:
- Π‘ΡΠ°ΡΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π±ΡΡΠ·ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΎΠ½Π½Π° ΡΡΠ΅Π΄Π°, ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΉΠΊΠΈ Π²ΡΠΈΡΠΊΠΈ Π·Π°ΡΠΈΡΠ½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ. Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-ΡΡΡΠ΄Π½ΠΎ. ΠΠ°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ. Π’ΠΎΠ²Π° Π΅ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ Π² Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ.
- ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΡ ΡΠ°ΠΉΠ» ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΎΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°Π»ΠΎΠΆΠ°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΡΠΈΠ»ΠΈΡ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΡΠ±ΠΎΡΠΊΠ°.
- ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΡΠΈΠ»ΠΈΡΠΈΡΠ΅ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠ° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΊΠΈΠ²Π° ΡΡΠΈΠ»ΠΈΡΠΈ/ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π½Π°Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
- ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Π³Π»Π°ΡΠΈΡΠ΅. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΈ DevOps ΡΠ° ΡΠ²ΠΈΠΊΠ½Π°Π»ΠΈ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π‘Π°ΠΌΠ°ΡΠ° ΠΈΠ΄Π΅Ρ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΠ½ΡΠΊΡΠ΄Π΅ Π½Π΅ΠΎΡΠ°ΠΊΠ²Π°Π½Π° ΠΈ Π½Π΅ΡΠΈΠΏΠΈΡΠ½Π°, ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΉΠΊΠΈ ΠΎΡΡ Π²ΡΡΠ»ΡΠ½Π΅.
- ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΅ Π²ΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ° Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡΠ»Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ±ΠΎΡΠΊΠ° ΠΈ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ (CI/CD). Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ° Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ.
Π©Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅Π΄ΠΈΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
- ΠΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΈΠ·Π»ΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ Π²ΡΠ·Π΅Π»Π°, ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π½ΡΠΌΠ° Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΠΌ ΠΎΡΡΡΡΡΠ²ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. Π’ΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½, Π°ΠΊΠΎ ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΎΡ Cake Pattern ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠΎ-ΡΡΡΠΎΠ³ΠΈ ΡΠΈΠΏΠΎΠ²Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
HListΠΈΠ»ΠΈ Π°Π»Π³Π΅Π±ΡΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ (case ΠΊΠ»Π°ΡΠΎΠ²Π΅) Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. - Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» ΠΈΠΌΠ° Π½ΠΈΠ·ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΠΎΡΠ½Π°ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°: (
ΠΏΠ°ΠΊΠ΅Ρ,import, Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ;ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌ defΠΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Ρ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ). Π§Π°ΡΡΠΈΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅, Π°ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠ²ΠΎΠΉ DSL. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π΄ΡΡΠ³ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, XML) ΡΡΡΠΎ Π½Π°Π»Π°Π³Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΡΠ°ΠΉΠ»Π°. - Π ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½Π°ΡΠ° ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠΈ ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π²ΡΠ·Π»ΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΡΠΈΠΏΠΈΡΠ½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π° Scala. Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΊΠ°ΡΠΎ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° xml ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π½Π°ΡΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π½Π° Scala, ΡΡΡΠΈΡΠ΅ ΠΈΠ΄Π΅ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½ΠΈ Π² Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠΈ Π΅Π·ΠΈΡΠΈ (ΠΊΠ°ΡΠΎ Kotlin, C#, Swift ΠΈ Ρ.Π½.). Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΈΡΠ°Π½ Π² Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ, Π°ΠΊΠΎ Π½Π΅ ΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ, Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π΄ΠΎΠ±Π°Π²ΡΠΉΠΊΠΈ Π»ΠΈΠΏΡΠ²Π°ΡΠΈΡΠ΅ Π΄Π΅ΡΠ°ΠΉΠ»ΠΈ.
ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π²ΠΈΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. Π Π·Π°ΠΌΡΠ½Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π²ΠΈΡΠΎΠΊΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅.
Π Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½:
- ΠΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ°ΠΊΡΠΎΡΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ.
- ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° DSL Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ Π·Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
- ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π±ΡΠΎΡ Π½Π° Π²ΡΠ·Π»ΠΈΡΠ΅ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° (1) Π²ΡΠ΅ΠΊΠΈ Π²ΡΠ·Π΅Π» ΠΏΠΎΠ»ΡΡΠΈ ΠΌΠ°Π»ΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ; (2) ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΡΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π½ΠΎΠ²ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΠ½Π΄ΡΠ΅ΠΉ Π‘Π°ΠΊΡΠΎΠ½ΠΎΠ², ΠΠ°Π²Π΅Π» ΠΠΎΠΏΠΎΠ² ΠΈ ΠΠ½ΡΠΎΠ½ ΠΠ΅Ρ Π°Π΅Π² Π·Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½Π°ΡΠ° ΠΊΡΠΈΡΠΈΠΊΠ° Π½Π° ΡΠ΅ΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
