αž…αž„αž€αŸ’αžšαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™

αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž“αžΌαžœαž™αž“αŸ’αžαž€αžΆαžšαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‡αžΆαž—αžΆαžŸαžΆαž…αž„αž€αŸ’αžšαž„ (Scala) αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαž—αŸαž‘αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ” αž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ‚αž”αž“αŸαŸ‡ αž αžΎαž™αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž•αŸ’αžŸαŸαž„αŸ—αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‘αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ”

αž…αž„αž€αŸ’αžšαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™

(αž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ)

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

αž€αžΆαžšαž€αžŸαžΆαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž˜αžΆαž“αž“αŸαž™αžαžΆαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ DevOps (terraform, ansible αž¬αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž“αŸ„αŸ‡) αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· (αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž“αžΆαŸ†αž„αž“αžΈαž˜αž½αž™αŸ—)αŸ” αž™αžΎαž„αž€αŸαž…αž„αŸ‹αž”αŸ’αžšαžΆαž€αžŠαžαžΆαžαŸ’αž“αžΆαŸ†αž„αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž–αž·αž’αžΈαž€αžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆ (αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αŸ†αžŽαŸ‚αžŠαžΌαž…αž‚αŸ’αž“αžΆ)αŸ” αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸ αž—αžΆαž–αž˜αž·αž“αž†αž”αž‚αŸ’αž“αžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž—αž– JVM αž•αž›αžœαž·αž”αžΆαž€αž˜αž½αž™αž“αŸƒαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸαŸ‡αž‚αžΊαžαžΆαž€αŸ†αžŽαŸ‚αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αžŸαžΆαžšαž–αž·αž’αžΈαž€αžΆαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαžΎαž“αŸ…αž‚αŸ’αžšαž”αŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αŸ”

αž…αž»αŸ‡αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžœαž·αž‰? αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž™αžΎαž„αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαžŸαž˜αžΆαžŸαž’αžΆαžαž»αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž―αž€αžαžΆ αž˜αž»αž“αž–αŸαž›αž™αžΎαž„αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αžΆαž αžšαžŽαž€αž˜αŸ’αž˜αŸ” (αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž™αžΎαž„αž”αžΌαž€αžŸαžšαž»αž”αž›αž‘αŸ’αž’αž•αž›αžαŸαžŸαŸ’αžαž‘αŸ…αž˜αŸ‰αŸ„αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž™αžΎαž„αž€αŸαžαŸ’αžšαžΌαžœαž•αŸ’αžαž›αŸ‹αžŸαŸ†αžŽαž»αŸ†αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αž„αžŠαŸ‚αžšαŸ”)

αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› αžœαžΆαž…αŸ’αžšαžΎαž“αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ’αžšαžΎ classpath αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸ…αž‚αŸ’αžšαž”αŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆ classpath αžŠαžΌαž…αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” (αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš nodes αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„ classpaths αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžœαžΆαž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αžŠαž›αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž½αž˜ αž“αž·αž„αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαŸ”) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž“αŸαŸ‡ αž™αžΎαž„αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆ nodes αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αž”αŸ’αžšαžΎ classpath αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžœαž·αžœαžŒαŸ’αžαž“αŸαž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž™αžΎαž„αž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸƒαž€αžΆαžšαžœαž·αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αžœαžΆαž αžΆαž€αŸ‹αž”αžΈαžŠαžΌαž…αž‡αžΆαž‘αžΌαž‡αžΈαžαž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž€αŸ†αžŽαŸ‚αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ” αž αžΎαž™αžŠαžΆαž€αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αŸ†αžŽαŸ‚αŸ” αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž•αž›αž·αžβ€‹αž“αŸ„αŸ‡ αž™αžΎαž„β€‹αž’αžΆαž…β€‹αž”αŸ’αžšαžΎβ€‹αž›αŸαžβ€‹αž€αŸ†αžŽαŸ‚β€‹αž”αžΆαž“β€‹αž™αŸ‰αžΆαž„β€‹αžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž•αž›αž·αžαž€αž˜αŸ’αž˜αž…αŸ’αžšαžΎαž“ αž“αŸ„αŸ‡αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž…αŸ’αžšαžΎαž“αžŠαž„
αžŸαžΆαžαžΆαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αžŸαŸ’αž›αžΆαž€αž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αžαŸ‚αž˜αž›αžΎαž€αŸ†αžŽαŸ‚ (αž§αž‘αžΆαž αžšαžŽαŸ αžˆαŸ’αž˜αŸ„αŸ‡αžŸαžΆαžαžΆ)αŸ” αžœαž·αž’αžΈαž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž“αžΌαžœαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αž‚αŸ’αžšαžΏαž„αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™ αž…αŸ’αžšαž€ αž’αž“αž’αžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ… αž“αž·αž„αž€αŸ†αžŽαŸ‚αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž˜αžΆαž“αžŸαžΆαžαžΆαžαŸ‚αž˜αž½αž™ αž αžΎαž™αž™αžΎαž„αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαž˜αžšαž”αŸ€αž”αž’αž˜αŸ’αž˜αžαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž”αžΈαžŠαŸ‚αž›αž”αŸ†αž”αŸ‚αž€αžŠαŸ„αž™αž…αŸ†αž“αž»αž… (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)

αž”αŸ’αžšαž—αŸαž‘ Phantom

αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž–αž·αž’αžΈαž€αžΆαžšαž“αŸ…αž–αŸαž›αž…αž„αž€αŸ’αžšαž„ αž™αžΎαž„αž”αŸ’αžšαžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž”αŸ’αžšαž—αŸαž‘αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αžαŸ’αž“αžΆαž€αŸ‹αŸ” αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž“αŸαŸ‡αž‚αžΊαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž™αžΎαž„αž˜αž·αž“αž”αŸ’αžšαžΎ protocol instance αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž…αž„αŸ‹αž±αŸ’αž™ compiler αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αžΆαž–αž†αž”αž‚αŸ’αž“αžΆαž“αŸƒ protocolsαŸ” αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αž·αž’αžΈαž€αžΆαžš αž™αžΎαž„αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αž†αŸ’αž›αž„αž•αž»αžαžŸαŸαžœαžΆαž˜αž·αž“αžŸαž˜αžšαž˜αŸ’αž™αž‡αžΆαž€αžΆαžšαž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž”αžΆαž“αž‘αŸαŸ”

αž–αž·αž’αžΈαž€αžΆαžšαž‘αžΌαž‘αŸ…αž˜αž½αž™αž‚αžΊ REST API αž‡αžΆαž˜αž½αž™αž“αžΉαž„ Json serializationαŸ–

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž› RequestMessage - αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαžŸαŸ†αžŽαžΎ, ResponseMessage - αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αŸ”
αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž–αž·αž’αžΈαž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚αžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαŸ–

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžŸαŸ†αžŽαžΎαž‚αžΊαž‡αžΆαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ… url αž αžΎαž™αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‚αžΊαž‡αžΆαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžαž½αž“αŸƒαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž” HTTP αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžŠαŸ„αž™αžˆαŸ’αž˜αŸ„αŸ‡αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž…αŸ’αžšαž€ αž“αž·αž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αŸ” αž’αžΆαžαž»αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Scala αžαžΆαž˜αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“ (αž§αž‘αžΆαž αžšαžŽαŸ HList-s, αž”αŸ’αžšαž—αŸαž‘αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αž·αž‡αž‚αžŽαž·αž)αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌαž“αŸ† αž“αž·αž„αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ„αž™αž”αŸ’αžšαžΎ traitαžŸαŸ” (αž›αŸ†αž“αžΆαŸ†αž“αŸ†αžαŸαž€αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž’αžΆαžαž»αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž‘αŸαŸ” αžœαžΆαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž˜αž½αž™αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ” )

αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαžœαžΆαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžαžΆαž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αž…αŸ’αžšαž€ EndPointαžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ–

  type EchoProtocol[A] = SimpleHttpGetRest[A, A]

  trait EchoConfig[A] extends ServiceConfig {
    def portNumber: PortNumber = 8081
    def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
    def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
  }

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžŸαŸαžœαžΆαž’αŸαž€αžΌ αž’αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‚αžΊαž›αŸαžαž…αŸ’αžšαž€ αž“αž·αž„αž€αžΆαžšαž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αžαžΆαž…αŸ’αžšαž€αž“αŸαŸ‡αž‚αžΆαŸ†αž‘αŸ’αžšαž–αž·αž’αžΈαž€αžΆαžšαž’αŸαž€αžΌαŸ” αž™αžΎαž„β€‹αž”αŸ’αžšαž αŸ‚αž›β€‹αž‡αžΆβ€‹αž˜αž·αž“β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αž…αŸ’αžšαž€β€‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹β€‹αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡β€‹... αž›αž€αŸ’αžαžŽαŸˆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαž€αžΆαžŸαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž (αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž’αžšαžΌαž”αžΈ) αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„αž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž™αžΎαž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž’αžšαžΌαž”αžΈ αž“αž·αž„αž•αŸ’αžαž›αŸ‹αž›αŸαžαž…αŸ’αžšαž€αŸ” αžŠαŸ„αž™αžŸαžΆαžšβ€‹αž™αžΎαž„β€‹αž”αžΆαž“β€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš αž“αŸ…αž–αŸαž›β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αžΆαžšβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž™αžΎαž„β€‹αž”αŸ’αžšαž αŸ‚αž›β€‹αž‡αžΆβ€‹αž˜αž·αž“β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αž…αŸ’αžšαž€β€‹αž•αŸ’αžŸαŸαž„β€‹αž‘αŸαŸ” αžαž˜αŸ’αž›αŸƒαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ”

αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αž’αžαž·αžαž·αž‡αž“ αž™αžΎαž„β€‹αž”αŸ’αžšαž€αžΆαžŸβ€‹αž–αžΈβ€‹αž—αžΆαž–β€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αžŸαŸαžœαžΆβ€‹αž’αŸαž€αžΌαŸ–

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

αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‚αžΊαž˜αžΆαž“αž”αŸ’αžšαž—αŸαž‘αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αžΆαŸ†αž…αŸαž‰ echoService. αž‡αžΆαž–αž·αžŸαŸαžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαž’αŸαž€αžΌ αž™αžΎαž„αž‘αžΆαž˜αž‘αžΆαžšαž–αž·αž’αžΈαž€αžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž—αŸ’αž‡αžΆαž”αŸ‹αžŸαŸαžœαžΆαž–αžΈαžš αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αžœαžΈαŸ—αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜

αž˜αž»αžαž„αžΆαžšαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž”αž‰αŸ’αžˆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αŸ” (αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αžˆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‚αžΊαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαŸ”) αž‡αžΆαžαŸ’αž˜αžΈαž˜αŸ’αžαž„αž‘αŸ€αž αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž˜αž»αžαž„αžΆαžšαž”αŸ‚αž”αž“αŸαŸ‡ (αž§αž‘αžΆαž αžšαžŽαŸ αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαž—αŸαž‘αžαŸ’αž“αžΆαž€αŸ‹αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αŸ’αžšαž—αŸαž‘αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹)αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌαž“αŸ†αžαŸαž€αŸ” αž™αžΎαž„αž“αžΉαž„αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž”αŸ’αžšαžΎαžαŸ’αž“αžΆαž€αŸ‹ cats.Resource, αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αžαŸ’αž“αžΆαž€αŸ‹αž“αŸαŸ‡αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž’αž“αž’αžΆαž“αžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž’αž“αž’αžΆαž“ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αž”αžšαž·αž”αž‘αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αŸ” αž˜αž»αžαž„αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

  type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]

  trait ServiceImpl[F[_]] {
    type Config
    def resource(
      implicit
      resolver: AddressResolver[F],
      timer: Timer[F],
      contextShift: ContextShift[F],
      ec: ExecutionContext,
      applicative: Applicative[F]
    ): ResourceReader[F, Config, Unit]
  }

αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›

  • Config - αž”αŸ’αžšαž—αŸαž‘αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸαŸ‡αŸ”
  • AddressResolver - αžœαžαŸ’αžαž»αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸƒαžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αžŸαžΌαž˜αž˜αžΎαž›αžαžΆαž„αž€αŸ’αžšαŸ„αž˜)

αž“αž·αž„αž”αŸ’αžšαž—αŸαž‘αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž–αžΈαž”αžŽαŸ’αžŽαžΆαž›αŸαž™ cats:

  • F[_] - αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž₯αž‘αŸ’αž’αž·αž–αž› (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ†αž•αž»αžαŸ” F[A] αž’αžΆαž…αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž˜αž»αžαž„αžΆαžšαž˜αž½αž™αŸ” () => A. αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ cats.IO.)
  • Reader[A,B] - αž…αŸ’αžšαžΎαž“αž¬αžαž·αž…αž˜αžΆαž“αž“αŸαž™αžŠαžΌαž…αž“αžΉαž„αž˜αž»αžαž„αžΆαžš A => B
  • cats.Resource - αž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž“αž·αž„αž”αž‰αŸ’αž…αŸαž‰
  • Timer - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„ (αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαŸαž€αž›αž€αŸ‹αž˜αž½αž™αžšαž™αŸˆ αž“αž·αž„αžœαžΆαžŸαŸ‹αž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž›)
  • ContextShift - αž’αžΆαžŽαžΆαž‘αžΌαž€ ExecutionContext
  • Applicative - αžαŸ’αž“αžΆαž€αŸ‹αž”αŸ’αžšαž—αŸαž‘αž”αŸ‚αž”αž•αŸ‚αž“αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž”αž»αž‚αŸ’αž‚αž› (αžŸαŸ’αž‘αžΎαžšαžαŸ‚ monad) αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž›αŸ’αž’αž‡αžΆαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ 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 αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αžŠαŸ‚αž›αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΉαž„αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αž‡αžΆαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž˜αž»αžαž„αžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž‚αžΌαžŸβ€‹αž›αŸαžβ€‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹β€‹αžαŸ’αž“αžΆαŸ†αž„β€‹αž‘αŸ…β€‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αŸ–

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

αžŸαŸ†αžαžΆαž“αŸ‹! αžŸαžΌαž˜αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αŸ” αž™αžΎαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αžαŸ’αž“αžΆαŸ†αž„αž˜αž½αž™αž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž”αŸ’αžšαž—αŸαž‘αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ αž˜αžΆαž“αž”αŸ’αžšαž—αŸαž‘αž–αž·αž’αžΈαž€αžΆαžšαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž“αžΉαž„αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž“αžΆαŸ†αž„αž‚αŸ„αž›αžŠαŸ…αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸαŸ‡ αž™αžΎαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž›αŸαžαž…αŸ’αžšαž€αž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαžαŸ‚αž˜αŸ’αžαž„ αž αžΎαž™αžαŸ‚αž„αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αžΆαžαžΆαžŸαŸ†αžŠαŸ…αž‘αŸ…αž›αžΎαž…αŸ’αžšαž€αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžαŸ’αž“αžΆαŸ†αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αžΈαžš

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡ αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž‚αžΊαžαžΆαž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αžœαžαŸ’αžαž»αž–αžΈαžšαžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαžŸαŸ†αžŽαž»αŸ†αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ–

  object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
    type Config = EchoConfig[String] with SigTermLifecycleConfig
  }

  object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
    type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
  }

αžαŸ’αž“αžΆαŸ†αž„αž‘αžΈαž˜αž½αž™αž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž αžΎαž™αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαŸ‚αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžαŸ’αž“αžΆαŸ†αž„αž‘αžΈαž–αžΈαžšαž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ αž“αž·αž„αž”αŸ’αžšαžΎαž•αŸ’αž“αŸ‚αž€αž•αŸ’αžŸαŸαž„αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαž€αŸαžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž–αŸαž‰αž˜αž½αž™αž‡αžΈαžœαž·αžαž•αž„αžŠαŸ‚αžšαŸ” αžαŸ’αž“αžΆαŸ†αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž αžΌαžαžŠαž›αŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αžˆαž”αŸ‹ SIGTERM'om αž αžΎαž™β€‹αžαŸ’αž“αžΆαŸ†αž„β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœβ€‹αž“αžΉαž„β€‹αž”αž·αž‘β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈβ€‹αž–αŸαž›αžαŸ’αž›αŸ‡αŸ” αžŸαž„αŸ‹β€‹αž‘αžΈβ€‹αž˜αŸ‰αŸ‚β€‹αžαŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš.

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΌαž‘αŸ…

αžŸαžΌαž˜αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΌαžŠαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹ αž αžΎαž™αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ (.jar) αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ” αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αŸ” αž“αŸαŸ‡αž‚αžΊαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž™αžΎαž„αž’αžΆαž…αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αŸ’αžšαžΎαž“αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΌαžŠαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž‡αžΆαžαŸ’αž˜αžΈαž˜αŸ’αžαž„αž‘αŸ€αž αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αžŸαžΆαžαžΆαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ” αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‘αŸ…αž›αžΎαž€αŸ†αžŽαŸ‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž αžΎαž™αž€αŸ†αžŽαŸ‚αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆαžšαŸ€αž„αžšαž αžΌαžαž“αŸ…αž–αŸαž›αžŽαžΆαžŠαŸ‚αž›αž™αžΎαž„αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αŸ†αžŽαŸ‚αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ„αŸ‡αŸ”

αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŽαžΆαž˜αž½αž™αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΌαžŠαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž“αžΈαž˜αž½αž™αŸ—
αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž“αžΆαž‚αž»αžŽαž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαŸ–

αžŸαŸ†αž”αž»αžαŸ’αžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž˜αžŠαžΆαž“αž€αŸ†αž αž»αžŸ -> PR -> αž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰ -> αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™αžŸαžΆαžαžΆαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’ ->
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› -> αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™

αž•αž›αžœαž·αž”αžΆαž€αž…αž˜αŸ’αž”αž„αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‚αžΊαŸ–

  1. αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αžΉαž„αž˜αžΆαž“αž—αžΆαž–αžŸαŸŠαžΈαžŸαž„αŸ’αžœαžΆαž€αŸ‹αž‚αŸ’αž“αžΆαž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαžΌαž…αž‚αŸ’αž“αžΆαž–αžΈαž”αŸ’αžšαž—αž–αžαŸ‚αž˜αž½αž™αŸ”

  2. αžœαžΆαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αž“αžΆαŸ†αž„αžαŸ‚αž˜αž½αž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ "αž€αžΆαžšαžšαžŸαžΆαžαŸ‹αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’" αž‚αžΊαž˜αž·αž“αž‘αŸ†αž“αž„αž‘αŸαŸ”

  3. αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž–αž·αž”αžΆαž€αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αž“αŸ’αžαž·αž…αž”αž“αŸ’αžαž½αž…αž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ”

  4. αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΆαŸ†αž„αž˜αžΌαž› αž αžΎαž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αŸ”

αžαžΎαžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αžΆαžšαžƒαŸ’αž›αžΆαŸ†αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αž›αž·αžαž€αž˜αŸ’αž˜αžŠαŸ‚αžšαž¬αž‘αŸ? αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž’αžΆαž…αž˜αžΆαž“αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αžšαžŸαžΎαž”αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αžŠαžΆαž€αŸ‹αž€αž˜αŸ’αžšαž·αžαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž“αŸαŸ‡ αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ†αž”αŸ‚αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž–αžΈαžšαž•αŸ’αž“αŸ‚αž€β€”αž˜αž½αž™αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“αž‡αžΆαžŸαžΆαž’αžΆαžšαžŽαŸˆ αž“αž·αž„αž˜αž½αž™αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αž˜αŸ’αžšαž·αžαŸ” αžœαžΆαž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‘αžΌαž‘αŸ…αŸ” αž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αž“αŸαŸ‡αž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αž€αŸ’αžαžŽαŸˆαž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αžŠαŸ‚αž›αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ”

αž€αžΆαžšαž”αŸ’αžšαŸ‚αž”αŸ’αžšαž½αž›αžŠαŸ‚αž›αž’αžΆαž…αž€αžΎαžαž˜αžΆαž“

αž…αžΌαžšαž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΌαž‘αŸ…αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  1. αž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αŸ„αž›αžŠαŸ…αŸ”
  2. αž αžΆαž„αžαž˜αŸ’αž›αŸƒαž‚αž“αŸ’αž›αžΉαŸ‡αž€αžŽαŸ’αžαžΆαž› (etcd/zookeeper).
  3. αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΎαž„αžœαž·αž‰/αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΎαž„αžœαž·αž‰αŸ”
  4. αž€αŸ†αž–αž»αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ…αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αŸ†αžŽαŸ‚αŸ”

αž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž—αžΆαž–αž”αžαŸ‹αž”αŸ‚αž“αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαžΌαž…αŸ—αŸ” αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αžΆαž…αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αž“αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž―αž€αžŸαžΆαžšαžŸαž˜αžŸαŸ’αžšαž” αž“αž·αž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΎαž„αžœαž·αž‰αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αŸ† αŸ— αž—αžΆαž–αž”αžαŸ‹αž”αŸ‚αž“αž”αŸ‚αž”αž“αŸαŸ‡αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αž…αž„αŸ‹αž”αžΆαž“αž‘αŸαŸ” αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αž·αž“αž˜αžΆαž“αžŠαžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αŸαŸ” αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžŠαžΌαžšαž“αŸ„αŸ‡αž‘αŸαŸ” αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαžΆαž’αŸ’αž“αž€αžŽαžΆαž‡αžΆαž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αž’αŸ’αžœαžΈαŸ” αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αž‘αŸαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αžΆαž…αž—αŸ’αž›αŸαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

(αž‚αž½αžšαž€αžαŸ‹αžŸαŸ†αž‚αžΆαž›αŸ‹αž•αž„αžŠαŸ‚αžšαžαžΆαž€αžΆαžšαž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž˜αž·αž“αž”αž·αž‘αž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαž‘αŸαŸ” αžœαžΆαž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž§αž”αž€αžšαžŽαŸαž‰αŸ‚αž€ αž“αž·αž„αžŸαž»αž–αž›αž—αžΆαž–αžŠαŸ‚αž›αž•αž›αž·αžαž”αŸ’αžšαž—αŸαž‘αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž›αž‘αŸ’αž’αž•αž›αŸ” Configαž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αŸ” αžœαžΆαž€αžΎαžαž‘αžΎαž„αž—αŸ’αž›αžΆαž˜αŸ—αžαžΆαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αž„αž€αŸ’αžšαž„αž‚αžΊαžαž·αž…αž‡αžΆαž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ αž―αž€αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αžαŸ’αžšαžΌαžœαž€αžΆαžšαž›αŸαžαž€αžΌαžŠαž”αž“αŸ’αžαŸ‚αž˜αŸ” )

αžƒαŸ’αž›αžΆαŸ†αž„αžαž˜αŸ’αž›αŸƒαž‚αž“αŸ’αž›αžΉαŸ‡αž€αžŽαŸ’αžαžΆαž›αž‚αžΊαž‡αžΆαž™αž“αŸ’αžαž€αžΆαžšαžŠαŸαž›αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž˜αŸαžαžΆαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αŸ” αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžαžΆαžαžΎαž’αŸ’αžœαžΈαž‡αžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžŸαžΌαž˜αž±αŸ’αž™αž™αžΎαž„αž˜αžΆαž“αž˜αž»αžαž„αžΆαžš C => A => Bαž“αž·αž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš C αž€αž˜αŸ’αžšαž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž“αž·αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™ A - αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž“αž·αž™αžΆαž™αž”αžΆαž“αŸ” C - αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„ A - αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžœαžΆαž”αž„αŸ’αž αžΆαž‰αžαžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαž»αžŸαž–αžΈαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž‡αžΆαž‘αžΌαž‘αŸ…αž–αž½αž€αž‚αŸαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‰αžΉαž€αž‰αžΆαž”αŸ‹αžαž·αž…αž‡αžΆαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž”αžΆαž“αž˜αž€αž–αžΈαž”αŸ’αžšαž—αž–αž˜αž½αž™ (αž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹) αž“αž·αž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αžΈαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αž–αžΈαž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’)αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΎαž„αžœαž·αž‰ αž“αŸ„αŸ‡αž‡αžΆαžšαžΏαž™αŸ—αžœαžΆαž’αžΆαž…αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžαŸ’αž›αŸ‡ αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž‰αŸ‚αž€ αž“αž·αž„αž–αž·αž“αž·αžαŸ’αž™ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαž˜αŸ’αž›αŸƒαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαž“αŸƒαž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžœαžΆαžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž…αŸ†αž“αž½αž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (αž¬αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž”αŸ‚αž”αž“αŸαŸ‡αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡) αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαž€αžΆαžŸαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αŸ‚αž„αž…αŸ‚αž€αžšαžœαžΆαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‹αž·αžαž·αžœαž“αŸ’αž αž“αž·αž„αžαžΆαž˜αžœαž“αŸ’αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ†αž‘αž»αž„αž–αŸαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αž αŸ…αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž”αŸ‚αž”αž“αŸαŸ‡αžαžΆαž˜αžœαž“αŸ’αžαŸ” αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸαž‡αž˜αŸ’αžšαžΎαžŸαž‚αžΊαž‹αž·αžαž·αžœαž“αŸ’αžαž αžΎαž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αžœαž“αŸ’αž αž™αžΎαž„αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž™αž“αŸ’αžαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΎαž„αžœαž·αž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžαŸ’αž˜αžΈ αžŸαŸ’αžšαžŠαŸ€αž„αž‘αŸ…αž“αžΉαž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αŸ” (αžαžΆαž˜αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αž™αžΎαž„ αž‚αž½αžšαžαŸ‚αž‡αŸ€αžŸαžœαžΆαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‘αžΎαž„αžœαž·αž‰αž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž”αž„αŸ’αž€αžΎαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αžαŸ’αžαž—αžΆαž–αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš OS αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΎαž„αžœαž·αž‰αŸ” )

αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‹αž·αžαž·αžœαž“αŸ’αžαžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αž“αž»αžŸαŸ’αžŸαž–αž·αž…αžΆαžšαžŽαžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΎαž„αžœαž·αž‰αžαžΆαž˜αžœαž“αŸ’αžαž‚αžΊαž‡αžΆαž–αŸαž›αžœαŸαž›αžΆαžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ (αž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†)αŸ” αžαžΆαž˜αž€αžΆαžšαž–αž·αž αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‹αž·αžαž·αžœαž“αŸ’αž αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΎαž„αžœαž·αž‰αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžαž˜αŸ’αž›αŸƒαžαŸ’αž˜αžΈαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ” αž”αž‰αŸ’αž αžΆαž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž”αŸ’αž›αŸ‚αž€αž‚αŸ’αž“αžΆαž€αŸ’αž“αž»αž„αž—αžΆαž–αž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ—αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžαŸ’αž›αŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αž“αŸ’αž‘αž»αž€αž˜αžΆαž“αžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž”αž“αŸ’αž αž’αŸ’αž“αž€αž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž”αžΆαž“αŸ” αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ AWS ELB αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΌαžš. αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΎαž„αžœαž·αž‰ αž™αžΎαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸαŸ‡ αž”αŸ’αžαžΌαžšαžŸαž˜αžαž»αž›αŸ’αž™αž‘αŸ…αžœαžΆ αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΆαžŸαŸ‹αž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΆαžŸαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αž™αžΎαž„αž”αž·αž‘αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αžΆαžŸαŸ‹αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž’αŸ†αž–αžΈαž”αž‰αŸ’αž αžΆαž“αŸƒαž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαž„αž€αŸ’αž“αž»αž„ αž¬αžαžΆαž„αž€αŸ’αžšαŸ…αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž“αŸ„αŸ‡αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž™αžΎαž„αž˜αžΆαž“αž±αž€αžΆαžŸαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ†αž‘αž»αž„αž–αŸαž›αžŠαŸ†αž‘αžΎαž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ…αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“αžαžΆαžαžΎαž’αŸ’αž“αž€αžŽαžΆαž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž―αž€αžŸαžΆαžšαž“αŸαŸ‡ αž“αž·αž„αž˜αžΌαž›αž αŸαžαž»αž’αŸ’αžœαžΈαŸ” αžαžΎαžœαžΆαžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαžΆ? αžαžΆαž˜αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αž™αžΎαž„ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αž›αž·αžαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“ αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αžŸαŸ’αžαŸαžšαž—αžΆαž– αž“αž·αž„αž‚αž»αžŽαž—αžΆαž–αžαŸ’αž–αžŸαŸ‹αŸ”

αž€αŸ†αžŽαŸ‚αž“αŸƒαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αžαž˜αŸ’αž›αŸƒαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“ αž˜αž»αžαž„αžΆαžšαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€/αž”αž·αž‘ αž αžΎαž™αž’αŸ’αž“αž€αžŽαžΆαž‡αžΆαž’αŸ’αž“αž€αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŽαžΆαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž˜αž½αž™αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžαž·αžαžαŸ†αž”αŸ’αžšαžΉαž„αž”αŸ’αžšαŸ‚αž„αž˜αž½αž™αž…αŸ†αž“αž½αž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αŸ”

αž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž“αž·αž„αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·

αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αžšαžŸαŸ‹αž“αŸ…αž›αžΎαž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž· αž“αž·αž„αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž“αŸƒαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„αŸ”

αž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αž‰αŸ’αž‡αžΈαž“αŸƒαž˜αž»αžαž„αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αŸ–

  1. αž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‹αž·αžαž·αžœαž“αŸ’αžαŸ” αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΆαž€αžŠ
    αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‚αžΊαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”
  2. αž—αžΆαžŸαžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αž”αžΌαžšαž”αŸ‚αž”αŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαž’αžαŸαžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαž…αŸ’αžšαžΎαž“αž”αŸ†αž•αž»αžαŸ” αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎ Scala αž˜αž»αžαž„αžΆαžšαž—αžΆαžŸαžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ‚αž›αž˜αŸ’αž’αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎ
    αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αž›αŸƒαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαžαŸ’αžαž»αž‘αŸ…αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ’αžšαž»αž˜ αž™αžΎαž„αž’αžΆαž…αž™αŸ„αž„αž‘αŸ…αž›αžΎαžœαŸ‰αžΆαž›αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαž€αžΆαžŸαžαŸ‚αž˜αž½αž™αžŠαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (DRY) αž€αŸ’αž“αž»αž„αžœαž·αžŸαžΆαž›αž—αžΆαž–αžšαž»αŸ†αž–αŸαž‘αŸ’αž’αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž“αžΆαž€αŸ‹αžŽαžΆαž˜αž½αž™αž—αŸ’αž›αžΆαž˜αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ (Seq, MapαžαŸ’αž“αžΆαž€αŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“) αŸ”
  3. DSL Scala αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž—αžΆαžŸαžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž DSL αŸ” αžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž‘αžΆαŸ†αž„αž“αŸαŸ‡ αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž—αžΆαžŸαžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‚αŸ„αž›αžŠαŸ… αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‚αžΊαž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αžŠαŸ„αž™αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αžŠαŸ‚αž“αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž―αž€αž‘αŸαžŸαž’αžΆαž…αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”
  4. αžŸαž»αž…αžšαž·αžαž—αžΆαž– αž“αž·αž„αžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αŸ” αž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž˜αž½αž™αž“αŸƒαž€αžΆαžšαž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αž‘αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž…αŸ†αžŽαž»αž…αžαŸ‚αž˜αž½αž™αž‚αžΊαžαžΆαžαž˜αŸ’αž›αŸƒαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž€αžΆαžŸαž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž˜αŸ’αžαž„αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αŸ’αžšαžΎαž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž‚αŸ’αžšαž”αŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαž—αŸαž‘ phantom αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž€αžΆαžŸαž…αŸ’αžšαž€αž’αžΆαž“αžΆαžαžΆαžαŸ’αž“αžΆαŸ†αž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž–αž·αž’αžΈαž€αžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αž€αžΆαžšαž˜αžΆαž“αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‡αžΆαž€αžΆαžαž–αŸ’αžœαž€αž·αž…αŸ’αž…αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„ αž’αžΆαž“αžΆαžαžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αŸ”
  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) αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αž„αŸ’αž€αŸ„αž˜αž”αžΆαž“αž‘αž‘αž½αž›αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαžαŸ’αž“αžΆαŸ†αž„αžαŸ’αž˜αžΈαŸ”

αž€αžΆαžšαžŠαžΉαž„αž‚αž»αžŽ

αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžαŸ’αž›αŸ‚αž„αž’αŸ†αžŽαžšαž‚αž»αžŽαžŠαž›αŸ‹ Andrei Saksonov, Pavel Popov αž“αž·αž„ Anton Nekhaev αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž·αŸ‡αž‚αž“αŸ‹αž€αŸ’αž“αž»αž„αž“αŸαž™αžŸαŸ’αžαžΆαž”αž“αžΆαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž…αŸ†αž–αŸ„αŸ‡αžŸαŸαž…αž€αŸ’αžαžΈαž–αŸ’αžšαžΆαž„αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹