рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

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

рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

(рдЕрдВрдЧреНрд░реЗрдЬреА)

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

рднрд░рдкрд░реНрджреЛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБ рднрдиреЗрдХреЛ рд╕рдмреИ рдиреЛрдбрд╣рд░реВрд▓реЗ рд╕рд╣реА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рдЕрдиреНрдп рдиреЛрдбрд╣рд░реВрд╕рдБрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрджрдЫред DevOps рдЯреЗрдХреНрдиреЛрд▓реЛрдЬреАрд╣рд░реВ (terraform, ansible рд╡рд╛ рдпрд╕реНрддреИ рдХреЗрд╣рд┐) рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓рд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ (рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рд╛рдпрдГ рд╡рд┐рд╢рд┐рд╖реНрдЯ)ред рд╣рд╛рдореА рдпреЛ рдкрдирд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ рдХрд┐ рд╕рдмреИ рд╕рдВрдЪрд╛рд░ рдиреЛрдбрд╣рд░реВ рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХрд▓рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдЫрдиреН (рдПрдЙрдЯреИ рд╕рдВрд╕реНрдХрд░рдг рд╕рд╣рд┐рдд)ред рдЕрдиреНрдпрдерд╛, рд╣рд╛рдореНрд░реЛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдЕрд╕рдВрдЧрддрд┐ рдирд┐рд░реНрдорд╛рдг рд╣реБрдиреЗрдЫред JVM рд╕рдВрд╕рд╛рд░рдорд╛, рдпрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛рдХреЛ рдПрдЙрдЯрд╛ рдкрд░рд┐рдгрд╛рдо рднрдиреЗрдХреЛ рдкреНрд░реЛрдЯреЛрдХрд▓ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рднрдПрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХреЛ рдПрдЙрдЯреИ рд╕рдВрд╕реНрдХрд░рдг рдЬрддрд╛рддрддреИ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреБрдкрд░реНрдЫред

рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рдкрд░реАрдХреНрд╖рдгрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗ рд╣реЛ? рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╣рд╛рдореА рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгрдорд╛ рдЬрд╛рдиреБ рдЕрдШрд┐ рд╕рдмреИ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрдорд╛ рдПрдХрд╛рдЗ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЫрдиреН рднрдиреА рдорд╛рдиреНрджрдЫреМрдВред (рд╣рд╛рдореАрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рд░рдирдЯрд╛рдЗрдордорд╛ рдПрдХреНрд╕реНрдЯреНрд░рд╛рдкреЛрд▓реЗрдЯ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рд░ рд░рдирдЯрд╛рдЗрдордорд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕рдорд╛рди рд╕реЗрдЯ рдкрдирд┐ рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрдиреБрдкрд░реНрдЫред)

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

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

рдЖрдзреБрдирд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛, рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓рд╣рд░реВ рд╡рд┐рд░рд▓реИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреНрдЫрдиреНред рдкреНрд░рд╛рдпрдГ рддрд┐рдиреАрд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдХреЛ рд╕рдордпрдорд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН рд░ рдЕрдм рдЫреЛрдЗрдБрджреИрди (рддреНрдпрд╕реИрд▓реЗ рдХреЗрд╣рд┐ рдирддреЛрдбреНрдиреБрд╣реЛрд╕реН)ред рдПрдЙрдЯрд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдкреНрд░рд╢реНрди рдЙрдареНрдЫ: рдХрд┐рди рд╣рд╛рдореА рдЕрдЭреИ рдкрдирд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдкрд╛рда рдврд╛рдБрдЪрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ? рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рд░ рдХрдореНрдкрд╛рдЗрд▓-рд╕рдордп рдЬрд╛рдБрдЪрд╣рд░реВрдмрд╛рдЯ рдлрд╛рдЗрджрд╛ рд╣реБрдиреЗ рджреЗрдЦрд┐рдиреНрдЫред

рдпрд╕ рдкреЛрд╖реНрдЯрдорд╛ рд╣рд╛рдореА рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрд▓рд╛рдХреГрддрд┐ рднрд┐рддреНрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рд╡рд┐рдЪрд╛рд░рдХреЛ рдЕрдиреНрд╡реЗрд╖рдг рдЧрд░реНрдиреЗрдЫреМрдВред

рд╕рдВрдХрд▓рд┐рдд рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

рдпреЛ рдЦрдгреНрдбрд▓реЗ рд╕реНрдерд┐рд░ рд╕рдВрдХрд▓рд┐рдд рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рджреБрдИ рд╕рд░рд▓ рд╕реЗрд╡рд╛рд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ - рдЗрдХреЛ рд╕реЗрд╡рд╛ рд░ рдЗрдХреЛ рд╕реЗрд╡рд╛ рдЧреНрд░рд╛рд╣рдХред рдпреА рджреБрдИ рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд, рджреБрдИ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рднреЗрд▓рд╛ рд╣реБрдиреНрдЫрдиреНред рдПрдХ рд╡рд┐рдХрд▓реНрдкрдорд╛, рджреБрдмреИ рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдЙрдЯреИ рдиреЛрдбрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫрдиреН, рдЕрд░реНрдХреЛ рд╡рд┐рдХрд▓реНрдкрдорд╛ - рдлрд░рдХ рдиреЛрдбрд╣рд░реВрдорд╛ред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдзреЗрд░реИ рдиреЛрдбрд╣рд░реВ рд╣реБрдиреНрдЫрдиреНред рддрдкрд╛рдИрд▓реЗ рдХреЗрд╣рд┐ рдкреНрд░рдХрд╛рд░рдХрд╛ рдорд╛рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдиреЛрдбрд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ NodeId:

sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId

рд╡рд╛

case class NodeId(hostName: String)

рд╡рд╛ рдкрдирд┐

object Singleton
type NodeId = Singleton.type

рдиреЛрдбрд╣рд░реВрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рднреВрдорд┐рдХрд╛рд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫрдиреН, рддрд┐рдиреАрд╣рд░реВ рд╕реЗрд╡рд╛рд╣рд░реВ рдЪрд▓рд╛рдЙрдБрдЫрдиреН рд░ рддрд┐рдиреАрд╣рд░реВ рдмреАрдЪ TCP/HTTP рдЬрдбрд╛рдирд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

TCP рдЬрдбрд╛рдирдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрди рд╣рд╛рдореАрд▓рд╛рдИ рдХрдореНрддрд┐рдорд╛ рдПрдЙрдЯрд╛ рдкреЛрд░реНрдЯ рдирдореНрдмрд░ рдЪрд╛рд╣рд┐рдиреНрдЫред рд╣рд╛рдореА рддреНрдпрд╕ рдкреЛрд░реНрдЯрдорд╛ рд╕рдорд░реНрдерд┐рдд рдкреНрд░реЛрдЯреЛрдХрд▓рд▓рд╛рдИ рдкрдирд┐ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рд░ рд╕рд░реНрднрд░ рджреБрдмреИ рдПрдЙрдЯреИ рдкреНрд░реЛрдЯреЛрдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдЫрдиреНред рд╣рд╛рдореА рдирд┐рдореНрди рд╡рд░реНрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЬрдбрд╛рди рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреМрдВ:

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

рдЬрд╣рд╛рдБ Port - рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ Int рд╕реНрд╡реАрдХрд╛рд░реНрдп рдорд╛рдирд╣рд░реВрдХреЛ рджрд╛рдпрд░рд╛ рд╕рдВрдХреЗрдд рдЧрд░реНрджреИ:

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

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

рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдкрд░рд┐рд╖реНрдХреГрдд ╨╕ рдореЗрд░реЛ рд░рд┐рдкреЛрд░реНрдЯред рдЫреЛрдЯрдХрд░реАрдорд╛, рдкреБрд╕реНрддрдХрд╛рд▓рдпрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрдореНрдкрд╛рдЗрд▓ рд╕рдордпрдорд╛ рдЬрд╛рдБрдЪ рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рдХрд╛рд░рд╣рд░реВрдорд╛ рдмрд╛рдзрд╛рд╣рд░реВ рдердкреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдорд╛рдиреНрдп рдкреЛрд░реНрдЯ рдирдореНрдмрд░ рдорд╛рдирд╣рд░реВ 16-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдЩреНрдХрд╣рд░реВ рд╣реБрдиреНред рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐, рдкрд░рд┐рд╖реНрдХреГрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЫреИрди, рддрд░ рдпрд╕рд▓реЗ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдЬрд╛рдБрдЪ рдЧрд░реНрди рдХрдореНрдкрд╛рдЗрд▓рд░рдХреЛ рдХреНрд╖рдорддрд╛рд▓рд╛рдИ рд╕реБрдзрд╛рд░ рдЧрд░реНрджрдЫред

HTTP (REST) тАЛтАЛрдкреНрд░реЛрдЯреЛрдХрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдкреЛрд░реНрдЯ рдирдореНрдмрд░рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рд╛рдореАрд▓рд╛рдИ рд╕реЗрд╡рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рд░реНрдЧ рдкрдирд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ:

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

рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░рд╣рд░реВ

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

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЯреЛрдХрд▓ рдордзреНрдпреЗ рдПрдХ Json рдХреНрд░рдорд┐рдХрд░рдг рд╕рдВрдЧ REST API рд╣реЛ:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

рдЬрд╣рд╛рдБ RequestMessage - рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд░, ResponseMessage - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ред
рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╣рд╛рдореА рдЕрдиреНрдп рдкреНрд░реЛрдЯреЛрдХрд▓ рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдЬрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рд╡рд┐рд╡рд░рдгрдХреЛ рд╢реБрджреНрдзрддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред

рдпрд╕ рдкреЛрд╖реНрдЯрдХреЛ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдкреНрд░реЛрдЯреЛрдХрд▓рдХреЛ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

рдпрд╣рд╛рдБ рдЕрдиреБрд░реЛрдз url рдорд╛ рдЬреЛрдбрд┐рдПрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рд╣реЛ рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдХреЛ рдореБрдЦреНрдп рднрд╛рдЧрдорд╛ рдлрд░реНрдХрд╛рдЗрдПрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рд╣реЛред

рд╕реЗрд╡рд╛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕реЗрд╡рд╛ рдирд╛рдо, рдкреЛрд░реНрдЯ, рд░ рдирд┐рд░реНрднрд░рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдпреА рддрддреНрд╡рд╣рд░реВрд▓рд╛рдИ рд╕реНрдХрд╛рд▓рд╛рдорд╛ рдзреЗрд░реИ рддрд░рд┐рдХрд╛рдорд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, HList-s, рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░рд╣рд░реВ)ред рдпрд╕ рдкреЛрд╕реНрдЯрдХреЛ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдХреЗрдХ рдврд╛рдБрдЪрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗрдЫреМрдВ trait'рдУрднред (рдХреЗрдХ рдврд╛рдБрдЪрд╛ рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рд╣реЛрдЗрдиред рдпреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдореНрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛред)

рд╕реЗрд╡рд╛рд╣рд░реВ рдмреАрдЪрдХреЛ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рдкреЛрд░реНрдЯрд╣рд░реВ рдлрд░реНрдХрд╛рдЙрдиреЗ рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ EndPointрдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЛ:

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

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

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

рдХреНрд▓рд╛рдЗрдиреНрдЯ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рд╣рд╛рдореА рдЗрдХреЛ рд╕реЗрд╡рд╛рдорд╛ рдирд┐рд░реНрднрд░рддрд╛ рдШреЛрд╖рдгрд╛ рдЧрд░реНрдЫреМрдВ:

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

рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрдпрд╛рдд рд╕реЗрд╡рд╛ рдЬрд╕реНрддреИ рдПрдХ рдкреНрд░рдХрд╛рд░рдХреЛ рдЫ echoServiceред рд╡рд┐рд╢реЗрд╖ рдЧрд░реА, рдЗрдХреЛ рдХреНрд▓рд╛рдЗрдиреНрдЯрдорд╛ рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХрд▓ рдЪрд╛рд╣рд┐рдиреНрдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рджреБрдИ рд╕реЗрд╡рд╛рд╣рд░реВ рдЬрдбрд╛рди рдЧрд░реНрджрд╛, рд╣рд╛рдореА рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред

рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

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

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

рдЬрд╣рд╛рдБ

  • Config - рдпреЛ рд╕реЗрд╡рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрд░рдХрд╛рд░
  • AddressResolver - рдПрдХ рд░рдирдЯрд╛рдЗрдо рд╡рд╕реНрддреБ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЕрдиреНрдп рдиреЛрдбрд╣рд░реВрдХреЛ рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ (рддрд▓ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН)

рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдмрд╛рдЯ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░рд╣рд░реВ cats:

  • F[_] - рдкреНрд░рднрд╛рд╡рдХреЛ рдкреНрд░рдХрд╛рд░ (рд╕рд░рд▓ рдЕрд╡рд╕реНрдерд╛рдорд╛ F[A] рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░реНрдп рд╣реБрди рд╕рдХреНрдЫ () => Aред рдпрд╕ рдкреЛрд╖реНрдЯрдорд╛ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ cats.IO.)
  • Reader[A,B] - рдХрд╛рд░реНрдп рд╕рдВрдЧ рдЕрдзрд┐рдХ рд╡рд╛ рдХрдо рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА A => B
  • cats.Resource - рдкреНрд░рд╛рдкреНрдд рд░ рдЬрд╛рд░реА рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рд╕реНрд░реЛрдд
  • Timer - рдЯрд╛рдЗрдорд░ (рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХреЗрд╣реА рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрддреНрди рд░ рд╕рдордп рдЕрдиреНрддрд░рд╛рд▓рд╣рд░реВ рдорд╛рдкрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ)
  • ContextShift - рдПрдирд╛рд▓рдЧ ExecutionContext
  • Applicative - рдПрдХ рдкреНрд░рднрд╛рд╡ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рднрд╛рд╡рд╣рд░реВ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ (рд▓рдЧрднрдЧ рдПрдХ рдореЛрдирд╛рдб)ред рдердк рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдорд╛ рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рджреЗрдЦрд┐рдиреНрдЫ Monad/ConcurrentEffect.

рдпреЛ рдкреНрд░рдХрд╛рд░реНрдп рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╣рд╛рдореА рдзреЗрд░реИ рд╕реЗрд╡рд╛рд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдПрдХ рд╕реЗрд╡рд╛ рдЬрд╕рд▓реЗ рдХреЗрд╣рд┐ рдЧрд░реНрджреИрди:

  trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
    type Config <: Any
    def resource(...): ResourceReader[F, Config, Unit] =
      Reader(_ => Resource.pure[F, Unit](()))
  }

(рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдореБрд╣рд╛рди, рдЬрд╕рдорд╛ рдЕрдиреНрдп рд╕реЗрд╡рд╛рд╣рд░реВ рд▓рд╛рдЧреВ рд╣реБрдиреНрдЫрдиреН - рдЗрдХреЛ рд╕реЗрд╡рд╛, рдЗрдХреЛ рдЧреНрд░рд╛рд╣рдХ
╨╕ рдЖрдЬреАрд╡рди рдирд┐рдпрдиреНрддреНрд░рдХрд╣рд░реВ.)

рдиреЛрдб рдПрдХ рд╡рд╕реНрддреБ рд╣реЛ рдЬрд╕рд▓реЗ рдзреЗрд░реИ рд╕реЗрд╡рд╛рд╣рд░реВ рд╕реБрд░реВ рдЧрд░реНрди рд╕рдХреНрдЫ (рдХреЗрдХ рдврд╛рдБрдЪрд╛рджреНрд╡рд╛рд░рд╛ рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдХреЛ рд╕реБрд░реБрд╡рд╛рдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ):

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

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

рд╣реЛрд╕реНрдЯ рдирд╛рдо рд░рд┐рдЬреЛрд▓реНрдпреБрд╕рди

рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди, рд╣рд╛рдореАрд▓рд╛рдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред рдпреЛ рд╕рдореНрднрд╡ рдЫ рдХрд┐ рдареЗрдЧрд╛рдирд╛ рдмрд╛рдБрдХреА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рднрдиреНрджрд╛ рдкрдЫрд┐ рдерд╛рд╣рд╛ рд╣реБрдиреЗрдЫред рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдкреНрд░рдХрд╛рд░реНрдп рдЪрд╛рд╣рд┐рдиреНрдЫ рдЬрд╕рд▓реЗ рдиреЛрдб рдЖрдИрдбреАрд▓рд╛рдИ рдареЗрдЧрд╛рдирд╛рдорд╛ рдирдХреНрд╕рд╛ рдЧрд░реНрдЫ:

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

рдпреЛ рдкреНрд░рдХрд╛рд░реНрдп рд▓рд╛рдЧреВ рдЧрд░реНрди рдзреЗрд░реИ рддрд░рд┐рдХрд╛рд╣рд░реВ рдЫрдиреН:

  1. рдпрджрд┐ рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдЕрдШрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рднрдпреЛ рднрдиреЗ, рд╣рд╛рдореА рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдорд╛рд░реНрдлрдд рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ
    рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдирд┐рд░реНрдорд╛рдг рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред рдпрд╕рд▓реЗ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рд╕рдВрдХрд▓рди рд░ рдЪрд▓рд╛рдЙрдиреЗрдЫред
    рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рд╕реНрдерд┐рд░ рд░реВрдкрдорд╛ рдерд╛рд╣рд╛ рд╣реБрдиреЗрдЫ рд░ рдХреЛрдбрдорд╛ рдореНрдпрд╛рдкрд┐рдЩрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ Map[NodeId, NodeAddress].
  2. рдХреЗрд╣рд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдиреЛрдб рд╕реБрд░реБ рднрдПрдкрдЫрд┐ рдорд╛рддреНрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдареЗрдЧрд╛рдирд╛ рдерд╛рд╣рд╛ рд╣реБрдиреНрдЫред
    рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╣рд╛рдореА "рдбрд┐рд╕реНрдХрд╡рд░реА рд╕реЗрд╡рд╛" рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдЬреБрди рдЕрдиреНрдп рдиреЛрдбрд╣рд░реВ рдЕрдШрд┐ рдЪрд▓реНрдЫ рд░ рд╕рдмреИ рдиреЛрдбрд╣рд░реВ рдпрд╕ рд╕реЗрд╡рд╛рд╕рдБрдЧ рджрд░реНрддрд╛ рд╣реБрдиреЗрдЫрдиреН рд░ рдЕрдиреНрдп рдиреЛрдбрд╣рд░реВрдХреЛ рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдЕрдиреБрд░реЛрдз рдЧрд░реНрдиреЗрдЫрдиреНред
  3. рдпрджрд┐ рд╣рд╛рдореА рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ /etc/hosts, рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрд╕реНрдЯрдирд╛рдорд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдЬрд╕реНрддреИ my-project-main-node ╨╕ echo-backend) рд░ рдХреЗрд╡рд▓ рдпреА рдирд╛рдорд╣рд░реВ рд▓рд┐рдЩреНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН
    рддреИрдирд╛рддреА рдХреЛ рд╕рдордпрдорд╛ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рд╕рдВрдЧред

рдпрд╕ рдкреЛрд╖реНрдЯрдорд╛ рд╣рд╛рдореА рдпреА рдХреЗрд╕рд╣рд░реВрд▓рд╛рдИ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрджреИрдиреМрдВред рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐
рдЦреЗрд▓реМрдирд╛рдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛, рд╕рдмреИ рдиреЛрдбрд╣рд░реВрдорд╛ рд╕рдорд╛рди IP рдареЗрдЧрд╛рдирд╛ рд╣реБрдиреЗрдЫ - 127.0.0.1.

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдХреЛ рд▓рд╛рдЧрд┐ рджреБрдИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдЫреМрдВ:

  1. рд╕рдмреИ рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдЙрдЯреИ рдиреЛрдбрдорд╛ рд░рд╛рдЦреНрджреИред
  2. рд░ рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбрд╣рд░реВрдорд╛ рдЗрдХреЛ рд╕реЗрд╡рд╛ рд░ рдЗрдХреЛ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╣реЛрд╕реНрдЯ рдЧрд░реНрджреИред

рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдПрдЙрдЯрд╛ рдиреЛрдб:

рдПрдХрд▓ рдиреЛрдб рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

object SingleNodeConfig extends EchoConfig[String] 
  with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
  case object Singleton // identifier of the single node 
  // configuration of server
  type NodeId = Singleton.type
  def nodeId = Singleton

  /** Type safe service port specification. */
  override def portNumber: PortNumber = 8088

  // configuration of client

  /** We'll use the service provided by the same host. */
  def echoServiceDependency = echoService

  override def testMessage: UrlPathElement = "hello"

  def pollInterval: FiniteDuration = 1.second

  // lifecycle controller configuration
  def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}

рд╡рд╕реНрддреБрд▓реЗ рдЧреНрд░рд╛рд╣рдХ рд░ рд╕рд░реНрднрд░ рджреБрд╡реИрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рдЯрд╛рдЗрдо-рдЯреБ-рд▓рд╛рдЗрдн рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рддрд╛рдХрд┐ рдЕрдиреНрддрд░рд╛рд▓ рдкрдЫрд┐ lifetime рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрддред (Ctrl-C рд▓реЗ рд╕рдмреИ рд╕реНрд░реЛрддрд╣рд░реВрд▓рд╛рдИ рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ рд░ рдореБрдХреНрдд рдЧрд░реНрдЫред)

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

рджреБрдИ рдиреЛрдб рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

  object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
  {
    type NodeId = NodeIdImpl

    def nodeId = NodeServer

    override def portNumber: PortNumber = 8080
  }

  object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
  {
    // NB! dependency specification
    def echoServiceDependency = NodeServerConfig.echoService

    def pollInterval: FiniteDuration = 1.second

    def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.

    def testMessage: String = "dolly"
  }

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

рджреБрдИ рдкреНрд░рдгрд╛рд▓реА рдиреЛрдбреНрд╕ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдпрд╕ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдкрд░рд┐рд╡рд░реНрддрди рдмрд┐рдирд╛ рд╕рдорд╛рди рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред рдлрд░рдХ рдорд╛рддреНрд░ рдпреЛ рд╣реЛ рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдЕрдм рджреБрдИрд╡рдЯрд╛ рд╡рд╕реНрддреБрд╣рд░реВ рдЫрдиреН рдЬрд╕рд▓реЗ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯрд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫ:

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

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

рдкрд╣рд┐рд▓реЛ рдиреЛрдбрд▓реЗ рд╕рд░реНрднрд░ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫ рд░ рдХреЗрд╡рд▓ рд╕рд░реНрднрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдЪрд╛рд╣рд┐рдиреНрдЫред рджреЛрд╕реНрд░реЛ рдиреЛрдбрд▓реЗ рдЧреНрд░рд╛рд╣рдХрд▓рд╛рдИ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫ рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рдлрд░рдХ рднрд╛рдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рд╕рд╛рдереИ рджреБрдмреИ рдиреЛрдбрд╣рд░реВрд▓рд╛рдИ рдЬреАрд╡рдирднрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЪрд╛рд╣рд┐рдиреНрдЫред рдпреЛ рдмрдиреНрдж рдирднрдПрд╕рдореНрдо рд╕рд░реНрднрд░ рдиреЛрдб рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓рд╕рдореНрдо рдЪрд▓реНрдЫ SIGTERM'om, рд░ рдЧреНрд░рд╛рд╣рдХ рдиреЛрдб рдХреЗрд╣реА рд╕рдордп рдкрдЫрд┐ рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫред рд╕реЗрдореАред рд▓рдиреНрдЪрд░ рдПрдк.

рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛

рдпреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рджреГрд╖реНрдЯрд┐рдХреЛрдгрд▓реЗ рд╕рдордЧреНрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдХрд╕рд░реА рдЕрд╕рд░ рдЧрд░реНрдЫ рд╣реЗрд░реМрдВред

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

рдХреБрдиреИ рдкрдирд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрдирдорд╛ рдкрд░рд┐рдгрдд рд╣реБрдиреНрдЫред рд░ рддреНрдпрд╕реИрд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ
рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгрд╕реНрддрд░ рдЖрд╢реНрд╡рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрднрд░ рдЧрд░рд┐рдиреЗрдЫ:

рдмрдЧ рдЯреНрд░реНрдпрд╛рдХрд░рдорд╛ рдЯрд┐рдХрдЯ -> PR -> рд╕рдореАрдХреНрд╖рд╛ -> рд╕рд╛рдиреНрджрд░реНрднрд┐рдХ рд╢рд╛рдЦрд╛рд╣рд░реВрд╕рдБрдЧ рдорд░реНрдЬ рдЧрд░реНрдиреБрд╣реЛрд╕реН ->
рдПрдХреАрдХрд░рдг -> рддреИрдирд╛рддреА

рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдореБрдЦреНрдп рдирддрд┐рдЬрд╛рд╣рд░реВ рд╣реБрдиреН:

  1. рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдХреЛ рд╕рдмреИ рдиреЛрдбрд╣рд░реВрдорд╛ рдПрдХрд░реВрдк рд╣реБрдиреЗрдЫред рдпрд╕ рддрдереНрдпрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдХрд┐ рд╕рдмреИ рдиреЛрдбрд╣рд░реВрд▓реЗ рдПрдХрд▓ рд╕реНрд░реЛрддрдмрд╛рдЯ рд╕рдорд╛рди рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫред

  2. рдиреЛрдбрд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдорд╛рддреНрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЫред рддреНрдпрд╕реИрд▓реЗ, "рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдмрд╣рд╛рд╡" рд╕рдореНрднрд╡ рдЫреИрдиред

  3. рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рд╕рд╛рдирд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реНрди рдЕрдЭ рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреНрдЫред

  4. рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рдордЧреНрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рднрд╛рдЧрдХреЛ рд░реВрдкрдорд╛ рджреЗрдЦрд╛ рдкрд░реНрдиреЗрдЫ рд░ рд╕рдореАрдХреНрд╖рд╛рдХреЛ рд╡рд┐рд╖рдп рд╣реБрдиреЗрдЫред

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

рд╕рдореНрднрд╛рд╡рд┐рдд рднрд┐рдиреНрдирддрд╛рд╣рд░реВ

рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд▓рд╛рдИ рдХреЗрд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ:

  1. рд▓рдХреНрд╖реНрдп рдореЗрд╕рд┐рдирдорд╛ рдкрд╛рда рдлрд╛рдЗрд▓ред
  2. рдХреЗрдиреНрджреНрд░реАрдХреГрдд рдХреБрдЮреНрдЬреА рдореВрд▓реНрдп рд╕реНрдЯреЛрд░ (etcd/zookeeper).
  3. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдЬреБрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрди: рд╕реБрд░реБ рдирдЧрд░реА рдкреБрди: рдХрдиреНрдлрд┐рдЧрд░ / рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
  4. рдХрд▓рд╛рдХреГрддрд┐ рд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдиреНрддреНрд░рдг рдмрд╛рд╣рд┐рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рднрдгреНрдбрд╛рд░рдгред

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

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

рдПрдХ рдХреЗрдиреНрджреНрд░реАрдХреГрдд рдХреБрдЮреНрдЬреА-рдорд╛рди рд╕реНрдЯреЛрд░ рд╡рд┐рддрд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдореЗрдЯрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╡рд┐рддрд░рдг рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛ рд╕рдВрдпрдиреНрддреНрд░ рд╣реЛред рд╣рд╛рдореАрд▓реЗ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдХреЗ рд╣реБрдиреН рд░ рдХреЗрд╡рд▓ рдбрд╛рдЯрд╛ рдХреЗ рд╣реБрдиреН рднрдиреЗрд░ рдирд┐рд░реНрдгрдп рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдПрдЙрдЯрд╛ рд╕рдорд╛рд░реЛрд╣ рдЧрд░реМрдВ C => A => B, рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ C рд╡рд┐рд░рд▓реИ рдкрд░рд┐рд╡рд░реНрддрди, рд░ рдбрд╛рдЯрд╛ A - рдЕрдХреНрд╕рд░ред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдпреЛ рднрдиреНрди рд╕рдХреНрдЫреМрдВ C - рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ, рд░ A - рдбрд╛рдЯрд╛ред рдпреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдбреЗрдЯрд╛ рднрдиреНрджрд╛ рдлрд░рдХ рдЫрдиреН рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдбреЗрдЯрд╛ рднрдиреНрджрд╛ рдХрдо рдмрд╛рд░рдореНрдмрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫрдиреНред рд╕рд╛рдереИ, рдбреЗрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдПрдХ рд╕реНрд░реЛрдд (рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдмрд╛рдЯ) рдмрд╛рдЯ рдЖрдЙрдБрдЫ, рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЕрд░реНрдХреЛрдмрд╛рдЯ (рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рд╢рд╛рд╕рдХрдмрд╛рдЯ)ред

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

рдпрд╕ рдкреЛрд╕реНрдЯрдХреЛ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рд╕реНрдерд┐рд░ рд░ рдЧрддрд┐рд╢реАрд▓ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдмреАрдЪ рднрд┐рдиреНрдирддрд╛ рдЧрд░реНрдиреЗрдЫреМрдВред рдпрджрд┐ рд╕реЗрд╡рд╛рдХреЛ рддрд░реНрдХрд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рдХреНрд░рдордорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рд╣рд╛рдореА рддреНрдпрд╕реНрддрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрд▓рд╛рдИ рдЧрддрд┐рд╢реАрд▓ рдХрд▓ рдЧрд░реНрдиреЗрдЫреМрдВред рдЕрдиреНрдпрдерд╛ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╕реНрдерд┐рд░ рдЫрдиреН рд░ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЧрддрд┐рд╢реАрд▓ рдкреБрди: рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓рд╛рдИ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдЬрд╕реНрддреИ рдирдпрд╛рдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╕рд╣рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдордХрд╛ рднрд╛рдЧрд╣рд░реВ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди рд╕рдВрдпрдиреНрддреНрд░рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрди рд╕рдХреНрдЫред (рд╣рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╕рдордп рдкреБрди: рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдмрд╛рдЯ рдмрдЪреНрди рд╕рд▓реНрд▓рд╛рд╣ рджрд┐рдЗрдиреНрдЫ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓реЗ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╛рдЙрдБрдЫред рдпрджрд┐ рд╕рдореНрднрд╡ рдЫ рднрдиреЗ, рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдирдХ OS рдХреНрд╖рдорддрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫред)

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

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

рдХрд▓рд╛рдХреГрддрд┐рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдпреЛ рдХрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдХреБрди рдорд╛рдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдХреБрди рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рд╕рдХреНрд╖рдо/рдЕрд╕рдХреНрд╖рдо рдЫрдиреН, рд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдХреБрдиреИ рдкрдирд┐ рдкрд░рд┐рд╡рд░реНрддрдирдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдХреЛ рд╣реЛ рднрдиреЗрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдПрдХ рдХрд▓рд╛рдХреГрддрд┐ рднрд┐рддреНрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдХреЗрд╣рд┐ рдкреНрд░рдпрд╛рд╕ рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдПрдХ рд╕реВрдЪрд┐рдд рдирд┐рд░реНрдгрдп рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдкрдХреНрд╖ рд░ рд╡рд┐рдкрдХреНрд╖

рдо рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рд╡рд┐рдзрд┐рдХреЛ рдлрд╛рдЗрджрд╛ рд░ рдмреЗрдлрд╛рдЗрджрд╛рдорд╛ рдзреНрдпрд╛рди рджрд┐рди рдЪрд╛рд╣рдиреНрдЫреБред

рд▓рд╛рдн

рддрд▓ рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреА рдЫ:

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

рд╣рд╛рдирд┐ рд░ рд╕реАрдорд╛рд╣рд░реВ

рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдЕрдиреНрдп рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рджреГрд╖реНрдЯрд┐рдХреЛрдгрд╣рд░реВ рднрдиреНрджрд╛ рдлрд░рдХ рдЫ рд░ рдХреЗрд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдирд╣реБрди рд╕рдХреНрдЫред рддрд▓ рдХреЗрд╣реА рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН:

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

рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдПрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд╡рд┐рдЪрд╛рд░рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдирднрдПрдХреЛ рд╡рд┐рдЪрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд╕реАрдорд┐рддрддрд╛рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдкрдирд┐ рдзреНрдпрд╛рди рджрд┐рдФрдВ:

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

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

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

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

рд╡рд┐рдЪрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

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

рд╕реНрд╡реАрдХрд╛рд░

рдо рдорд╕реНрдпреМрджрд╛ рд▓реЗрдЦрдХреЛ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЖрдиреНрджреНрд░реЗрдИ рд╕рд╛рдХреНрд╕реЛрдиреЛрдн, рдкрд╛рд╡реЗрд▓ рдкреЛрдкреЛрдн рд░ рдПрдиреНрдЯреЛрди рдиреЗрдЦрд╛рдПрднрд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рдж рджрд┐рди рдЪрд╛рд╣рдиреНрдЫреБред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди