БоставСна ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° дистрибуиран систСм

Π‘ΠΈ сакал Π΄Π° Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ Π΅Π΄Π΅Π½ интСрСсСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° дистрибуиран систСм. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΅ прСтставСна Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ јазик (Scala) ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ. Овој пост Π΄Π°Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚Π°ΠΊΠ²Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΈ дискутира Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ аспСкти Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π²ΠΎ сСвкупниот Ρ€Π°Π·Π²ΠΎΡ˜Π΅Π½ процСс.

БоставСна ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° дистрибуиран систСм

(англиски)

Π’ΠΎΠ²Π΅Π΄

Π˜Π·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° Π½Π° сигурСн дистрибуиран систСм Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° ситС јазли ја користат ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, синхронизирана со Π΄Ρ€ΡƒΠ³ΠΈ јазли. DevOps Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΡ‚Π΅ (terraform, 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]]

Π Π°Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ

Π’ΠΈΠ΄ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π°Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ ΠΈ ΠΌΠΎΡ˜ΠΎΡ‚ ΠΈΠ·Π²Π΅ΡˆΡ‚Π°Ρ˜. Накратко, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π΄ΠΎΠ΄Π°Π²Π°Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ° Π½Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°Π°Ρ‚ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°ΡšΠ΅. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Π²Π°ΠΆΠ΅Ρ‡ΠΊΠΈΡ‚Π΅ врСдности Π½Π° Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° сС 16-Π±ΠΈΡ‚Π½ΠΈ Ρ†Π΅Π»ΠΈ Π±Ρ€ΠΎΠ΅Π²ΠΈ. Π—Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π°Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ Π΅ Π·Π°Π΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎ, Π½ΠΎ ја ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΡƒΠ²Π° способноста Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ Π΄Π° ја ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°.

Π—Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ‚Π΅ 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.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° услугата Π΅ опишана со ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата, ΠΏΠΎΡ€Ρ‚ΠΈΡ‚Π΅ ΠΈ зависноститС. ОвиС Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ прСтставСни Π²ΠΎ Π‘ΠΊΠ°Π»Π° Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π½Π°Ρ‡ΠΈΠ½ΠΈ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 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)
  }

Π—Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ услуга Π·Π° Π΅Ρ…ΠΎ, сС ΡˆΡ‚ΠΎ Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΅ Π±Ρ€ΠΎΡ˜ Π½Π° ΠΏΠΎΡ€Ρ‚Π° ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΈΡΡ‚Π°Π½ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ Π³ΠΎ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΡ‚ Π·Π° Π΅Ρ…ΠΎ. МоТСби Π½Π΅ΠΌΠ° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° ΠΏΠΎΡ€Ρ‚Π°, бидСјќи ... карактСристикитС Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π°Π°Ρ‚ Π΄Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π±Π΅Π· ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° (апстрактни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ). Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ΠΏΡ€ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ ќС Π±Π°Ρ€Π° ΠΎΠ΄ нас Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° апстрактниот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ Π±Ρ€ΠΎΡ˜ Π½Π° ΠΏΠΎΡ€Ρ‚Π°. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π²ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚, ΠΏΡ€ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎΡ€Ρ‚Π°. ЌС сС користи стандардната врСдност.

Π’ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚, прогласувамС зависност ΠΎΠ΄ услугата Π΅Ρ…ΠΎ:

  trait EchoClientConfig[A] {
    def testMessage: String = "test"
    def pollInterval: FiniteDuration
    def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
  }

Зависноста Π΅ ΠΎΠ΄ ист Ρ‚ΠΈΠΏ ΠΊΠ°ΠΊΠΎ ΠΈ ΠΈΠ·Π²Π΅Π·Π΅Π½Π°Ρ‚Π° услуга echoService. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, Π²ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ echo Π³ΠΎ Π±Π°Ρ€Π°ΠΌΠ΅ истиот ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π—Π°Ρ‚ΠΎΠ°, ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄Π²Π΅ услуги, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ΠΌΠ΅ сигурни Π΄Π΅ΠΊΠ° сè ќС Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.

Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° услуги

ΠŸΠΎΡ‚Ρ€Π΅Π±Π½Π° Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π·Π° Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π·Π°ΠΏΠΈΡ€Π°ΡšΠ΅ Π½Π° услугата. (Бпособноста Π΄Π° сС Π·Π°ΠΏΡ€Π΅ услугата Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π° Π·Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅.) ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΎΠΏΡ†ΠΈΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ‚Π°ΠΊΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»Π΅ Π΄Π° користимС класи Π½Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π²Ρ€Π· основа Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°). Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° ΠΎΠ²Π°Π° објава ќС Π³ΠΎ користимС ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ Π·Π° Ρ‚ΠΎΡ€Ρ‚Π°. ЌС ја прСтставувамС услугата ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ класа 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](()))
  }

(Π¦ΠΌ. ΠΈΠ·Π²ΠΎΡ€, Π²ΠΎ кој сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈ услуги - Π΅Ρ…ΠΎ услуга, Π΅Ρ…ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚
ΠΈ Π΄ΠΎΠΆΠΈΠ²ΠΎΡ‚Π½ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈ.)

Јазол Π΅ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° стартува Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ услуги (ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΡΠΈΠ½ΡŸΠΈΡ€ Π½Π° рСсурси Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΎ со ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ Π½Π° Ρ‚ΠΎΡ€Ρ‚Π°):

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]]
}

ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° ΡΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ²Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°:

  1. Ако адрСситС Π½ΠΈ станат ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ ΠΏΡ€Π΅Π΄ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Scala ΠΊΠΎΠ΄ со
    адрСси ΠΈ ΠΏΠΎΡ‚ΠΎΠ° ΠΈΠ·Π²Ρ€ΡˆΠ΅Ρ‚Π΅ ја ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π°. Ова ќС ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π° ΠΈ ќС ΠΈΠ·Π²Ρ€ΡˆΠΈ тСстови.
    Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚Π° статички ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ прСтставСна Π²ΠΎ ΠΊΠΎΠ΄ ΠΊΠ°ΠΊΠΎ ΠΌΠ°ΠΏΠΈΡ€Π°ΡšΠ΅ Map[NodeId, NodeAddress].
  2. Π’ΠΎ Π½Π΅ΠΊΠΎΠΈ случаи, вистинската адрСса Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚Π° само ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС Π·Π°ΠΏΠΎΡ‡Π½Π΅ Ρ˜Π°Π·ΠΎΠ»ΠΎΡ‚.
    Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ β€žΡƒΡΠ»ΡƒΠ³Π° Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅β€œ која Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π΅Π΄ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ јазли ΠΈ ситС јазли ќС сС рСгистрираат со ΠΎΠ²Π°Π° услуга ΠΈ ќС ΠΏΠΎΠ±Π°Ρ€Π°Π°Ρ‚ адрСси Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ јазли.
  3. Ако ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌΠ΅ /etc/hosts, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° користитС ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ имиња Π½Π° домаќини (ΠΊΠ°ΠΊΠΎ my-project-main-node ΠΈ echo-backend) ΠΈ Сдноставно ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ Π³ΠΈ ΠΎΠ²ΠΈΠ΅ имиња
    со IP адрСси Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ.

Π’ΠΎ овој пост Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ случаи ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ. Π—Π° Π½Π°ΡˆΠΈΡ‚Π΅
Π²ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ³Ρ€Π°Ρ‡ΠΊΠΈ, ситС јазли ќС ΠΈΠΌΠ°Π°Ρ‚ иста IP адрСса - 127.0.0.1.

Π‘Π»Π΅Π΄Π½ΠΎ, Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ Π΄Π²Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π·Π° дистрибуиран систСм:

  1. ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ситС услуги Π½Π° Π΅Π΄Π΅Π½ јазол.
  2. И Ρ…ΠΎΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° услугата Π΅Ρ…ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ Π·Π° Π΅Ρ…ΠΎ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ јазли.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π·Π° Π΅Π΄Π΅Π½ јазол:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° Π΅Π΄Π΅Π½ јазол

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"
  }

Π’Π°ΠΆΠ½ΠΎ! Π—Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ услугитС сС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ. НазначувамС услуга ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° ΠΎΠ΄ Π΅Π΄Π΅Π½ јазол ΠΊΠ°ΠΊΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ Π½Π° зависност Π½Π° Π΄Ρ€ΡƒΠ³ јазол. Π’ΠΈΠΏΠΎΡ‚ Π½Π° зависност Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚, бидСјќи Π³ΠΎ содрТи Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Кога ќС сС ΠΈΠ·Π²Ρ€ΡˆΠΈ, зависноста ќС Π³ΠΎ содрТи Ρ‚ΠΎΡ‡Π½ΠΈΠΎΡ‚ ID Π½Π° Ρ†Π΅Π»Π½ΠΈΠΎΡ‚ јазол. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ²Π°Π° шСма, Ρ‚ΠΎΡ‡Π½ΠΎ Сднаш Π³ΠΎ ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΈΡΡ‚Π°Π½ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ ΠΈ сСкогаш Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ќС сС однСсува Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° ΠΏΠΎΡ€Ρ‚Π°.

Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Π΄Π²Π° систСмски јазли

Π—Π° ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, Π³ΠΈ користимС иститС сСрвисни ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π±Π΅Π· ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. ЕдинствСната Ρ€Π°Π·Π»ΠΈΠΊΠ° Π΅ Π²ΠΎ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ сСга ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ ΠΊΠΎΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€ΡƒΠΏΠΈ Π½Π° услуги:

  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). Π‘Π΅ Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° смисла Π΄Π° сС стави ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ посСбСн Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚. Π’ΠΎΠ° Π΅ Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ повСќС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²Ρ€Π· основа Π½Π° истиот ΠΊΠΎΠ΄. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π°Ρ‚ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΈ ΡˆΡ‚ΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ конфигурациски Π³Ρ€Π°Π½ΠΊΠΈ. ЗависноститС ΠΎΠ΄ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π²Π΅Ρ€Π·ΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ сС Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΈ ΠΎΠ²ΠΈΠ΅ Π²Π΅Ρ€Π·ΠΈΠΈ сС Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°Π°Ρ‚ засСкогаш сСкогаш ΠΊΠΎΠ³Π° ќС ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠΌΠ΅ Π΄Π° ја распорСдимС Ρ‚Π°Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°.

БСкоја ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° сС ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€Π° Π²ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚. И Π·Π°Ρ‚ΠΎΠ°, сСкој
ΠΏΡ€ΠΎΠΌΠ΅Π½Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΠΊΡ€ΠΈΠ΅Π½Π° со Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΈΠΎΡ‚ процСс Π·Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ ΠΊΠ²Π°Π»ΠΈΡ‚Π΅Ρ‚:

Π‘ΠΈΠ»Π΅Ρ‚ Π²ΠΎ Ρ‚Ρ€Π°ΠΊΠ΅Ρ€ΠΎΡ‚ Π·Π° Π±ΡƒΠ±Π°Ρ‡ΠΊΠΈ -> ПР -> ΠΏΡ€Π΅Π³Π»Π΅Π΄ -> ΡΠΏΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ со соодвСтнитС Π³Ρ€Π°Π½ΠΊΠΈ ->
ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π° -> Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅

Π“Π»Π°Π²Π½ΠΈΡ‚Π΅ послСдици ΠΎΠ΄ ΡΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° сС:

  1. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ конзистСнтна Π½ΠΈΠ· ситС јазли Π½Π° дистрибуираниот систСм. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ ситС јазли Π΄ΠΎΠ±ΠΈΠ²Π°Π°Ρ‚ иста ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΈΠ·Π²ΠΎΡ€.

  2. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΅ Π΄Π° сС смСни ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° само Π²ΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ Ρ˜Π°Π·Π»ΠΈΡ‚Π΅. Π—Π°Ρ‚ΠΎΠ°, β€žΠΏΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°β€œ Π΅ ΠΌΠ°Π»ΠΊΡƒ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ.

  3. Π‘Ρ‚Π°Π½ΡƒΠ²Π° ΠΏΠΎΡ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС ΠΏΡ€Π°Π²Π°Ρ‚ ΠΌΠ°Π»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°.

  4. ΠŸΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ќС сС случат ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ Ρ†Π΅Π»ΠΎΠΊΡƒΠΏΠ½ΠΈΠΎΡ‚ процСс Π½Π° Ρ€Π°Π·Π²ΠΎΡ˜ ΠΈ ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π½Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄.

Π”Π°Π»ΠΈ ΠΌΠΈ Ρ‚Ρ€Π΅Π±Π° посСбно ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°? Оваа ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΌΠΎΠΆΠ΅ Π΄Π° содрТи Π»ΠΎΠ·ΠΈΠ½ΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ чувствитСлни ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π΄ΠΎ ΠΊΠΎΠΈ Π±ΠΈ сакалС Π΄Π° Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠΌΠ΅ пристапот. Π’Ρ€Π· основа Π½Π° ΠΎΠ²Π°, сС Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° смисла Π΄Π° сС складира ΠΊΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π²ΠΎ посСбно ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π΄Π²Π° Π΄Π΅Π»Π° - Π΅Π΄Π΅Π½ ΡˆΡ‚ΠΎ содрТи јавно достапни поставки Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΈ Π΅Π΄Π΅Π½ ΡˆΡ‚ΠΎ содрТи ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ поставки. Ова ќС ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ Π΄Π° ΠΈΠΌΠ°Π°Ρ‚ пристап Π΄ΠΎ Π·Π°Π΅Π΄Π½ΠΈΡ‡ΠΊΠΈΡ‚Π΅ поставки. Ова Ρ€Π°Π·Π΄Π²ΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ Π΅ лСсно Π΄Π° сС постигнС со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° срСдни особини ΠΊΠΎΠΈ содрТат стандардни врСдности.

МоТни Π²Π°Ρ€ΠΈΡ˜Π°Ρ†ΠΈΠΈ

АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° ја спорСдимС ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° со Π½Π΅ΠΊΠΎΠΈ Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΈ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΈ:

  1. ВСкстуална Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π½Π° Ρ†Π΅Π»Π½Π°Ρ‚Π° машина.
  2. Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° ΠΏΡ€ΠΎΠ΄Π°Π²Π½ΠΈΡ†Π° со врСдност Π½Π° ΠΊΠ»ΡƒΡ‡ΠΎΡ‚ (etcd/zookeeper).
  3. ΠŸΡ€ΠΎΡ†Π΅Ρ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π°Ρ‚/рСстартираат Π±Π΅Π· Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° процСсот.
  4. Π—Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π°Ρ‚Π° Π½Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΈ Π²Π΅Ρ€Π·ΠΈΡ˜Π°.

ВСкстуалнитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°Π°Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° флСксибилност Π²ΠΎ однос Π½Π° ΠΌΠ°Π»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. Администраторот Π½Π° систСмот ΠΌΠΎΠΆΠ΅ Π΄Π° сС најави Π²ΠΎ ΠΎΠ΄Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈΠΎΡ‚ јазол, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ соодвСтнитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΄Π° ја рСстартира услугата. ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ систСми, Ρ‚Π°ΠΊΠ²Π°Ρ‚Π° флСксибилност ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠΆΠ΅Π»Π½Π°. НаправСнитС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ оставаат Ρ‚Ρ€Π°Π³ΠΈ Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ систСми. Никој Π½Π΅ Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅. ВСшко Π΅ Π΄Π° сС ΠΎΠ΄Ρ€Π΅Π΄ΠΈ кој Ρ‚ΠΎΡ‡Π½ΠΎ Π³ΠΈ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΈ која ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°. ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π΅ сС тСстираат. Ако систСмот Π΅ дистрибуиран, Ρ‚ΠΎΠ³Π°Ρˆ администраторот ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±ΠΎΡ€Π°Π²ΠΈ Π΄Π° ја Π½Π°ΠΏΡ€Π°Π²ΠΈ соодвСтната ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ јазли.

(Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π΄Π΅ΠΊΠ° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π΅ ја Π·Π°Ρ‚Π²ΠΎΡ€Π° моТноста Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°. ЌС Π±ΠΈΠ΄Π΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ парсСр ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄ΡƒΠ²Π° ист Ρ‚ΠΈΠΏ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ Config, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° користитС тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Π’Π΅Π΄Π½Π°Ρˆ слСди Π΄Π΅ΠΊΠ° слоТСноста Π½Π° систСмот со ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π΅ Π½Π΅ΡˆΡ‚ΠΎ ΠΏΠΎΠΌΠ°Π»Π° ΠΎΠ΄ слоТСноста Π½Π° систСмот ΡˆΡ‚ΠΎ користи тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, бидСјќи тСкстуалнитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π±Π°Ρ€Π°Π°Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ ΠΊΠΎΠ΄.)

Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° ΠΏΡ€ΠΎΠ΄Π°Π²Π½ΠΈΡ†Π° Π·Π° ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈ со врСдност Π΅ Π΄ΠΎΠ±Π°Ρ€ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π° Π½Π° ΠΌΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° дистрибуирана Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. Π’Ρ€Π΅Π±Π° Π΄Π° ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠΌΠ΅ ΡˆΡ‚ΠΎ сС конфигурациски ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, Π° ΡˆΡ‚ΠΎ сС само ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π”Π° ΠΈΠΌΠ°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° C => A => B, ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ C Ρ€Π΅Ρ‚ΠΊΠΎ сС ΠΌΠ΅Π½ΡƒΠ²Π°, Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ A - чСсто. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Ρ‚ΠΎΠ° C - ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΈ A - ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π‘Π΅ Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΠ²Π°Π°Ρ‚ ΠΎΠ΄ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΏΠΎ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Ρ‚ΠΈΠ΅ ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС ΠΌΠ΅Π½ΡƒΠ²Π°Π°Ρ‚ ΠΏΠΎΡ€Π΅Ρ‚ΠΊΠΎ ΠΎΠ΄ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ±ΠΈΡ‡Π½ΠΎ Π΄ΠΎΠ°Ρ“Π°Π°Ρ‚ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΈΠ·Π²ΠΎΡ€ (ΠΎΠ΄ корисникот), Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ (ΠΎΠ΄ систСмскиот администратор).

Ако Ρ€Π΅Ρ‚ΠΊΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π°Ρ‚ Π±Π΅Π· Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‚ΠΎΠ³Π°Ρˆ Ρ‚ΠΎΠ° чСсто ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΊΠΎΠΌΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, бидСјќи ќС Ρ‚Ρ€Π΅Π±Π° Π½Π΅ΠΊΠ°ΠΊΠΎ Π΄Π° испорачамС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, Π΄Π° складирамС, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ ΠΈ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°ΠΌΠ΅ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΈ врСдности. Π—Π°Ρ‚ΠΎΠ°, ΠΎΠ΄ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°ΡšΠ΅ Π½Π° слоТСноста Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, ΠΈΠΌΠ° смисла Π΄Π° сС Π½Π°ΠΌΠ°Π»ΠΈ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½Π°Ρ‚ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° (ΠΈΠ»ΠΈ Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ Π΄Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π°Π°Ρ‚ Ρ‚Π°ΠΊΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ).

Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° овој пост, ќС Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ статички ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡ΠΊΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Ако Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° услугата Π±Π°Ρ€Π° ΠΌΠ΅Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‚ΠΎΠ³Π°Ρˆ Ρ‚Π°ΠΊΠ²ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ќС Π³ΠΈ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΈ. Π’ΠΎ спротивно, ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅ сС статични ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π°Ρ‚ со помош Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°. Π—Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Π° Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° со Π½ΠΎΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, слично Π½Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ сС рСстартираат процСситС Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм. (Π‘ΠΏΠΎΡ€Π΅Π΄ нас, ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡Π»ΠΈΠ²ΠΎ Π΅ Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π΅ Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅, бидСјќи Ρ‚ΠΎΠ° ја Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π° слоТСноста Π½Π° систСмот. Ако Π΅ ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° Π³ΠΈ користитС стандарднитС способности Π½Π° ОБ Π·Π° Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° процСситС.)

Π•Π΄Π΅Π½ Π²Π°ΠΆΠ΅Π½ аспСкт Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° статичка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ Π³ΠΈ Ρ‚Π΅Ρ€Π° Π»ΡƒΡ“Π΅Ρ‚ΠΎ Π΄Π° размислуваат Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡ΠΊΠ° Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π·Π° систСмот Π΄Π° сС рСстартира ΠΏΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° (Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΡ€Π΅ΠΊΠΈΠ½). Π’ΡΡƒΡˆΠ½ΠΎΡΡ‚, Π°ΠΊΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ статичката ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ рСстартирамС систСмот Π·Π° Π΄Π° стапат Π½Π° сила Π½ΠΎΠ²ΠΈΡ‚Π΅ врСдности. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ со Π·Π°ΡΡ‚ΠΎΡ˜ΠΎΡ‚ Π²Π°Ρ€ΠΈΡ€Π° ΠΏΠΎ сСриозност Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ систСми. Π’ΠΎ Π½Π΅ΠΊΠΎΠΈ случаи, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΊΠΎΠ³Π° ΠΎΠΏΡ‚ΠΎΠ²Π°Ρ€ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ. Ако Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚ΠΈΠ½ΡƒΠΈΡ€Π°Π½Π° услуга, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ AWS ELB ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄Π²ΠΎΠ΄. Π’ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, ΠΊΠΎΠ³Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ рСстартирамС систСмот, стартувамС ΠΏΠ°Ρ€Π°Π»Π΅Π»Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ овој систСм, Π³ΠΎ ΠΏΡ€Π΅Ρ„Ρ€Π»Π°ΠΌΠ΅ балансСрот Π½Π° Π½Π΅Π³ΠΎ ΠΈ Ρ‡Π΅ΠΊΠ°ΠΌΠ΅ Π΄Π° сС Π·Π°Π²Ρ€ΡˆΠ°Ρ‚ старитС врски. ΠžΡ‚ΠΊΠ°ΠΊΠΎ ќС сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π°Ρ‚ ситС стари врски, ја исклучивмС старата инстанца Π½Π° систСмот.

Π‘Π΅Π³Π° Π΄Π° Π³ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²Π½Π°Ρ‚Ρ€Π΅ ΠΈΠ»ΠΈ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ‚. Ако ја складирамС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚, Ρ‚ΠΎΠ³Π°Ρˆ Π±Π°Ρ€Π΅ΠΌ ΠΈΠΌΠ°Π²ΠΌΠ΅ моТност Π΄Π° ја ΠΏΠΎΡ‚Π²Ρ€Π΄ΠΈΠΌΠ΅ исправноста Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ‚. Ако ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΅ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Π½ΠΈΠΎΡ‚ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚, Ρ‚Π΅ΡˆΠΊΠΎ Π΅ Π΄Π° сС слСди кој Π½Π°ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΎΠ²Π°Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ Π·ΠΎΡˆΡ‚ΠΎ. ΠšΠΎΠ»ΠΊΡƒ Π΅ Π²Π°ΠΆΠ½ΠΎ? Π‘ΠΏΠΎΡ€Π΅Π΄ нашС мислСњС, Π·Π° ΠΌΠ½ΠΎΠ³Ρƒ систСми Π·Π° производство Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° сС ΠΈΠΌΠ° стабилна ΠΈ висококвалитСтна ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°.

Π’Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠ³Π° Π΅ создадСн, ΠΊΠΎΠΈ врСдности Π³ΠΈ содрТи, ΠΊΠΎΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ/ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ ΠΈ кој Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° ΠΊΠ°ΠΊΠ²Π° Π±ΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π‘Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°, ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ Π±Π°Ρ€Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ Π½Π°ΠΏΠΎΡ€, ΠΏΠ° Π·Π°Ρ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° донСсСтС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π° ΠΎΠ΄Π»ΡƒΠΊΠ°.

Π”ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΈ Π»ΠΎΡˆΠΈΡ‚Π΅ страни

Π‘ΠΈ сакал Π΄Π° сС Π·Π°Π΄Ρ€ΠΆΠ°ΠΌ Π½Π° Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΈ Π»ΠΎΡˆΠΈΡ‚Π΅ страни Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π°.

ΠŸΡ€Π΅Π΄Π½ΠΎΡΡ‚ΠΈ

ΠŸΠΎΠ΄ΠΎΠ»Ρƒ Π΅ листа Π½Π° Π³Π»Π°Π²Π½ΠΈΡ‚Π΅ карактСристики Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° дистрибуиран систСм:

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° статичка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°. Π’ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π±ΠΈΠ΄Π΅Ρ‚Π΅ сигурни Π²ΠΎ Ρ‚ΠΎΠ°
    ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΅ Ρ‚ΠΎΡ‡Π½Π°.
  2. Π‘ΠΎΠ³Π°Ρ‚ конфигурациски јазик. Π’ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΎ, Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° сС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ Π½Π°Ρ˜ΠΌΠ½ΠΎΠ³Ρƒ Π½Π° Π·Π°ΠΌΠ΅Π½Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° Π½ΠΈΠ·Π°. Кога користитС Scala, достапни сС ΡˆΠΈΡ€ΠΎΠΊ спСктар Π½Π° Ρ˜Π°Π·ΠΈΡ‡Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° користимС
    особини Π·Π° стандарднитС врСдности, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ Π·Π° Π³Ρ€ΡƒΠΏΠΈΡ€Π°ΡšΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° сС ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ Π½Π° vals Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½ΠΈ само Сднаш (DRY) Π²ΠΎ ΠΎΠ³Ρ€Π°Π΄Π΅Π½ΠΈΠΎΡ‚ опсСг. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инстанциратС ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ класи Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° (Seq, Map, ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄Π΅Π½ΠΈ часови).
  3. DSL. Scala ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Ρ˜Π°Π·ΠΈΡ‡Π½ΠΈ карактСристики ΠΊΠΎΠΈ Π³ΠΎ олСснуваат ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° DSL. МоТно Π΅ Π΄Π° сС искористат прСдноститС Π½Π° ΠΎΠ²ΠΈΠ΅ карактСристики ΠΈ Π΄Π° сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° конфигурациски јазик кој Π΅ ΠΏΠΎΠΏΠΎΠ³ΠΎΠ΄Π΅Π½ Π·Π° Ρ†Π΅Π»Π½Π°Ρ‚Π° Π³Ρ€ΡƒΠΏΠ° корисници, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΅ Π±Π°Ρ€Π΅ΠΌ Ρ‡ΠΈΡ‚Π»ΠΈΠ²Π° ΠΎΠ΄ СкспСртитС Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΎΡ‚. Π‘ΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»ΠΈΡΡ‚ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ°Ρ‚, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° учСствуваат Π²ΠΎ процСсот Π½Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°.
  4. Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ‚Π΅Ρ‚ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΡ˜Π° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Ρ˜Π°Π·Π»ΠΈΡ‚Π΅. Π•Π΄Π½Π° ΠΎΠ΄ прСдноститС Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ†Π΅Π» дистрибуиран систСм складирана Π²ΠΎ Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π΅ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ситС врСдности сС Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π°Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Сднаш, Π° ΠΏΠΎΡ‚ΠΎΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ сС користат ΠΊΠ°Π΄Π΅ ΠΈ Π΄Π° сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ. ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ фантомски Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π·Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΡ€Ρ‚ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π° Π΄Π΅ΠΊΠ° Ρ˜Π°Π·Π»ΠΈΡ‚Π΅ користат ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ Π²ΠΎ ситС ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ систСмски ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Имајќи Сксплицитни Π·Π°Π΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΈ зависности ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Ρ˜Π°Π·Π»ΠΈΡ‚Π΅ осигурува Π΄Π΅ΠΊΠ° ситС услуги сС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ.
  5. ВисококвалитСтни ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. ΠŸΡ€Π°Π²Π΅ΡšΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π·Π°Π΅Π΄Π½ΠΈΡ‡ΠΊΠΈ процСс Π½Π° Ρ€Π°Π·Π²ΠΎΡ˜ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° сС постигнат високи стандарди Π·Π° ΠΊΠ²Π°Π»ΠΈΡ‚Π΅Ρ‚ ΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°.
  6. Π‘ΠΈΠΌΡƒΠ»Ρ‚Π°Π½ΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Автоматското Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° систСмот ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° осигурува Π΄Π΅ΠΊΠ° ситС јазли сС Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π°Ρ‚.
  7. ΠŸΠΎΠ΅Π΄Π½ΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. На Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π΅ ΠΈ Ρ‚Ρ€Π΅Π±Π° ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈΠ»ΠΈ Ρ€Π°ΠΊΡƒΠ²Π°ΡšΠ΅ со Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΈ врСдности. Ова ја Π½Π°ΠΌΠ°Π»ΡƒΠ²Π° слоТСноста Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. (Π”Π΅Π» ΠΎΠ΄ слоТСноста Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π½Π° Π²ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, Ρ‚ΡƒΠΊΡƒ само свСсна ΠΎΠ΄Π»ΡƒΠΊΠ° Π²ΠΎΠ΄Π΅Π½Π° ΠΎΠ΄ ΠΆΠ΅Π»Π±Π°Ρ‚Π° Π΄Π° сС ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° бСзбСдност Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚.) БосСма Π΅ лСсно Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° - само ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΎ ΠΎΠ½Π° ΡˆΡ‚ΠΎ нСдостасува Π”Π΅Π»ΠΎΠ²ΠΈ. Π—Π°Ρ‚ΠΎΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΎΠ΄Π»ΠΎΠΆΡƒΠ²Π°Ρ˜ΡœΠΈ ја ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΡ‚Π΅ Π΄Π΅Π»ΠΎΠ²ΠΈ Π΄ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΊΠΎΠ³Π° навистина Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ.
  8. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ја слСдат Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½Π°Ρ‚Π° судбина Π½Π° ситС Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ ΡˆΡ‚ΠΎ Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ со СдинствСна Π²Π΅Ρ€Π·ΠΈΡ˜Π°. Ова Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. МоТСмС Π΄ΡƒΡ€ΠΈ ΠΈ Π΄Π° ја користимС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ ΠΏΡ€Π΅Π΄ Π΅Π΄Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ систСмот ќС Ρ€Π°Π±ΠΎΡ‚ΠΈ исто. Π‘Ρ‚Π°Π±ΠΈΠ»Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ја ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΡƒΠ²Π° прСдвидливоста ΠΈ довСрливоста Π½Π° дистрибуираниот систСм. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΅ фиксирана Π²ΠΎ Ρ„Π°Π·Π°Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π°, доста Π΅ Ρ‚Π΅ΡˆΠΊΠΎ Π΄Π° сС Π»Π°ΠΆΠΈΡ€Π° Π²ΠΎ производството.
  9. ΠœΠΎΠ΄ΡƒΠ»Π°Ρ€Π½ΠΎΡΡ‚. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π°ΠΌΠΊΠ° Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π°Ρ€Π½Π° ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° Π΄Π° сС создадат Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ систСми. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ систСмот Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° Π΅Π΄Π΅Π½ јазол Π²ΠΎ Π΅Π΄Π½ΠΎ ΠΎΡ‚Π΅Π»ΠΎΡ‚Π²ΠΎΡ€ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π½Π° повСќС јазли Π²ΠΎ Π΄Ρ€ΡƒΠ³. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° производствСни ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ Π½Π° систСмот.
  10. Π’Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅. Π‘ΠΎ Π·Π°ΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈ услуги со Π»Π°ΠΆΠ½ΠΈ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π²Π΅Ρ€Π·ΠΈΠΈ Π½Π° систСмот ΡˆΡ‚ΠΎ сС ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΈ Π·Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅.
  11. Π’Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°. Π˜ΠΌΠ°ΡšΠ΅Ρ‚ΠΎ СдинствСна ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π·Π° Ρ†Π΅Π»ΠΈΠΎΡ‚ дистрибуиран систСм ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚ ситС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π²ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Π½Π° срСдина ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ˜Π°. ЛСсно Π΅ Π΄Π° сС Π΅ΠΌΡƒΠ»ΠΈΡ€Π°, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° ΠΊΠΎΠ³Π° Π½Π΅ΠΊΠΎΠΈ јазли стануваат достапни.

НСдостатоци ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°

ΠšΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΠ²Π° ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ конфигурациски пристапи ΠΈ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½Π° Π·Π° Π½Π΅ΠΊΠΎΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠŸΠΎΠ΄ΠΎΠ»Ρƒ сС Π΄Π°Π΄Π΅Π½ΠΈ Π½Π΅ΠΊΠΎΠΈ нСдостатоци:

  1. Π‘Ρ‚Π°Ρ‚ΠΈΡ‡ΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°. ПонСкогаш Ρ‚Ρ€Π΅Π±Π° Π±Ρ€Π·ΠΎ Π΄Π° ја ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ производството, Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΈ ситС Π·Π°ΡˆΡ‚ΠΈΡ‚Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ. Π‘ΠΎ овој пристап ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΡ‚Π΅ΡˆΠΊΠΎ. Π’ΠΎ најмала Ρ€Π°ΠΊΠ°, сè ΡƒΡˆΡ‚Π΅ ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π° ΠΈ автоматско Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅. Ова Π΅ ΠΈ корисна карактСристика Π½Π° пристапот ΠΈ нСдостаток Π²ΠΎ Π½Π΅ΠΊΠΎΠΈ случаи.
  2. Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°. Π’ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ конфигурациската Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° со автоматска Π°Π»Π°Ρ‚ΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ Π½Π°ΠΏΠΎΡ€ΠΈ Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° скриптата Π·Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°.
  3. Алатки. Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², Π°Π»Π°Ρ‚ΠΊΠΈΡ‚Π΅ ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈΡ‚Π΅ Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ со ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° сС засноваат Π½Π° тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠ²ΠΈ Π°Π»Π°Ρ‚ΠΊΠΈ/Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ достапни Π²ΠΎ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°.
  4. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½Π° Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π²ΠΎ ставовитС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΈ DevOps сС Π½Π°Π²ΠΈΠΊΠ½Π°Ρ‚ΠΈ Π½Π° тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Π‘Π°ΠΌΠ°Ρ‚Π° идСја Π·Π° ΡΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΌΠ°Π»ΠΊΡƒ Π½Π΅ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π½Π° ΠΈ Π½Π΅Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½Π° ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΠΎΡ‚Ρ„Ρ€Π»Π°ΡšΠ΅.
  5. ΠŸΠΎΡ‚Ρ€Π΅Π±Π΅Π½ Π΅ висококвалитСтСн процСс Π½Π° Ρ€Π°Π·Π²ΠΎΡ˜. Π—Π° ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Π΅ цСлосна Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° процСсот Π½Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ ΠΈ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° (CI/CD). Π’ΠΎ спротивно ќС Π±ΠΈΠ΄Π΅ доста Π½Π΅Π·Π³ΠΎΠ΄Π½ΠΎ.

Π”Π° сС ​​задрТимС ΠΈ Π½Π° Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ° Π½Π° Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π°Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡˆΡ‚ΠΎ Π½Π΅ сС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π·Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°:

  1. Ако ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΊΠΎΠΈ Π½Π΅ сС користат ΠΎΠ΄ Ρ˜Π°Π·ΠΎΠ»ΠΎΡ‚, Ρ‚ΠΎΠ³Π°Ρˆ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»Π΅Ρ€ΠΎΡ‚ Π½Π΅ΠΌΠ° Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ја ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΡˆΡ‚ΠΎ нСдостасува. Овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅ΡˆΠΈ со Π½Π°ΠΏΡƒΡˆΡ‚Π°ΡšΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ Π·Π° Ρ‚ΠΎΡ€Ρ‚Π° ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΡ€ΠΈΠ³ΠΈΠ΄Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HList ΠΈΠ»ΠΈ алгСбарски Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (класи Π½Π° случаи) Π·Π° ΠΏΡ€Π΅Ρ‚ΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°.
  2. Има Π»ΠΈΠ½ΠΈΠΈ Π²ΠΎ конфигурациската Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π΅ сС ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со самата ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°: (package, import,Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΈ; override def's Π·Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠΎΠΈ ΠΈΠΌΠ°Π°Ρ‚ стандардни врСдности). Ова ΠΌΠΎΠΆΠ΅ Π΄Π΅Π»ΡƒΠΌΠ½ΠΎ Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π΅ Π°ΠΊΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ сопствСн DSL. ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, Π΄Ρ€ΡƒΠ³ΠΈ Π²ΠΈΠ΄ΠΎΠ²ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, XML) исто Ρ‚Π°ΠΊΠ° Π½Π°ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°Π°Ρ‚ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ° Π½Π° структурата Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°.
  3. Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° овој пост, Π½Π΅ размислувамС Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡ΠΊΠ° Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° кластСр ΠΎΠ΄ слични јазли.

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

Π’ΠΎ овој пост, ја истраТивмС ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π·Π° ΠΏΡ€Π΅Ρ‚ΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΈ Π½Π°ΠΏΡ€Π΅Π΄Π½ΠΈΡ‚Π΅ моТности Π½Π° систСмот ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ Scala. Овој пристап ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊΠΎ Π·Π°ΠΌΠ΅Π½Π° Π·Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ Π½Π° xml ΠΈΠ»ΠΈ тСкстуални Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Иако Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Π²ΠΎ Scala, иститС ΠΈΠ΄Π΅ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС прСнСсат Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½ΠΈ Ρ˜Π°Π·ΠΈΡ†ΠΈ (ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС Kotlin, C#, Swift, ...). Овој пристап ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ испробатС Π²ΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ слСднитС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΈ, Π°ΠΊΠΎ Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°, ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ Π½Π° тСкстуалната Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, додавајќи Π³ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ нСдостасуваат.

Π‘Π΅ΠΊΠ°ΠΊΠΎ, ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π±Π°Ρ€Π° висококвалитСтСн процСс Π½Π° Ρ€Π°Π·Π²ΠΎΡ˜. Π—Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚, сС ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° висок ΠΊΠ²Π°Π»ΠΈΡ‚Π΅Ρ‚ ΠΈ сигурност Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅.

Π Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈΠΎΡ‚ пристап ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΡˆΠΈΡ€ΠΈ:

  1. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° користитС ΠΌΠ°ΠΊΡ€ΠΎΠ° Π·Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°ΡšΠ΅.
  2. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ DSL Π·Π° Π΄Π° ја прСтставитС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π½Π°Ρ‡ΠΈΠ½ ΡˆΡ‚ΠΎ Π΅ достапСн Π·Π° ΠΊΡ€Π°Ρ˜Π½ΠΈΡ‚Π΅ корисници.
  3. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со рСсурситС со автоматско ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅Π½ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° јазли Π²ΠΎ кластСрот Π±Π°Ρ€Π° (1) сСкој јазол Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ ΠΌΠ°Π»ΠΊΡƒ ΠΏΠΎΠΈΠ½Π°ΠΊΠ²Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°; (2) ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€ΠΎΡ‚ Π½Π° кластСрот Π΄ΠΎΠ±ΠΈΠ» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° Π½ΠΎΠ²ΠΈ јазли.

Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΈΡ†ΠΈ

Π‘ΠΈ сакал Π΄Π° ΠΈΠΌ сС Π·Π°Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π°ΠΌ Π½Π° ΠΠ½Π΄Ρ€Π΅Ρ˜ Баксонов, ПавСл Попов ΠΈ Антон НСхаСв Π·Π° Π½ΠΈΠ²Π½Π°Ρ‚Π° конструктивна ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° Π½Π° Π½Π°Ρ†Ρ€Ρ‚-написот.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€