рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

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

рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

(рд░рд╢рд┐рдпрди рдордзреНрдпреЗ)

рдкрд░рд┐рдЪрдп

рдордЬрдмреВрдд рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рд╡рд░ рдпреЛрдЧреНрдп рдЖрдгрд┐ рд╕реБрд╕рдВрдЧрдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рдордЬрдХреВрд░ рдЙрдкрдпреЛрдЬрди рд╡рд░реНрдгрди (рдЯреЗрд░рд╛рдлреЙрд░реНрдо, рдЙрддреНрддрд░рджрд╛рдпреА рдХрд┐рдВрд╡рд╛ рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА) рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдпрд▓реА (рдмрд╣реБрддреЗрдХрджрд╛ тАФ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб/рднреВрдорд┐рдХреЗрд╕рд╛рдареА рд╕рдорд░реНрдкрд┐рдд) рд╡рд╛рдкрд░рдгреЗ. рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкреНрд░реЗрд╖рдг рдиреЛрдбреНрд╕рд╡рд░ рд╕рдорд╛рди рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреЗ рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ (рдЕрдиреНрдпрдерд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛ рдпреЗрддреАрд▓). JVM рдЬрдЧрд╛рдд рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдХрд┐рдорд╛рди рдореЗрд╕реЗрдЬрд┐рдВрдЧ рд▓рд╛рдпрдмреНрд░рд░реА рд╕рд░реНрд╡ рд╕рдВрдкреНрд░реЗрд╖рдг рдиреЛрдбреНрд╕рд╡рд░ рд╕рдорд╛рди рдЖрд╡реГрддреНрддреАрдЪреА рдЕрд╕рд╛рд╡реА.

рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рдЪрд╛рдЪрдгреАрдмрджреНрджрд▓ рдХрд╛рдп? рдЕрд░реНрдерд╛рдд, рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╡рд░ рдпреЗрдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕рд░реНрд╡ рдШрдЯрдХрд╛рдВрд╕рд╛рдареА рдпреБрдирд┐рдЯ рдЪрд╛рдЪрдгреНрдпрд╛ рдЭрд╛рд▓реНрдпрд╛ рдкрд╛рд╣рд┐рдЬреЗрдд. рд░рдирдЯрд╛рдЗрдорд╡рд░ рдЪрд╛рдЪрдгреА рдкрд░рд┐рдгрд╛рдо рдПрдХреНрд╕реНрдЯреНрд░рд╛рдкреЛрд▓реЗрдЯ рдХрд░рдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд╕рд░реНрд╡ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛ рд░рдирдЯрд╛рдЗрдо рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдПрдХрд╕рд╛рд░рдЦреНрдпрд╛ рдареЗрд╡рд▓реНрдпрд╛ рдЖрд╣реЗрдд рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХреЗрд▓реА рдкрд╛рд╣рд┐рдЬреЗ.

рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреНрдпрд╛ рдЪрд╛рд▓рд╡рддрд╛рдирд╛, рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рд╡рд░ рд╕рдорд╛рди рд╡рд░реНрдЧрдкрд╛рде рдЕрд╕рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЕрд╕рддреЗ. рдЖрдореНрд╣реА рдлрдХреНрдд рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдХреА рдЙрдкрдпреЛрдЬрдирд╛рд╡рд░ рд╕рдорд╛рди рд╡рд░реНрдЧрдкрд╛рде рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. (рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдиреЛрдбреНрд╕рд╡рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдХреНрд▓рд╛рд╕рдкрд╛рде рд╡рд╛рдкрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреЗ рдЖрдгрд┐ рддреЗ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рдЖрд╣реЗ.) рддреНрдпрд╛рдореБрд│реЗ рдЧреЛрд╖реНрдЯреА рд╕реЛрдкреНрдпрд╛ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рд╡рд░ рдлрдХреНрдд рд╕рдорд╛рди рд╡рд░реНрдЧрдкрдерд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ.

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рд╕рд╣ рдПрдХрддреНрд░рд┐рддрдкрдгреЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЗ. рдЖрдореНрд╣реА рд╕рд╣рд╕рд╛ рд╡рд┐рд╡рд┐рдз рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡реГрддреНрддреНрдпрд╛ рд╡рд╛рдкрд░рддреЛ
рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдЙрддреНрдХреНрд░рд╛рдВрддреАрдЪреЗ рдЯрдкреНрдкреЗ. рдЖрд╡реГрддреНрддреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЕрдВрддрд░реНрдЧрдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд╡реНрд╣рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдХрд╛рд╣реА рд▓реЗрдмрд▓рд╛рдВрд╕рд╣ рднрд┐рдиреНрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдУрд│рдЦрдгреЗ рд╡рд╛рдЬрд╡реА рд╡рд╛рдЯрддреЗ. рдЙрддреНрдкрд╛рджрдирд╛рдордзреНрдпреЗ рдПрдХрдЪ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдПрдХрд▓ рдЖрд╡реГрддреНрддреА рдУрд│рдЦрдХрд░реНрддрд╛ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ. рдХрдзреАрдХрдзреА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХрд╛рдзрд┐рдХ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдЕрд╕реВ рд╢рдХрддреЗ. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рд╡реЗрдЧрд│реНрдпрд╛ рд╢рд╛рдЦреЗрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реВ рд╢рдХрддреЗ. рддреНрдпрд╛рдореБрд│реЗ рднрд┐рдиреНрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдиреНрд╕ рдЕрдирдиреНрдпрдкрдгреЗ рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд▓рд╛ рд╢рд╛рдЦрд╛ рдЖрдгрд┐ рдЖрд╡реГрддреНрддреАрд╕рд╣ рд▓реЗрдмрд▓ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рд▓реЗрдмрд▓ рдЖрдгрд┐ рдЖрд╡реГрддреНрддреА рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд╡рд░реАрд▓ рд╡рд┐рддрд░рд┐рдд рдиреЛрдбреНрд╕, рдкреЛрд░реНрдЯреНрд╕, рдмрд╛рд╣реНрдп рд╕рдВрд╕рд╛рдзрдиреЗ, рдХреНрд▓рд╛рд╕рдкрд╛рде рд▓рд╛рдпрдмреНрд░рд░реА рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рдПрдХрд╛рдЪ рд╕рдВрдпреЛрдЬрдирд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ. рдпреЗрдереЗ рдЖрдореНрд╣реА рдлрдХреНрдд рдПрдХ рд╢рд╛рдЦрд╛ рдХрд╡реНрд╣рд░ рдХрд░реВ рдЖрдгрд┐ рдЗрддрд░ рдХрд▓рд╛рдХреГрддреАрдВрдкреНрд░рдорд╛рдгреЗрдЪ рддреАрди рдШрдЯрдХ рджрд╢рд╛рдВрд╢ рдЖрд╡реГрддреНрддреА (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

рд╣реЗ рдиреЛрдбреНрд╕ рд╡рд┐рд╡рд┐рдз рднреВрдорд┐рдХрд╛ рдкрд╛рд░ рдкрд╛рдбрддрд╛рдд, рдХрд╛рд╣реА рд╕реЗрд╡рд╛ рдЪрд╛рд▓рд╡рддрд╛рдд рдЖрдгрд┐ рдЗрддрд░ рдиреЛрдбреНрд╕рд╢реА TCP/HTTP рдХрдиреЗрдХреНрд╢рдирджреНрд╡рд╛рд░реЗ рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рд╛рд╡реЗрдд.

TCP рдХрдиреЗрдХреНрд╢рдирд╕рд╛рдареА рдХрд┐рдорд╛рди рдПрдХ рдкреЛрд░реНрдЯ рдХреНрд░рдорд╛рдВрдХ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдореНрд╣реА рд╣реЗ рджреЗрдЦреАрд▓ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░ рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмреЛрд▓рдд рдЖрд╣реЗрдд. рдиреЛрдбреНрд╕рдордзреАрд▓ рдХрдиреЗрдХреНрд╢рди рдореЙрдбреЗрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░реВрдпрд╛:

case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])

рдЬреЗрдереЗ Port рдлрдХреНрдд рдПрдХ рдЖрд╣реЗ Int рдЕрдиреБрдордд рд╢реНрд░реЗрдгреАрдордзреНрдпреЗ:

type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]

рдкрд░рд┐рд╖реНрдХреГрдд рдкреНрд░рдХрд╛рд░

рдкрд╣рд╛ рд╢реБрджреНрдз рд▓рд╛рдпрдмреНрд░рд░реА рдереЛрдбрдХреНрдпрд╛рдд, рддреЗ рдЗрддрд░ рдкреНрд░рдХрд╛рд░рд╛рдВрдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рд╡реЗрд│реЗрдЪреА рдорд░реНрдпрд╛рджрд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд Int рдлрдХреНрдд 16-рдмрд┐рдЯ рдореВрд▓реНрдпреЗ рдЕрд╕рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдЖрд╣реЗ рдЬреА рдкреЛрд░реНрдЯ рдХреНрд░рдорд╛рдВрдХ рджрд░реНрд╢рд╡реВ рд╢рдХрддреЗ. рдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрджреНрдзрддреАрд╕рд╛рдареА рд╣реА рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА. рд╣реЗ рдлрдХреНрдд рдЦреВрдк рдЪрд╛рдВрдЧрд▓реЗ рдмрд╕рдд рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рджрд┐рд╕рддреЗ.

HTTP (REST) тАЛтАЛрд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реЗрд╡реЗрдЪрд╛ рдорд╛рд░реНрдЧ рджреЗрдЦреАрд▓ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реВ рд╢рдХрддреЛ:

type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)

рдлреЕрдиреНрдЯрдо рдкреНрд░рдХрд╛рд░

рд╕рдВрдХрд▓рдирд╛рджрд░рдореНрдпрд╛рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдкреНрд░рдХрд╛рд░ рд╡рд┐рддрд░реНрдХ рдШреЛрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕реНрдХрд╛рд▓рд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд╡рд╛рдкрд░рдд рдЖрд╣реЛрдд Protocol рдЬреЗ рд╡рд░реНрдЧрд╛рдд рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА. рд╣реЗ рд╕реЛ рдХреЙрд▓реНрдб рдЖрд╣реЗ рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░. рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХреНрд╡рдЪрд┐рддрдЪ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ, рдореНрд╣рдгреВрдирдЪ рдЖрдореНрд╣реА рддреЗ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдд рдирд╛рд╣реА. рд╕рдВрдХрд▓рдирд╛рджрд░рдореНрдпрд╛рди рд╣рд╛ рдлреЕрдВрдЯрдо рдкреНрд░рдХрд╛рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░рдЪреА рд╕реБрд░рдХреНрд╖рд╛ рджреЗрддреЛ. рдЖрдореНрд╣реА рдЪреБрдХреАрдЪреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╕рд╣ рдкреЛрд░реНрдЯ рдкрд╛рд╕ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА.

рд╕рд░реНрд╡рд╛рдд рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ Json рд╕реАрд░рд┐рдпрд▓рд╛рдпрдЭреЗрд╢рдирд╕рд╣ REST API:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

рдЬреЗрдереЗ RequestMessage рдХреНрд▓рд╛рдпрдВрдЯ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдкрд╛рдард╡реВ рд╢рдХрдгрд╛рд░реЗ рд╕рдВрджреЗрд╢рд╛рдВрдЪреЗ рдореВрд│ рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗ рдЖрдгрд┐ ResponseMessage рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рд╕рдВрджреЗрд╢ рдЖрд╣реЗ. рдЕрд░реНрдерд╛рдд, рдЖрдореНрд╣реА рдЗрддрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд░реНрдгрди рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ рдЬреЗ рдЗрдЪреНрдЫрд┐рдд рдЕрдЪреВрдХрддреЗрд╕рд╣ рд╕рдВрдкреНрд░реЗрд╖рдг рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛рдд.

рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рд╣реЗрддреВрдВрд╕рд╛рдареА рдЖрдореНрд╣реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреА рд╕реЛрдкреА рдЖрд╡реГрддреНрддреА рд╡рд╛рдкрд░реВ:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

рдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдордзреНрдпреЗ рд╡рд┐рдирдВрддреА рд╕рдВрджреЗрд╢ url рдордзреНрдпреЗ рдЬреЛрдбрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдкреНрд░рддрд┐рд╕рд╛рдж рд╕рдВрджреЗрд╢ рдкреНрд▓реЗрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореНрд╣рдгреВрди рдкрд░рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рд╕реЗрд╡рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рд╡рд░реНрдгрди рд╕реЗрд╡реЗрдЪреЗ рдирд╛рд╡, рдкреЛрд░реНрдЯреНрд╕ рдЖрдгрд┐ рдХрд╛рд╣реА рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡рд╛рдВрджреНрд╡рд╛рд░реЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рд╕реНрдХрд╛рд▓рд╛рдордзреНрдпреЗ рдпрд╛ рд╕рд░реНрд╡ рдШрдЯрдХрд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рдпрд╛рдЪреЗ рдХрд╛рд╣реА рд╕рдВрднрд╛рд╡реНрдп рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, HList, рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░). рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдВрд╕рд╛рдареА рдЖрдореНрд╣реА рдХреЗрдХ рдкреЕрдЯрд░реНрди рд╡рд╛рдкрд░реВ рдЖрдгрд┐ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рддреБрдХрдбреЗ (рдореЙрдбреНрдпреВрд▓) рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгреВрди рдкреНрд░рд╕реНрддреБрдд рдХрд░реВ. (рдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╕рд╛рдареА рдХреЗрдХ рдкреЕрдЯрд░реНрдирдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА. рд╣реА рдХрд▓реНрдкрдирд╛рдЪреА рдлрдХреНрдд рдПрдХ рд╕рдВрднрд╛рд╡реНрдп рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЖрд╣реЗ.)

рдХреЗрдХ рдкреЕрдЯрд░реНрдирдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдЗрддрд░ рдиреЛрдбреНрд╕рдЪреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреВ рдореНрд╣рдгреВрди рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡рд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

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

рдЗрдХреЛ рд╕реЗрд╡реЗрд▓рд╛ рдлрдХреНрдд рдкреЛрд░реНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдгрд┐ рдЖрдореНрд╣реА рдШреЛрд╖рд┐рдд рдХрд░рддреЛ рдХреА рд╣реЗ рдкреЛрд░реНрдЯ рдЗрдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ. рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдпрд╛ рдХреНрд╖рдгреА рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА, рдХрд╛рд░рдг рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЕрдореВрд░реНрдд рдкрджреНрдзрддреА рдШреЛрд╖рдгрд╛рдВрдирд╛ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЖрдореНрд╣реА рдЕрдореВрд░реНрдд рдкрджреНрдзрддреА рд╡рд╛рдкрд░рд▓реНрдпрд╛рд╕, рдХрдВрдкрд╛рдЗрд▓рд░рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдпреЗрдереЗ рдЖрдореНрд╣реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдкреНрд░рджрд╛рди рдХреЗрд▓реА рдЖрд╣реЗ (8081) рдЖрдгрд┐ рдЬрд░ рдЖрдореНрд╣реА рддреЗ рдХреЙрдВрдХреНрд░рд┐рдЯ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рд╡рдЧрд│рд▓реЗ рддрд░ рддреЗ рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдп рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдИрд▓.

рдЖрдореНрд╣реА рдЗрдХреЛ рд╕рд░реНрд╡реНрд╣рд┐рд╕ рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдШреЛрд╖рд┐рдд рдХрд░реВ рд╢рдХрддреЛ:

  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 - рдЪреЗ analog ExecutionContext
  • Applicative тАФ рдкреНрд░рднрд╛рд╡реА рдлрдВрдХреНрд╢рдиреНрд╕рдЪреЗ рдЖрд╡рд░рдг (рдЬрд╡рд│рдЬрд╡рд│ рдПрдХ рдореЛрдирд╛рдб) (рдЖрдореНрд╣реА рд╢реЗрд╡рдЯреА рддреЗ рджреБрд╕рд░реНтАНрдпрд╛ рдХрд╢рд╛рдиреЗ рдмрджрд▓реВ рд╢рдХрддреЛ)

рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдЖрдореНрд╣реА рдХрд╛рд╣реА рд╕реЗрд╡рд╛ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддреЛ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЕрд╢реА рд╕реЗрд╡рд╛ рдЬреА рдХрд╛рд╣реАрд╣реА рдХрд░рдд рдирд╛рд╣реА:

  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
}

рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рдиреЛрдбрдордзреНрдпреЗ рдЖрдореНрд╣реА рдпрд╛ рдиреЛрдбрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рдЕрдЪреВрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЛ. рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдХрд╛рд░рд╛рд╕рд╣ рдСрдмреНрдЬреЗрдХреНрдЯ (рдХреЗрдХ) рддрдпрд╛рд░ рдХрд░реВ рджреЗрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдпрд╛рд╡рд░реАрд▓ рдорд░реНрдпрд╛рджрд╛ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ. Config рдкреНрд░рдХрд╛рд░ рддрд╕реЗрдЪ рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХреЗрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдиреЛрдб рд╕реБрд░реВ рдХрд░реВ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА.

рдиреЛрдб рдкрддреНрддрд╛ рдард░рд╛рд╡

рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд╕рд╛рдареА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛрд╕реНрдЯ рдкрддреНрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рдЗрддрд░ рднрд╛рдЧрд╛рдВрдкреЗрдХреНрд╖рд╛ рдирдВрддрд░ рдУрд│рдЦрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдореНрд╣рдгреВрди, рдЖрдореНрд╣рд╛рд▓рд╛ рдиреЛрдб рдЖрдпрдбреА рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддреНрддрд╛ рдпрд╛рдВрдЪреНрдпрд╛рдордзреНрдпреЗ рдореЕрдкрд┐рдВрдЧ рдкреБрд░рд╡рдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рд╣рд╡рд╛ рдЖрд╣реЗ. рд╣реЗ рдореЕрдкрд┐рдВрдЧ рдПрдХ рдХрд╛рд░реНрдп рдЖрд╣реЗ:

case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
  def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}

рдЕрд╕реЗ рдХрд╛рд░реНрдп рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪреЗ рдХрд╛рд╣реА рд╕рдВрднрд╛рд╡реНрдп рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд.

  1. рдиреЛрдб рд╣реЛрд╕реНрдЯ рдЗрдиреНрд╕реНрдЯрдВрдЯрд┐рдПрд╢рди рджрд░рдореНрдпрд╛рди, рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯрдкреВрд░реНрд╡реА рдЖрдореНрд╣рд╛рд▓рд╛ рдЦрд░реЗ рдкрддреНрддреЗ рдорд╛рд╣рд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддреНрддреНрдпрд╛рдВрд╕рд╣ рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдирдВрддрд░ рдмрд┐рд▓реНрдб рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ (рдЬреЗ рдХрдВрдкрд╛рдЗрд▓ рдЯрд╛рдЗрдо рдЪреЗрдХ рдХрд░рддреЗ рдЖрдгрд┐ рдирдВрддрд░ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдЪрд╛рд▓рд╡рддреЗ). рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдордЪреЗ рдореЕрдкрд┐рдВрдЧ рдХрд╛рд░реНрдп рд╕реНрдерд┐рд░рдкрдгреЗ рдУрд│рдЦрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рддреЗ a рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА рд╕реЛрдкреЗ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ 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 рдордзреНрдпрд╛рдВрддрд░ рдкрд╛рд╕.

рд╕реЗрд╡рд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рд╕рдорд╛рди рд╕рдВрдЪ рджреЛрди рд╕реНрд╡рддрдВрддреНрд░ рдиреЛрдбреНрд╕рд╕рд╣ рд╕рд┐рд╕реНрдЯрдордЪреЗ рд▓реЗрдЖрдЙрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЖрдкрдг рдлрдХреНрдд рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рджреЛрди рд╕реНрд╡рддрдВрддреНрд░ рдиреЛрдб рдХреЙрдиреНрдлрд┐рдЧ рдпреЛрдЧреНрдп рд╕реЗрд╡рд╛рдВрд╕рд╣:

рджреЛрди рдиреЛрдбреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

  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, рддрд░ рдЗрдХреЛ рдХреНрд▓рд╛рдпрдВрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдорд░реНрдпрд╛рджрд┐рдд рдХрд╛рд▓рд╛рд╡рдзреАрдирдВрддрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдИрд▓. рдкрд╣рд╛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдзрд┐рдХ рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА.

рдПрдХреВрдгрдЪ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдд рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рдХрд╕рд╛ рдмрджрд▓рддреЛ рддреЗ рдкрд╛рд╣реВ рдпрд╛.

рдХреЛрдб рдореНрд╣рдгреВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрд▓рд╛ рдЗрддрд░ рдХреЛрдб рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯреНрд╕рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рд╡рд╛рдЬрд╡реА рд╡рд╛рдЯрддреЗ. рдмрд░реНтАНрдпрд╛рдЪрджрд╛ рдЖрдкрд▓реНрдпрд╛рдХрдбреЗ рдПрдХрд╛рдЪ рдХреЛрдб рдмреЗрд╕рд╡рд░ рдЕрдиреЗрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдиреНрд╕ рдЕрд╕реВ рд╢рдХрддрд╛рдд. рдЖрдгрд┐ рдЕрд░реНрдерд╛рддрдЪ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╡рд┐рд╡рд┐рдз рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╢рд╛рдЦрд╛рдВрдЪреНрдпрд╛ рдЕрдиреЗрдХ рдЖрд╡реГрддреНрддреНрдпрд╛ рдЕрд╕реВ рд╢рдХрддрд╛рдд. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдЖрдореНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реАрдЪреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддреНрдпрд╛ рдирд┐рд╡рдбреВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рд╣реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рд╣реЗ рд╕реНрдерд┐рд░ рд░рд╛рд╣реАрд▓.

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рд╣рд╛ рдХреЛрдб рдмрджрд▓ рд╣реЛрддреЛ. рдореНрд╣рдгреВрди рддреЗ рд╕рдорд╛рди рдЧреБрдгрд╡рддреНрддрд╛ рдЖрд╢реНрд╡рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпреЗрджреНрд╡рд╛рд░реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рд╡реЗ:

рддрд┐рдХреАрдЯ -> PR -> рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди -> рд╡рд┐рд▓реАрдиреАрдХрд░рдг -> рд╕рддрдд тАЛтАЛрдПрдХрддреНрд░реАрдХрд░рдг -> рд╕рддрдд тАЛтАЛрддреИрдирд╛рддреА

рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪреЗ рдЦрд╛рд▓реАрд▓ рдкрд░рд┐рдгрд╛рдо рдЖрд╣реЗрдд:

  1. рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реБрд╕рдВрдЧрдд рдЖрд╣реЗ. рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдиреЛрдбреНрд╕рдордзреНрдпреЗ рдЪреБрдХреАрдЪреЗ рдХрдиреЗрдХреНрд╢рди рдЕрд╕рдгреНрдпрд╛рдЪрд╛ рдХреЛрдгрддрд╛рд╣реА рдорд╛рд░реНрдЧ рдирд╛рд╣реА.
  2. рдлрдХреНрдд рдПрдХрд╛ рдиреЛрдбрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдгреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА. рд▓реЙрдЧ рдЗрди рдХрд░рдгреЗ рдЖрдгрд┐ рдХрд╛рд╣реА рдордЬрдХреВрд░ рдлрд╛рдпрд▓реА рдмрджрд▓рдгреЗ рдЕрд╡рд╛рд╕реНрддрд╡ рд╡рд╛рдЯрддреЗ. рддреНрдпрд╛рдореБрд│реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбреНрд░рд┐рдлреНрдЯ рдХрдореА рд╢рдХреНрдп рд╣реЛрддреЗ.
  3. рдЫреЛрдЯреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рдХрд░рдгреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА.
  4. рдмрд╣реБрддреЗрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рд╕рдорд╛рди рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддреАрд▓ рдЖрдгрд┐ рддреЗ рдХрд╛рд╣реА рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдкрд╛рд╕ рдХрд░реЗрд▓.

рдЙрддреНрдкрд╛рджрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдХрд╛? рдЙрддреНрдкрд╛рджрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдорд╛рд╣рд┐рддреА рдЕрд╕реВ рд╢рдХрддреЗ рдЬреА рдЖрдореНрд╣реА рдЕрдиреЗрдХ рд▓реЛрдХрд╛рдВрдЪреНрдпрд╛ рдЖрд╡рд╛рдХреНрдпрд╛рдмрд╛рд╣реЗрд░ рдареЗрд╡реВ рдЗрдЪреНрдЫрд┐рддреЛ. рддреНрдпрд╛рдореБрд│реЗ рдЙрддреНрдкрд╛рджрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдкреНрд░рд╡реЗрд╢рд╛рд╕рд╣ рд╡реЗрдЧрд│реЗ рднрд╛рдВрдбрд╛рд░ рдареЗрд╡рдгреЗ рдлрд╛рдпрджреЗрд╢реАрд░ рдард░реВ рд╢рдХрддреЗ. рдЖрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд▓рд╛ рджреЛрди рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реВ рд╢рдХрддреЛ - рдПрдХ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЙрддреНрдкрд╛рджрдирд╛рдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЦреБрд▓реЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдПрдХ рдЬреНрдпрд╛рдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рдЧреБрдкреНрдд рднрд╛рдЧ рдЕрд╕рддреЛ. рд╣реЗ рдЦрд░реЛрдЦрд░рдЪ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рдкреНрд░рд╡реЗрд╢ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛рдирд╛ рдмрд╣реБрддреЗрдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреНрдпреЗ рдмрд╣реБрддреЗрдХ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рдкреНрд░рд╡реЗрд╢ рд╕рдХреНрд╖рдо рдХрд░реЗрд▓. рдбреАрдлреЙрд▓реНрдЯ рдкреЕрд░рд╛рдореАрдЯрд░ рдореВрд▓реНрдпрд╛рдВрд╕рд╣ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдЧреБрдг рд╡рд╛рдкрд░реВрди рд╣реЗ рдкреВрд░реНрдг рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ.

рд╡рд┐рд╡рд┐рдзрддрд╛

рдЗрддрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рддрдВрддреНрд░рд╛рдВрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрджреНрдзрддреАрдЪреЗ рдлрд╛рдпрджреЗ рдЖрдгрд┐ рддреЛрдЯреЗ рдкрд╛рд╣реВ.

рд╕рд░реНрд╡рдкреНрд░рдердо, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрджреНрдзрддреАрдЪреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдкреИрд▓реВрдВрд╕рд╛рдареА рдЖрдореНрд╣реА рдХрд╛рд╣реА рдкрд░реНрдпрд╛рдпрд╛рдВрдЪреА рдпрд╛рджреА рдХрд░реВ:

  1. рд▓рдХреНрд╖реНрдп рдорд╢реАрдирд╡рд░ рдордЬрдХреВрд░ рдлрд╛рдЗрд▓.
  2. рдХреЗрдВрджреНрд░реАрдХреГрдд рдХреА-рд╡реНрд╣реЕрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ (рдЬрд╕реЗ etcd/zookeeper).
  3. рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдШрдЯрдХ рдЬреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рди рдХрд░рддрд╛ рдкреБрдиреНрд╣рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░/рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.
  4. рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯ рдЖрдгрд┐ рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдгрд╛рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди.

рдордЬрдХреВрд░ рдлрд╛рдЗрд▓ рддрджрд░реНрде рдирд┐рд░рд╛рдХрд░рдгрд╛рдВрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдХрд╛рд╣реА рд▓рд╡рдЪрд┐рдХрддрд╛ рджреЗрддреЗ. рд╕рд┐рд╕реНрдЯрдордЪрд╛ рдкреНрд░рд╢рд╛рд╕рдХ рд▓рдХреНрд╖реНрдп рдиреЛрдбрд╡рд░ рд▓реЙрдЧ рдЗрди рдХрд░реВ рд╢рдХрддреЛ, рдмрджрд▓ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд╕реЗрд╡рд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддреЛ. рд╣реЗ рдореЛрдареНрдпрд╛ рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рддрд┐рддрдХреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА. рдмрджрд▓рд╛рдорд╛рдЧреЗ рдХреЛрдгрддреЗрд╣реА рдЯреНрд░реЗрд╕ рд░рд╛рд╣рд┐рд▓реЗрд▓реЗ рдирд╛рд╣реАрдд. рдмрджрд▓рд╛рдЪреЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рджреБрд╕рд░реНтАНрдпрд╛ рдбреЛрд│реНрдпрд╛рдВрдЪреНрдпрд╛ рдЬреЛрдбреАрдиреЗ рдХреЗрд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА. рдмрджрд▓ рдХрд╢рд╛рдореБрд│реЗ рдЭрд╛рд▓рд╛ рд╣реЗ рд╢реЛрдзрдгреЗ рдХрдареАрдг рд╣реЛрдК рд╢рдХрддреЗ. рддреНрдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдЭрд╛рд▓реЗрд▓реА рдирд╛рд╣реА. рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдХреЛрдирд╛рддреВрди рдкреНрд░рд╢рд╛рд╕рдХ рдЗрддрд░ рдиреЛрдбреНрд╕рдкреИрдХреА рдПрдХрд╛рдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреЗ рд╡рд┐рд╕рд░реВ рд╢рдХрддреЛ.

(Btw, рдЬрд░ рд╢реЗрд╡рдЯреА рдордЬрдХреВрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рд╡рд╛рдкрд░рдгреЗ рд╕реБрд░реВ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдкрд╛рд░реНрд╕рд░ + рд╡реНрд╣реЕрд▓рд┐рдбреЗрдЯрд░ рдЬреЛрдбрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЬреЗ рд╕рдорд╛рди рддрдпрд╛рд░ рдХрд░реВ рд╢рдХреЗрд▓. Config рдЯрд╛рдЗрдк рдХрд░рд╛ рдЖрдгрд┐ рдордЬрдХреВрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░рдгреЗ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рдкреБрд░реЗрд╕реЗ рдЕрд╕реЗрд▓. рд╣реЗ рджреЗрдЦреАрд▓ рджрд░реНрд╢рд╡рд┐рддреЗ рдХреА рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рдЬрдЯрд┐рд▓рддрд╛ рдордЬрдХреВрд░-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рдЬрдЯрд┐рд▓рддреЗрдкреЗрдХреНрд╖рд╛ рдереЛрдбреА рдХрдореА рдЖрд╣реЗ, рдХрд╛рд░рдг рдордЬрдХреВрд░-рдЖрдзрд╛рд░рд┐рдд рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╛рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд.)

рдХреЗрдВрджреНрд░реАрдХреГрдд рдХреА-рд╡реНрд╣реЕрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ рд╣реА рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдЯрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╡рд┐рддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЪрд╛рдВрдЧрд▓реА рдпрдВрддреНрд░рдгрд╛ рдЖрд╣реЗ. рдпреЗрдереЗ рдЖрдкрдг рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдореВрд▓реНрдпреЗ рдХрд╛рдп рдорд╛рдирддреЛ рдЖрдгрд┐ рдлрдХреНрдд рдбреЗрдЯрд╛ рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдПрдХ рдХрд╛рд░реНрдп рджрд┐рд▓реЗ C => A => B рдЖрдореНрд╣реА рд╕рд╣рд╕рд╛ рдХреНрд╡рдЪрд┐рдд рдмрджрд▓рдгрд╛рд░реА рдореВрд▓реНрдпреЗ рдореНрд╣рдгрддреЛ C "рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди", рд╡рд╛рд░рдВрд╡рд╛рд░ рдбреЗрдЯрд╛ рдмрджрд▓рдд рдЕрд╕рддрд╛рдирд╛ A - рдлрдХреНрдд рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдХрд░рд╛. рдбреЗрдЯрд╛рдЪреНрдпрд╛ рдЖрдзреА рдлрдВрдХреНрд╢рдирд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЬрд╛рд╡реЗ A. рд╣реА рдХрд▓реНрдкрдирд╛ рджрд┐рд▓реНрдпрд╛рд╕ рдЖрдореНрд╣реА рдЕрд╕реЗ рдореНрд╣рдгреВ рд╢рдХрддреЛ рдХреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдлрдХреНрдд рдбреЗрдЯрд╛рдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рдмрджрд▓рд╛рдВрдЪреА рд╣реА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд╛рд░рдВрд╡рд╛рд░рддрд╛ рдЖрд╣реЗ. рддрд╕реЗрдЪ рдбреЗрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдпрдд: рдПрдХрд╛ рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди (рд╡рд╛рдкрд░рдХрд░реНрддрд╛) рдпреЗрддреЛ рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡реЗрдЧрд│реНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди (рдкреНрд░рд╢рд╛рд╕рдХ) рдпреЗрддреЗ. рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдирдВрддрд░ рдмрджрд▓рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╢реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗрд▓реНрдпрд╛рдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╛рдврддреЗ. рдЕрд╢рд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреА рд╡рд┐рддрд░рдг рдпрдВрддреНрд░рдгрд╛, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЖрдгрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг, рдЪреБрдХреАрдЪреА рдореВрд▓реНрдпреЗ рд╣рд╛рддрд╛рд│рд╛рд╡реА рд▓рд╛рдЧрддреАрд▓. рдореНрд╣рдгреВрди, рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреА рдЬрдЯрд┐рд▓рддрд╛ рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рдмрджрд▓реВ рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХрд░реВ рд╢рдХрддреЛ (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдВрдирд╛ рдкреВрд░реНрдгрдкрдгреЗ рдХрд╛рдвреВрди рдЯрд╛рдХреВ).

рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдХреЛрдирд╛рддреВрди рдЖрдкрдг рд╕реНрдерд┐рд░ рдЖрдгрд┐ рдбрд╛рдпрдиреЕрдорд┐рдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреНрдпреЗ рдлрд░рдХ рдХреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ. рд╕рд░реНрд╡реНрд╣рд┐рд╕ рд▓реЙрдЬрд┐рдХрд▓рд╛ рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рдХрд╛рд╣реА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреНрдпреЗ рджреБрд░реНрдорд┐рд│ рдмрджрд▓ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдбрд╛рдпрдиреЕрдорд┐рдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдореНрд╣рдгреВ рд╢рдХрддреЛ. рдЕрдиреНрдпрдерд╛ рддреЗ рд╕реНрдерд┐рд░ рдЖрд╣реЗрдд рдЖрдгрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрди рд╡рд╛рдкрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдбрд╛рдпрдиреЕрдорд┐рдХ рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА рдЗрддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрди рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реВ рд╢рдХрддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рд┐рд╕реНрдЯрдордЪреЗ рдХрд╛рд╣реА рднрд╛рдЧ рдирд╡реАрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╣ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЬрд╕реЗ рдХреА рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдордЪреНрдпрд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.
(рдорд╛рдЭреЗ рдирдореНрд░ рдордд рдЖрд╣реЗ рдХреА рд░рдирдЯрд╛рдЗрдо рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЯрд╛рд│рд╛рд╡реЗ рдХрд╛рд░рдг рдпрд╛рдореБрд│реЗ рд╕рд┐рд╕реНрдЯрдордЪреА рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╛рдврддреЗ.
рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдлрдХреНрдд OS рд╕рдорд░реНрдердирд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд░рд╛рд╣рдгреЗ рдЕрдзрд┐рдХ рд╕рд░рд│ рдЕрд╕реВ рд╢рдХрддреЗ. рддрдерд╛рдкрд┐, рд╣реЗ рдиреЗрд╣рдореАрдЪ рд╢рдХреНрдп рдирд╕рддреЗ.)

рд╕реНрдЯреЕрдЯрд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдкреИрд▓реВ рдЬреНрдпрд╛рдореБрд│реЗ рд▓реЛрдХ рдХрдзреАрдХрдзреА рдбрд╛рдпрдиреЕрдорд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (рдЗрддрд░ рдХрд╛рд░рдгрд╛рдВрд╢рд┐рд╡рд╛рдп) рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд╛рдд рддреЗ рдореНрд╣рдгрдЬреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрдкрдбреЗрдЯ рджрд░рдореНрдпрд╛рди рд╕рд░реНрд╡реНрд╣рд┐рд╕ рдбрд╛рдЙрдирдЯрд╛рдЗрдо. рдЦрд░рдВрдЪ, рдЬрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрдЯреЕрдЯрд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдмрджрд▓ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рддреАрд▓ рддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЬреЗрдгреЗрдХрд░реВрди рдирд╡реАрди рдореВрд▓реНрдпреЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрддреАрд▓. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕рд┐рд╕реНрдЯреАрдорд╕рд╛рдареА рдбрд╛рдЙрдирдЯрд╛рдЗрдордЪреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рднрд┐рдиреНрди рдЕрд╕рддрд╛рдд, рддреНрдпрд╛рдореБрд│реЗ рдХрджрд╛рдЪрд┐рдд рддреЗ рдЗрддрдХреЗ рдЧрдВрднреАрд░ рдирд╕рд╛рд╡реЗ. рдЬрд░ рддреЗ рдЧрдВрднреАрд░ рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреАрд╣реА рдкреНрд░рдгрд╛рд▓реА рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрдвреЗ рдпреЛрдЬрдирд╛ рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░реВ рд╢рдХрддреЛ AWS ELB рдХрдиреЗрдХреНрд╢рди рдирд┐рдЪрд░рд╛. рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдЬреЗрд╡реНрд╣рд╛ рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ, рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рд╕рдорд╛рдВрддрд░рдкрдгреЗ рд╕рд┐рд╕реНрдЯрдордЪреЗ рдирд╡реАрди рдЙрджрд╛рд╣рд░рдг рд╕реБрд░реВ рдХрд░рддреЛ, рддреНрдпрд╛рдирдВрддрд░ рдЬреБрдиреНрдпрд╛ рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рд╡рд┐рджреНрдпрдорд╛рди рдХрдиреЗрдХреНрд╢рдирдЪреА рд╕рд░реНрд╡реНрд╣рд┐рд╕рд┐рдВрдЧ рдкреВрд░реНрдг рдХрд░реВ рджреЗрдКрди рддреНрдпрд╛рд╡рд░ ELB рд╕реНрд╡рд┐рдЪ рдХрд░рддреЛ.

рд╡реНрд╣рд░реНрдЬрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдЪреНрдпрд╛ рдЖрдд рдХрд┐рдВрд╡рд╛ рдмрд╛рд╣реЗрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдареЗрд╡рдгреНрдпрд╛рдмрджреНрджрд▓ рдХрд╛рдп? рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдареЗрд╡рдгреЗ рдореНрд╣рдгрдЬреЗ рдмрд╣реБрддреЗрдХ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдиреЗ рдЗрддрд░ рдХрд▓рд╛рдХреГрддреАрдВрдкреНрд░рдорд╛рдгреЗрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╣рдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рд░ рдХреЗрд▓реА рдЖрд╣реЗ. рддреНрдпрд╛рдореБрд│реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджрд░реНрдЬреЗрджрд╛рд░ рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЕрд╕рд▓реНрдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдЕрд╕реВ рд╢рдХрддреЗ. рдпрд╛рдЙрд▓рдЯ рд╡реЗрдЧрд│реНрдпрд╛ рдлрд╛рдИрд▓рдордзреАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рддреНрдпрд╛ рдлрд╛рдИрд▓рдордзреНрдпреЗ рдХреЛрдгреА рдЖрдгрд┐ рдХрд╛ рдмрджрд▓ рдХреЗрд▓реЗ рдпрд╛рдЪрд╛ рдХреЛрдгрддрд╛рд╣реА рдорд╛рдЧреЛрд╡рд╛ рдирд╛рд╣реА. рд╣реЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ рдХрд╛? рдЖрдордЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЖрд╣реЗ рдХреА рдмрд╣реБрддреЗрдХ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рд╕реНрдерд┐рд░ рдЖрдгрд┐ рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрд╕рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.

рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдЪреА рдЖрд╡реГрддреНрддреА рддреЗ рдХреЗрд╡реНрд╣рд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рддреНрдпрд╛рдд рдХреЛрдгрддреА рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд, рдХреЛрдгрддреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╕рдХреНрд╖рдо/рдЕрдХреНрд╖рдо рдЖрд╣реЗрдд, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рд╕рд╛рдареА рдХреЛрдг рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдПрдЦрд╛рджреНрдпрд╛ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рдкреНрд░рдпрддреНрди рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓ рдЖрдгрд┐ рд╣реА рдПрдХ рдбрд┐рдЭрд╛рдЗрди рдирд┐рд╡рдб рдЖрд╣реЗ.

рд╕рд╛рдзрдХ рдЖрдгрд┐ рдмрд╛рдзрдХ

рдпреЗрдереЗ рдЖрдореНрд╣реА рдХрд╛рд╣реА рдлрд╛рдпрджреЗ рд╣рд╛рдпрд▓рд╛рдЗрдЯ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рдЖрдгрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрджреНрдзрддреАрдЪреЗ рдХрд╛рд╣реА рддреЛрдЯреЗ рдЪрд░реНрдЪрд╛ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ.

рдлрд╛рдпрджреЗ

рд╕рдВрдкреВрд░реНрдг рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ:

  1. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рд╕реНрдерд┐рд░ рддрдкрд╛рд╕рдгреА. рд╣реЗ рдЙрдЪреНрдЪ рдкрд╛рддрд│реАрд╡рд░реАрд▓ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рджреЗрддреЗ, рдХреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░рдЪреА рдорд░реНрдпрд╛рджрд╛ рдЖрд╣реЗ.
  2. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рд╕рдореГрджреНрдз рднрд╛рд╖рд╛. рд╕рд╛рдорд╛рдиреНрдпрдд: рдЗрддрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрдзреНрджрддреА рдмрд╣реБрддреЗрдХ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдирд╛рдкрд░реНрдпрдВрдд рдорд░реНрдпрд╛рджрд┐рдд рдЕрд╕рддрд╛рдд.
    Scala рд╡рд╛рдкрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рднрд╛рд╖рд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪреА рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реЗрдгреА рд╡рд╛рдкрд░реВ рд╢рдХрддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдпреЗ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ, рднрд┐рдиреНрди рд╕реНрдХреЛрдк рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕, рдЖрдореНрд╣реА рд╕рдВрджрд░реНрдн рдШреЗрдК рд╢рдХрддреЛ vals рдмрд╛рд╣реНрдп рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░рд╛рдд (DRY) рдлрдХреНрдд рдПрдХрджрд╛рдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ. рд╢рд╛рдмреНрджрд┐рдХ рдЕрдиреБрдХреНрд░рдо рдХрд┐рдВрд╡рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧрд╛рдВрдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ (Seq, Map, рдЗрддреНрдпрд╛рджреА).
  3. DSL. рд╕реНрдХрд╛рд▓рд╛рд▓рд╛ рдбреАрдПрд╕рдПрд▓ рд▓реЗрдЦрдХрд╛рдВрд╕рд╛рдареА рдпреЛрдЧреНрдп рд╕рдорд░реНрдерди рдЖрд╣реЗ. рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрдгрд┐ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЕрдиреБрдХреВрд▓ рдЕрд╢реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рднрд╛рд╖рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЛрдгреАрд╣реА рдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВ рд╢рдХрддреЛ, рдЬреЗрдгреЗрдХрд░реВрди рдЕрдВрддрд┐рдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд┐рдорд╛рди рдбреЛрдореЗрди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рд╡рд╛рдЪрддрд╛ рдпреЗрдИрд▓.
  4. рдиреЛрдбреНрд╕рдордзреНрдпреЗ рдЕрдЦрдВрдбрддрд╛ рдЖрдгрд┐ рд╕реБрд╕рдВрдЧрддрддрд╛. рд╕рдВрдкреВрд░реНрдг рд╡рд┐рддрд░реАрдд рдкреНрд░рдгрд╛рд▓реАрд╕рд╛рдареА рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрд╕рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рдореНрд╣рдгрдЬреЗ рд╕рд░реНрд╡ рдореВрд▓реНрдпреЗ рдПрдХрджрд╛ рдХрд╛рдЯреЗрдХреЛрд░рдкрдгреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реА рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдард┐рдХрд╛рдгреА рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддрд╛рдд. рддрд╕реЗрдЪ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреЛрд░реНрдЯ рдШреЛрд╖рдгрд╛ рдЯрд╛рдИрдк рдХрд░рд╛ рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рд╛ рдХреА рд╕рд░реНрд╡ рд╕рдВрднрд╛рд╡реНрдп рдпреЛрдЧреНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рд╕рд┐рд╕реНрдЯрдордЪреЗ рдиреЛрдб рд╕рдорд╛рди рднрд╛рд╖рд╛ рдмреЛрд▓рддреАрд▓. рдиреЛрдбреНрд╕рдордзреНрдпреЗ рд╕реНрдкрд╖реНрдЯ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдореБрд│реЗ рдХрд╛рд╣реА рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреЗ рд╡рд┐рд╕рд░рдгреЗ рдХрдареАрдг рд╣реЛрддреЗ.
  5. рдмрджрд▓рд╛рдВрдЪреА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛. рд╕рд╛рдорд╛рдиреНрдп рдкреАрдЖрд░ рдкреНрд░рдХреНрд░рд┐рдпреЗрджреНрд╡рд╛рд░реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдПрдХрдВрджрд░ рджреГрд╖реНрдЯреАрдХреЛрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдЧреБрдгрд╡рддреНрддреЗрдЪреЗ рдЙрдЪреНрдЪ рдорд╛рдирдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЛ.
  6. рдПрдХрд╛рдЪ рд╡реЗрд│реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓. рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА рдмрджрд▓ рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЙрдкрдпреЛрдЬрди рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рд╕рд░реНрд╡ рдиреЛрдбреНрд╕ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗрдд.
  7. рдЕрд░реНрдЬ рд╕рд░рд▓реАрдХрд░рдг. рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдгрд┐ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рдЪреБрдХреАрдЪреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдореВрд▓реНрдпреЗ рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА. рд╣реЗ рдПрдХреВрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд▓рдн рдХрд░рддреЗ. (рдХрд╛рд╣реА рдХреНрд▓рд┐рд╖реНрдЯрддрд╛ рд╡рд╛рдв рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗрдЪ рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╣реЗ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ рдПрдХ рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрд╣реЗ.) рд╕рд╛рдорд╛рдиреНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдкрд░рдд рдЬрд╛рдгреЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ - рдлрдХреНрдд рдЧрд╣рд╛рд│ рддреБрдХрдбреЗ рдЬреЛрдбрд╛. рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ рдЖрдгрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рддреБрдХрдбреНрдпрд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдирдВрддрд░рдЪреНрдпрд╛ рдХрд╛рд│рд╛рдд рдкреБрдвреЗ рдврдХрд▓рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ.
  8. рдЖрд╡реГрддреНрддреАрдмрджреНрдз рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рд╕рдорд╛рди рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛рдд рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ, рдкрд░рд┐рдгрд╛рдореА рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╡реГрддреНрддреАрд╕рд╣ рдПрдХ рдХрд▓рд╛рдХреГрддреА рдорд┐рд│рддреЗ. рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрд░рдд рд╕реНрд╡рд┐рдЪ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЖрдореНрд╣реА рдПрдХ рд╡рд░реНрд╖рд╛рдкреВрд░реНрд╡реА рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреЗрдЦреАрд▓ рддреИрдирд╛рдд рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рддреЗ рдЕрдЧрджреА рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░реЗрд▓. рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реАрдЪреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рддрд╛ рд╕реБрдзрд╛рд░рддреЗ. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдХрд▓рд┐рдд рд╡реЗрд│реА рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реАрд╡рд░ рд╕рд╣рдЬрдкрдгреЗ рдЫреЗрдбрдЫрд╛рдб рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА.
  9. рдореЙрдбреНрдпреВрд▓рд░рд┐рдЯреА. рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЙрдбреНрдпреВрд▓рд░ рдЖрд╣реЗ рдЖрдгрд┐ рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдХрд╛рд░реЗ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд
    рднрд┐рдиреНрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (рд╕реЗрдЯрдЕрдк/рд▓реЗрдЖрдЙрдЯреНрд╕) рдЪреЗ рд╕рдорд░реНрдерди рдХрд░рд╛. рд╡рд┐рд╢реЗрд╖рддрдГ, рд▓рд╣рд╛рди рд╕реНрдХреЗрд▓ рд╕рд┐рдВрдЧрд▓ рдиреЛрдб рд▓реЗрдЖрдЙрдЯ рдЖрдгрд┐ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдорд▓реНрдЯреА рдиреЛрдб рд╕реЗрдЯрд┐рдВрдЧ рдЕрд╕рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ. рдПрдХрд╛рдзрд┐рдХ рдЙрддреНрдкрд╛рджрди рд▓реЗрдЖрдЙрдЯ рдЕрд╕рдгреЗ рд╡рд╛рдЬрд╡реА рдЖрд╣реЗ.
  10. рдЪрд╛рдЪрдгреА. рдЪрд╛рдЪрдгреАрдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдиреЗ рдПрдЦрд╛рджреА рдореЙрдХ рд╕реЗрд╡рд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгреВ рд╢рдХрддреЗ рдЖрдгрд┐ рддреА рдПрдХрд╛ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рд░реНрдЧрд╛рдиреЗ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░реВ рд╢рдХрддреЗ. рдореЙрдХрджреНрд╡рд╛рд░реЗ рдмрджрд▓рд▓реЗрд▓реНрдпрд╛ рд╡рд┐рд╡рд┐рдз рднрд╛рдЧрд╛рдВрд╕рд╣ рдХрд╛рд╣реА рднрд┐рдиреНрди рдЪрд╛рдЪрдгреА рд▓реЗрдЖрдЙрдЯ рдПрдХрд╛рдЪ рд╡реЗрд│реА рд░рд╛рдЦрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.
  11. рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреА. рдХрдзреАрдХрдзреА рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдВрдордзреНрдпреЗ рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреНрдпрд╛ рдЪрд╛рд▓рд╡рдгреЗ рдХрдареАрдг рдЕрд╕рддреЗ. рд╕рдВрдкреВрд░реНрдг рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЯрд╛рдИрдк рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкрджреНрдзрддреАрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди, рдЖрдореНрд╣реА рд╕рд░реНрд╡ рд╡рд┐рддрд░рд┐рдд рднрд╛рдЧ рдПрдХрд╛рдЪ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдорд╛рд░реНрдЧрд╛рдиреЗ рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ. рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреЗ рдЕрдиреБрдХрд░рдг рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ
    рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреА рд╕реЗрд╡рд╛ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрддреЗ.

рддреЛрдЯреЗ

рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреГрд╖реНрдЯреАрдХреЛрди "рд╕рд╛рдорд╛рдиреНрдп" рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдкреЗрдХреНрд╖рд╛ рднрд┐рдиреНрди рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рд╕рд░реНрд╡ рдЧрд░рдЬрд╛ рднрд╛рдЧрд╡реВ рд╢рдХрдд рдирд╛рд╣реА. рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдХрд╛рд╣реА рддреЛрдЯреЗ рдпреЗрдереЗ рдЖрд╣реЗрдд:

  1. рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди. рд╣реЗ рд╕рд░реНрд╡ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рдпреЛрдЧреНрдп рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА. рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╕рд░реНрд╡ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдпрд╛рдВрдирд╛ рдорд╛рдЧреЗ рдЯрд╛рдХреВрди рдЙрддреНрдкрд╛рджрдирд╛рддреАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреНрд░реБрддрдкрдгреЗ рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рдЕрдзрд┐рдХ рдХрдареАрдг рдХрд░рддреЛ. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдХреЛрдгрддрд╛рд╣реА рдмрджрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╕рдВрдХрд▓рди рдЖрдгрд┐ рдкреБрдирд░реНрдирд┐рдпреЛрдЬрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрдгрд┐ рдУрдЭреЗ рджреЛрдиреНрд╣реА рдЖрд╣реЗ.
  2. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрдорд┐рддреА. рдЬреЗрд╡реНрд╣рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд╛рд╣реА рдСрдЯреЛрдореЗрд╢рди рдЯреВрд▓рджреНрд╡рд╛рд░реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ рддреЗрд╡реНрд╣рд╛ рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╕рд╛рдареА рдирдВрддрд░рдЪреЗ рд╕рдВрдХрд▓рди рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ (рдЬреЗ рдХрджрд╛рдЪрд┐рдд рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдК рд╢рдХрддреЗ). рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рдпрд░реА рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрддреНрдирд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реВ рд╢рдХрддреЗ.
  3. рд╡рд╛рджреНрдпреЗ. рдЖрдЬ рд╡рд╛рдкрд░рд╛рдд рдЕрд╕рд▓реЗрд▓реА рдмрд░реАрдЪ рд╕рд╛рдзрдиреЗ рдЖрд╣реЗрдд рдЬреА рдордЬрдХреВрд░-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗрдд. рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреИрдХреА рдХрд╛рд╣реА
    рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛рд╡рд░ рд▓рд╛рдЧреВ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.
  4. рдорд╛рдирд╕рд┐рдХрддреЗрдд рдмрджрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╡рд┐рдХрд╕рдХ рдЖрдгрд┐ DevOps рдордЬрдХреВрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рд╢реА рдкрд░рд┐рдЪрд┐рдд рдЖрд╣реЗрдд. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рддреНрдпрд╛рдВрдирд╛ рд╡рд┐рдЪрд┐рддреНрд░ рд╡рд╛рдЯреВ рд╢рдХрддреЗ.
  5. рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рд╛рджрд░ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреА рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗрд▓реНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рдХрд╛рд╣реА рдорд░реНрдпрд╛рджрд╛ рдЖрд╣реЗрдд:

  1. рдЬрд░ рдЖрдореНрд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЬреНрдпрд╛рдЪреА рдорд╛рдЧрдгреА рдиреЛрдб рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрджреНрд╡рд╛рд░реЗ рдХреЗрд▓реА рдЬрд╛рдд рдирд╛рд╣реА, рддрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╢реЛрдзрдгреНрдпрд╛рдд рдорджрдд рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рд╣реЗ рд╡рд╛рдкрд░реВрди рд╕рдВрдмреЛрдзрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ HList рдХрд┐рдВрд╡рд╛ ADTs (рдХреЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕) рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрдгрд┐ рдХреЗрдХ рдкреЕрдЯрд░реНрдирдРрд╡рдЬреА рдиреЛрдб рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА.
  2. рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдХрд╛рд╣реА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓: (package, import, object рдШреЛрд╖рдгрд╛;
    override defрдЪреНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╛рдареА рдЬреНрдпрд╛рдд рдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд). рд╣реЗ рдЕрдВрд╢рддрдГ рдбреАрдПрд╕рдПрд▓ рд╡рд╛рдкрд░реВрди рд╕рдВрдмреЛрдзрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
  3. рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ рдЖрдореНрд╣реА рд╕рдорд╛рди рдиреЛрдбреНрд╕рдЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░реНрд╕рдЪреНрдпрд╛ рдбрд╛рдпрдиреЕрдорд┐рдХ рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рдд рдирд╛рд╣реА.

рдирд┐рд╖реНрдХрд░реНрд╖

рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ рдЖрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдереЗрдЯ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреНрдпреЗ рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рдЯрд╛рдЗрдк рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХрд▓реНрдкрдиреЗрд╡рд░ рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЖрд╣реЗ. рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рдЕрдиреЗрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ xml- рдЖрдгрд┐ рдЗрддрд░ рдордЬрдХреВрд░-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрдЪреНрдпрд╛ рдмрджрд▓реА рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЖрдордЪреЗ рдЙрджрд╛рд╣рд░рдг рд╕реНрдХрд╛рд▓рд╛рдордзреНрдпреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЕрд╕реВрдирд╣реА, рддреЗ рдЗрддрд░ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдВрдордзреНрдпреЗ рджреЗрдЦреАрд▓ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ (рдЬрд╕реЗ рдХреА рдХреЛрдЯрд▓рд┐рди, рд╕реА#, рд╕реНрд╡рд┐рдлреНрдЯ рдЗ.). рдПрдЦрд╛рджреНрдпрд╛ рдирд╡реАрди рдкреНрд░рдХрд▓реНрдкрд╛рдд рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЬрд░ рддреЛ рдиреАрдЯ рдмрд╕рдд рдирд╕реЗрд▓ рддрд░ рдЬреБрдиреНрдпрд╛ рдкрджреНрдзрддреАрдЪрд╛ рдорд╛рд░реНрдЧ рдмрджрд▓реВ рд╢рдХрддреЛ.

рдЕрд░реНрдерд╛рдд, рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреА рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреНрдпрд╛ рдмрджрд▓реНрдпрд╛рдд рддреЗ рддрд┐рддрдХреЗрдЪ рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреЗ рдордЬрдмреВрдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡рдЪрди рджреЗрддреЗ.

рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рд╡рд┐рд╡рд┐рдз рдорд╛рд░реНрдЧрд╛рдВрдиреА рд╡рд╛рдврд╡рд┐рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ:

  1. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореЕрдХреНрд░реЛрдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡реНрдпрд╡рд╕рд╛рдп-рд▓реЙрдЬрд┐рдХ рдорд░реНрдпрд╛рджрд╛ рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕ рд╕рдВрдХрд▓рд┐рдд рд╡реЗрд│реА рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдК рд╢рдХрддреЛ.
  2. рдбреЛрдореЗрди-рд╡рд╛рдкрд░рдХрд░реНрддрд╛-рдЕрдиреБрдХреВрд▓ рдкрджреНрдзрддреАрдиреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА DSL рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.
  3. рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдпреЛрдЬрдирд╛рдВрд╕рд╣ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрдг рдХреНрд▓рд╕реНрдЯрд░ рдиреЛрдбреНрд╕рдЪреА рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╣рд╡реЗ рдЕрд╕реЗрд▓ (1) рдиреЛрдбреНрд╕ рдереЛрдбреЗ рд╕реБрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА; (реи) рдХреНрд▓рд╕реНрдЯрд░ рдореЕрдиреЗрдЬрд░ рдирд╡реАрди рдиреЛрдбреНрд╕ рдорд╛рд╣рд┐рддреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

рдзрдиреНрдпрд╡рд╛рдж

рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рдорд╕реБрджреНрдпрд╛рд╡рд░ рдкреНрд░реЗрд░рдгрд╛рджрд╛рдпреА рдЕрднрд┐рдкреНрд░рд╛рдп рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдореА рдЖрдВрджреНрд░реЗ рд╕рд╛рдХрд╕реЛрдиреЛрд╡реНрд╣, рдкрд╛рд╡реЗрд▓ рдкреЛрдкреЛрд╡реНрд╣, рдЕрдБрдЯреЛрди рдиреЗрд╣реЗрд╡ рдпрд╛рдВрдЪреЗ рдЖрднрд╛рд░ рдорд╛рдиреВ рдЗрдЪреНрдЫрд┐рддреЛ рдЬреНрдпрд╛рдореБрд│реЗ рдорд▓рд╛ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдЭрд╛рд▓реА.

рд╕реНрддреНрд░реЛрдд: www.habr.com