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

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

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

(рд░реБрд╕реАрдорд╛)

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

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

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

рдмреЗрдлрд╛рдЗрджрд╛

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

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

рд▓рд╛рдЧреВ рдЙрджрд╛рд╣рд░рдгрдХрд╛ рдХреЗрд╣реА рд╕реАрдорд┐рддрддрд╛рд╣рд░реВ рдЫрдиреН:

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

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

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

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

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

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

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

рдо рдпрд╕ рдкреЛрд╖реНрдЯрдХреЛ рдорд╕реНрдпреМрджрд╛рдорд╛ рдкреНрд░реЗрд░рдгрд╛рджрд╛рдпреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдиреБ рднрдПрдХреЛрдорд╛ Andrey Saksonov, Pavel Popov, Anton Nehaev рд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рдж рднрдиреНрди рдЪрд╛рд╣рдиреНрдЫреБ рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рдпреЛ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдпреЛред

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