рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдВрддреНрд░ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛ (рд╕реНрдХрд╛рд▓рд╛) рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдордЧреНрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкрд╣рд▓реБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

( рдЕрдВрдЧреНрд░реЗрдЬреА )
рдкрд░рд┐рдЪрдп
рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдиреЛрдб рд╕рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ред рдЖрдорддреМрд░ рдкрд░, DevOps рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ (рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо, рдЕрдирд╕рд┐рдПрдмрд▓, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ) рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдХреНрд╕рд░ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ)ред рд╣рдо рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рд╕рднреА рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рдВрдЧ рдиреЛрдбреНрд╕ (рд╕рдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╕рд╣рд┐рдд) рдкрд░ рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдиреНрдпрдерд╛, рдЕрд╕рдВрдЧрддрддрд╛ рд╣рдорд╛рд░реЗ рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛрдЧреАред рдЬреЗрд╡реАрдПрдо рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдЬрдЧрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрджреЗрд╢реЛрдВ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдмреЗрд╢рдХ, рд╣рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред (рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХреНрд╕рдЯреНрд░рдкрд▓реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХ рд╕рдорд╛рди рд╕реЗрдЯ рднреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред)
рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рдиреЛрдбреНрд╕ рдкрд░ рдПрдХрд▓ рдХреНрд▓рд╛рд╕рдкрд╛рде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рд░ рдЬрдЧрд╣ рдЕрдХреНрд╕рд░ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рд╣реА рд╡рд░реНрдЧрдкрде рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛред (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдХреНрд▓рд╛рд╕рдкреИрде рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреЛрдбреНрд╕ рдЪрд▓рд╛рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд╕реЗ рд╕рдВрдкреВрд░реНрдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рддреИрдирд╛рддреА рдФрд░ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред) рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдиреЛрдбреНрд╕ рдкрд░ рдПрдХ рд╣реА рдХреНрд▓рд╛рд╕рдкреИрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рднреА рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрдИ рдЙрддреНрдкрд╛рджрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╢рд╛рдЦрд╛рдПрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЗрдмрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдЦрд╛ рдХрд╛ рдирд╛рдо)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдЯреАрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдиреЛрдбреНрд╕, рдкреЛрд░реНрдЯреНрд╕, рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдпреЛрдЬрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рд╣рдо рдЗрд╕ рддрдереНрдп рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рдбреЙрдЯ (1.2.3) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рддреАрди рдирдВрдмрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдзреБрдирд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдлреА рдХрдо рд╣реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рдЕрдзрд┐рдХ рдмрд╛рд░ рд╡реЗ рддреИрдирд╛рддреА рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдм рдЫреБрдЖ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рднреА рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ )ред рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ, рд╣рдо рдЕрднреА рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рда рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЪреЗрдХ рд╕реЗ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо рдПрдХ рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рддрд▓рд╛рд╢ рд░рд╣реЗ рд╣реИрдВред
рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕
рдпрд╣ рдЦрдВрдб рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрддрд╛рддрд╛ рд╣реИред рджреЛ рд╕рд░рд▓ рд╕реЗрд╡рд╛рдПрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ - рдЗрдХреЛ рд╕реЗрд╡рд╛ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдХреЛ рд╕реЗрд╡рд╛ред рдЗрди рджреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрд╡рддрд╛рд░ рдореЗрдВ, рджреЛрдиреЛрдВ рд╕реЗрд╡рд╛рдПрдВ рдПрдХ рд╣реА рдиреЛрдб рдкрд░, рджреВрд╕рд░реЗ рдЕрд╡рддрд╛рд░ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбреНрд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИрдВред
рдЖрдорддреМрд░ рдкрд░, рдПрдХ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХрдИ рдиреЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдиреЛрдбреНрд╕ рдХреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
sealed trait NodeId case object Backend extends NodeId case object Frontend extends NodeId
рдпрд╛
case class NodeId(hostName: String)
рдпрд╛ рднреА
object Singleton type NodeId = Singleton.type
рдиреЛрдб рд╡рд┐рднрд┐рдиреНрди рднреВрдорд┐рдХрд╛рдПрдБ рдирд┐рднрд╛рддреЗ рд╣реИрдВ, рдЙрди рдкрд░ рд╕реЗрд╡рд╛рдПрдБ рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдЯреАрд╕реАрдкреА / рдПрдЪрдЯреАрдЯреАрдкреА рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯреАрд╕реАрдкреА рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкреЛрд░реНрдЯ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рднреА рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:
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)
рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдгрдп рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣рдо рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрдЧрддрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдкрдпреБрдХреНрдд рд╕реЗрд╡рд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ Json рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рд╕рд╛рде REST API рд╣реИ:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
рдЬрд╣рд╛рдБ RequestMessage
рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, ResponseMessage
рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдмреЗрд╢рдХ, рдЖрдк рдЕрдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдЯреАрдХрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
рдпрд╣рд╛рдБ, рдЕрдиреБрд░реЛрдз рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕реЗ url рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред
рд╕реЗрд╡рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрд╡рд╛ рдирд╛рдо, рдкреЛрд░реНрдЯ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HList
, рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░)ред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ trait
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдВрдЧреЗред (рдХреЗрдХ рдкреИрдЯрд░реНрди рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред)
рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ EndPoint
рдЕрдиреНрдп рдиреЛрдбреНрд╕ 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
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдВрдЧреЗред 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
- ContextShift
- рд▓рд╛рдЧреВ - рдПрдХ рдкреНрд░рднрд╛рд╡ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдЬреЛ рдЖрдкрдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рднрд╛рд╡ (рд▓рдЧрднрдЧ рдПрдХ рд╕рдирдХ) рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдпрд╣ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
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 }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рд╕рд╛рде рд╣реА, рдпрджрд┐ рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдЫ рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдиреЛрдб рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред
рд╣реЛрд╕реНрдЯ рдирд╛рдо рд╕рдорд╛рдзрд╛рдирдПрдХ рджреВрд░рд╕реНрде рд╣реЛрд╕реНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдИрдкреА рдкрддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдкрддрд╛ рдмрд╛рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдиреЛрдб рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрддреЗ рдкрд░ рдореИрдк рдХрд░рддрд╛ рд╣реИ:
case class NodeAddress[NodeId](host: Uri.Host) trait AddressResolver[F[_]] { def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]] }
рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдпрджрд┐ рддреИрдирд╛рддреА рд╕реЗ рдкрд╣рд▓реЗ рдкрддреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкрддреЗ рдФрд░ рдлрд┐рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╢реБрд░реВред рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рдПрдЧрд╛ред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдЯреЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреЛрдб рдореЗрдВ рдореИрдк рдбрд┐рд╕реНрдкреНрд▓реЗ Map[NodeId, NodeAddress]
рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╡реИрдз рдкрддрд╛ рдиреЛрдб рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЬреНрдЮрд╛рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ "рдЦреЛрдЬ рд╕реЗрд╡рд╛" (рдЦреЛрдЬ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдиреЛрдбреНрд╕ рдЗрд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЗ рдкрддреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗред - рдпрджрд┐ рд╣рдо
/etc/hosts
рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрд╕реНрдЯ рдирд╛рдо (рдЬреИрд╕реЗ my-project-main-node
рдФрд░ echo-backend
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рдирд╛рдореЛрдВ рдХреЛ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВ
рддреИрдирд╛рддреА рдХреЗ рджреМрд░рд╛рди рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд╕рд╛рдеред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рд╣рдо рдЗрди рдорд╛рдорд▓реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд▓рд┐рдП
рдПрдХ рдЦрд┐рд▓реМрдирд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рднреА рдиреЛрдбреНрд╕ рдореЗрдВ рдПрдХ рдЖрдИрдкреА рдкрддрд╛ рд╣реЛрдЧрд╛ - 127.0.0.1
ред
рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
- рдПрдХ рдиреЛрдб рдкрд░ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкреНрд▓реЗрд╕рдореЗрдВрдЯред
- рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбреНрд╕ рдкрд░ рдЗрдХреЛ рд╕рд░реНрд╡рд┐рд╕ рдФрд░ рдЗрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдкреНрд▓реЗрд╕рдореЗрдВрдЯред
рдПрдХрд▓ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди:
рдПрдХрд▓ рдиреЛрдб рд╡рд┐рдиреНрдпрд╛рд╕ object SingleNodeConfig extends EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig { case object Singleton // identifier of the single node // configuration of server type NodeId = Singleton.type def nodeId = Singleton override def portNumber: PortNumber = 8088
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (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 {
рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реЗрд╡рд╛ рдмрдВрдзрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдПрдХ рдиреЛрдб рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╕реЗрд╡рд╛ рдХреЛ рджреВрд╕рд░реЗ рдиреЛрдб рдХреА рдирд┐рд░реНрднрд░рддрд╛ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд▓рдХреНрд╖реНрдп рдиреЛрдб рдХрд╛ рд╕рд╣реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдкреЛрд░реНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВред
рджреЛ рд╕рд┐рд╕реНрдЯрдо рдиреЛрдб рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
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
рджреНрд╡рд╛рд░рд╛ рд░реЛрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдиреЛрдб рдХреБрдЫ рд╕рдордп рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЙрдиреНрдЪ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЗрдЦреЗрдВред
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдордЧреНрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрд╛рдХреА рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп (.jar) рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрд▓рд╛рдХреГрддрд┐ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде, рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЗрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рднреА рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред
рдХреЛрдИ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ
рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгрд╡рддреНрддрд╛ рдЖрд╢реНрд╡рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдмрдЧрдЯреНрд░реИрдХрд░ рдореЗрдВ рдПрдХ рдЯрд┐рдХрдЯ -> рдкреАрдЖрд░ -> рд╕рдореАрдХреНрд╖рд╛ -> рд╕рдВрдмрдВрдзрд┐рдд рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп ->
рдПрдХреАрдХрд░рдг -> рддреИрдирд╛рддреА
рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдкрд░рд┐рдгрд╛рдо:
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдкрд░ рд╕рдордиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рднреА рдиреЛрдбреНрд╕ рдПрдХ рд╣реА рд╕реНрд░реЛрдд рд╕реЗ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдХреЗрд╡рд▓ рдПрдХ рдиреЛрдб рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдЗрд╕рд▓рд┐рдП, "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрд╣рд╛рд╡" рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдЫреЛрдЯреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рд╕рдордЧреНрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдЙрдирдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдХреНрдпрд╛ рдореБрдЭреЗ рдЙрддреНрдкрд╛рджрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рднрдВрдбрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдЕрдиреНрдп рдЧреБрдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдВрддрд┐рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдПрдХреНрд╕реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдЕрд▓рдЧрд╛рд╡ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рд╡рд╛рд▓реЗ рдордзреНрдпрд╡рд░реНрддреА рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рд╕рдВрднрд╡ рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ
рдЖрдЗрдП рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
- рд▓рдХреНрд╖реНрдп рдорд╢реАрди рдкрд░ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ред
- рдореБрдЦреНрдп-рдореВрд▓реНрдп рдХреЗрдВрджреНрд░реАрдХреГрдд рднрдВрдбрд╛рд░рдг (
etcd
/ zookeeper
)ред - рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдЬрд┐рдиреНрд╣реЗрдВ рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ / рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд╛рд╣рд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рднрдВрдбрд╛рд░рдгред
рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЗрдВ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдо рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рджреВрд░рд╕реНрде рдиреЛрдб рдкрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрдбрд╝реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЪреАрд▓рд╛рдкрди рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЕрдиреНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рд╣реИрдВред рдХреЛрдИ рднреА рд╕рдореАрдХреНрд╖рд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕рдиреЗ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдФрд░ рдХрд┐рд╕ рдХрд╛рд░рдг рд╕реЗред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рд╕рдХрддрд╛ рд╣реИред
(рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдФрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ Config
, рдФрд░ рдЖрдк рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддреБрд░рдВрдд рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреБрдЫ рд╣рдж рддрдХ рд╣реИред рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдХрдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред)
рд╕реЗрдВрдЯреНрд░рд▓рд╛рдЗрдЬреНрдб рдХреА-рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрдЯреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореЗрдЯрд╛-рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрдВрддреНрд░ рд╣реИред рд╣рдореЗрдВ рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдмрд╕ рдбреЗрдЯрд╛ рдХреНрдпрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди C => A => B
, рдкреИрд░рд╛рдореАрдЯрд░ C
рд╢рд╛рдпрдж рд╣реА рдХрднреА рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрдЯрд╛ A
рдЕрдХреНрд╕рд░ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ C
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ A
рдбреЗрдЯрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдЙрд╕ рдбреЗрдЯрд╛ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдмрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реНрд░реЛрдд (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ), рдФрд░ рджреВрд╕рд░реЗ (рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рдХ рд╕реЗ) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЖрддрд╛ рд╣реИред
рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рд╢рд╛рдпрдж рд╣реА рдмрджрд▓рддреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдХреНрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдкреИрд░рд╛рдореАрдЯрд░, рд╕реНрдЯреЛрд░, рдкрд╛рд░реНрд╕ рдФрд░ рдЪреЗрдХ рдбрд┐рд▓реАрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЧрд▓рдд рдорд╛рдиред рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ)ред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдо рд╕реНрдереИрддрд┐рдХ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рд╕реЗрд╡рд╛ рдХреЗ рддрд░реНрдХ рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдмрджрд▓рддреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рдХрд╣реЗрдВрдЧреЗред рдЕрдиреНрдпрдерд╛, рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдерд┐рд░ рд╣реИрдВ рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЧрддрд┐рд╢реАрд▓ рдкреБрдирд░реНрд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╕рдорд╛рдиред (рд╣рдорд╛рд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдУрдПрд╕ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред)
рдПрдХ рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рдкреБрдирд░реНрд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╡рд╣ рд╕рдордп рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдкрдбреЗрдЯ (рдбрд╛рдЙрдирдЯрд╛рдЗрдо) рдХреЗ рдмрд╛рдж рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рд╣рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдбрд╛рдЙрдирдЯрд╛рдЗрдо рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЧрдВрднреАрд░рддрд╛ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдПрдХ рд╕рдордп рдореЗрдВ рд░рд┐рдмреВрдЯ рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд▓реЛрдб рдХрдо рд╕реЗ рдХрдо рд╣реЛред рдпрджрд┐ рдЖрдк рдирд┐рд░рдВрддрд░ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк "рдЬрд▓ рдирд┐рдХрд╛рд╕реА рдХрдиреЗрдХреНрд╢рди" (AWS ELB рдХрдиреЗрдХреНрд╢рди рдЬрд▓ рдирд┐рдХрд╛рд╕реА) рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЬрдм рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдо рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЙрджрд╛рд╣рд░рдг рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдмреИрд▓реЗрдВрд╕рд░ рдХреЛ рдЙрд╕рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдкреБрд░рд╛рдиреЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд░реЗ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЕрдм рд╣рдо рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рдЕрдВрджрд░ рдпрд╛ рдмрд╛рд╣рд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрджрд┐ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЖрд░реНрдЯрд╡рд░реНрдХ рдХреЗ рдЕрдВрджрд░ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдерд╛ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╣реА рдерд╛ред рдпрджрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рдмрд╛рд╣рд░ рд╣реИ, рддреЛ рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕рдиреЗ рдФрд░ рдХреНрдпреЛрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рд╣реИрдВред рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? рд╣рдорд╛рд░реА рд░рд╛рдп рдореЗрдВ, рдХрдИ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдм рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХреНрдпрд╛ рдХрд╛рд░реНрдп рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рд╣реИрдВ, рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдмреЗрд╢рдХ, рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рдЕрдВрджрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╕реВрдЪрд┐рдд рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖
рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд▓рд╛рдн
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╣реИ:
- рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЬрд╛рдБрдЪред рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╣реА рд╣реИред - . . Scala , . ,
trait' , , val', (DRY) . ( Seq
, Map
, ). - DSL. Scala , DSL. , , , . , , .
- . , , , , . , . , .
- . , , .
- . , .
- . , . . ( , , , , -.) тАФ . , , , , .
- . , . , , . . . , production'.
- . , . , , тАФ . production- .
- рдкрд░реАрдХреНрд╖рдгред mock-, , .
- . . , , , .
. :
- . production', . . . .
- . , , .
- . , , . / .
- . DevOps . .
- . (CI/CD). .
, :
- , , . , Cake Pattern' , ,
HList
(case class') . - , : (
package
, import
, ; override def
' , ). , DSL. , (, XML), . - .
рдирд┐рд╖реНрдХрд░реНрд╖
Scala. xml- . , Scala, ( Kotlin, C#, Swift, ...). , , , , , .
, . .
:
- .
- DSL .
- . , , (1) ; (2) .
, .