рдХрд╛рдлреНрдХрд╛рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рд╣рд░реВ рдкреБрди: рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджреИ

рдХрд╛рдлреНрдХрд╛рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рд╣рд░реВ рдкреБрди: рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджреИ

рд╣реЗрд░ Habr.

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

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

рдХрд╛рдлреНрдХрд╛ рдЕрдШрд┐ рдХрд╕реНрддреЛ рдерд┐рдпреЛ

рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓реЗ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд╕рдиреНрджреЗрд╢ рдбреЗрд▓рд┐рднрд░реАрдХреЛ рд▓рд╛рдЧрд┐ IBM MQ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреМрдВред рдпрджрд┐ рд╕реЗрд╡рд╛ рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рдХреНрд░рдордорд╛ рдХреБрдиреИ рддреНрд░реБрдЯрд┐ рднрдпреЛ рднрдиреЗ, рдкреНрд░рд╛рдкреНрдд рд╕рдиреНрджреЗрд╢рд▓рд╛рдИ рдердк рдореНрдпрд╛рдиреБрдЕрд▓ рдкрд╛рд░реНрд╕рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдбреЗрдб-рд▓реЗрдЯрд░-рдХреНрдпреБ (DLQ) рдорд╛ рд░рд╛рдЦреНрди рд╕рдХрд┐рдиреНрдЫред DLQ рдЖрдЧрдорди рд▓рд╛рдордХреЛ рдЫреЗрдЙрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рд╕рдиреНрджреЗрд╢ IBM MQ рднрд┐рддреНрд░ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

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

рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреНрджреИ

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

рдХрд╛рдлреНрдХрд╛рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рд╣рд░реВ рдкреБрди: рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджреИ

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

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

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

spring-kafka рдЖрдлреИрд▓реЗ ContainerAwareErrorHandler рдХреЛ рдзреЗрд░реИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ SeekToCurrentErrorHandler, рдЬрд╕рдХреЛ рд╕рд╛рде рддрдкрд╛рдИрд▓реЗ рд╕рдиреНрджреЗрд╢рд▓рд╛рдИ рдкрдЫрд┐ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХреБрдиреИ рддреНрд░реБрдЯрд┐рдХреЛ рдорд╛рдорд▓рд╛рдорд╛ рдЕрдлрд╕реЗрдЯ рд╕рд┐рдлреНрдЯ рдирдЧрд░реАред Spring-kafka 2.3 рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде рд╕реБрд░реВ рдЧрд░реНрджреИ, BackOffPolicy рд╕реЗрдЯ рдЧрд░реНрди рд╕рдореНрднрд╡ рднрдпреЛред

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

рдЕрдиреНрддрд┐рдо рдирд┐рд░реНрдгрдп

SeekToCurrentErrorHandler рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреБрди: рдкрдард╛рдЙрдиреЗ рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рд╕рдВрдпрдиреНрддреНрд░ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди рдкреНрд░реЗрд░рд┐рдд рдЧрд░реНтАНрдпреЛред

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

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

рд░реИрдЦрд┐рдХ рддрд░реНрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрднреЛрдХреНрддрд╛рд▓рд╛рдИ рд░реЛрдХреНрджреИ

рд╡рд╕рдиреНрдд-рдХрд╛рдлреНрдХрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛, рдЙрдкрднреЛрдХреНрддрд╛рд▓рд╛рдИ рд░реЛрдХреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

public void pauseListenerContainer(MessageListenerContainer listenerContainer, 
                                   Instant retryAt) {
        if (nonNull(retryAt) && listenerContainer.isRunning()) {
            listenerContainer.stop();
            taskScheduler.schedule(() -> listenerContainer.start(), retryAt);
            return;
        }
        // to DLQ
    }

рдЙрджрд╛рд╣рд░рдгрдорд╛, retryAt рдпреЛ рдЕрдЭреИ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ рднрдиреЗ MessageListenerContainer рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛред рдкреБрди: рдкреНрд░рдХреНрд╖реЗрдкрдг рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреБрд▓рд░рдорд╛ рд╕реБрд░реБ рдЧрд░рд┐рдПрдХреЛ рдЫреБрдЯреНрдЯреИ рдереНрд░реЗрдбрдорд╛ рд╣реБрдиреЗрдЫ, рдЬрд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрдирд┐ рд╡рд╕рдиреНрддрджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдПрдХреЛ рдЫред

рд╣рд╛рдореА рдирд┐рдореНрди рддрд░рд┐рдХрд╛рдорд╛ retryAt рдорд╛рди рдлреЗрд▓рд╛ рдкрд╛рд░реНрдЫреМрдВ:

  1. рдкреБрди: рдХрд▓ рдХрд╛рдЙрдиреНрдЯрд░рдХреЛ рдореВрд▓реНрдп рд╣реЗрд░рд┐рдПрдХреЛ рдЫред
  2. рдХрд╛рдЙрдиреНрдЯрд░ рдорд╛рдирдХреЛ рдЖрдзрд╛рд░рдорд╛, рдкреБрди: рдкреНрд░рдпрд╛рд╕ рд░рдгрдиреАрддрд┐рдорд╛ рд╣рд╛рд▓рдХреЛ рдврд┐рд▓рд╛рдЗ рдЕрдиреНрддрд░рд╛рд▓ рдЦреЛрдЬрд┐рдПрдХреЛ рдЫред рд░рдгрдиреАрддрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдиреИ рдШреЛрд╖рдгрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ; рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди JSON рдврд╛рдБрдЪрд╛ рд░реЛрдЬреНрдпреМрдВред
  3. JSON array рдорд╛ рдкрд╛рдЗрдиреЗ рдЕрдиреНрддрд░рд╛рд▓рд▓реЗ рд╕реЗрдХреЗрдиреНрдбрдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдЬреБрди рдкрдЫрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдиреБ рдкрд░реНрдЫред рд╕реЗрдХреЗрдиреНрдб рдХреЛ рдпреЛ рд╕рдВрдЦреНрдпрд╛ retryAt рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рди рдмрдирд╛рдЙрди рд╡рд░реНрддрдорд╛рди рд╕рдордпрдорд╛ рдердкрд┐рдПрдХреЛ рдЫред
  4. рдпрджрд┐ рдЕрдиреНрддрд░рд╛рд▓ рдлреЗрд▓рд╛ рдкрд░реЗрди рднрдиреЗ, retryAt рдХреЛ рдорд╛рди рд╢реВрдиреНрдп рдЫ рд░ рд╕рдиреНрджреЗрд╢ рдореНрдпрд╛рдиреБрдЕрд▓ рдкрд╛рд░реНрд╕рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ DLQ рдорд╛ рдкрдард╛рдЗрдиреЗрдЫред

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

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

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

рдЧреИрд░-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рддрд░реНрдХрдХреЛ рд╕рд╛рде рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдмрд╛рдЯ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ

RETRY_AT рд╕рдордп рдкреБрдЧреЗрдкрдЫрд┐ DESTINATION рд╢реАрд░реНрд╖рдХрдорд╛ рдкреБрди: рдкрдард╛рдЙрдиреЗ рдПрдЙрдЯрд╛ рдпрд╕реНрддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ (Retryer) рдорд╛ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдиреЗ рдХреЛрдбрдХреЛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдЫ:


public <K, V> void retry(ConsumerRecord<K, V> record, String retryToTopic, 
                         Instant retryAt, String counter, String groupId, Exception e) {
        Headers headers = ofNullable(record.headers()).orElse(new RecordHeaders());
        List<Header> arrayOfHeaders = 
            new ArrayList<>(Arrays.asList(headers.toArray()));
        updateHeader(arrayOfHeaders, GROUP_ID, groupId::getBytes);
        updateHeader(arrayOfHeaders, DESTINATION, retryToTopic::getBytes);
        updateHeader(arrayOfHeaders, ORIGINAL_PARTITION, 
                     () -> Integer.toString(record.partition()).getBytes());
        if (nonNull(retryAt)) {
            updateHeader(arrayOfHeaders, COUNTER, counter::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "retry"::getBytes);
            updateHeader(arrayOfHeaders, RETRY_AT, retryAt.toString()::getBytes);
        } else {
            updateHeader(arrayOfHeaders, REASON, 
                         ExceptionUtils.getStackTrace(e)::getBytes);
            updateHeader(arrayOfHeaders, SEND_TO, "backout"::getBytes);
        }
        ProducerRecord<K, V> messageToSend =
            new ProducerRecord<>(retryTopic, null, null, record.key(), record.value(), arrayOfHeaders);
        kafkaTemplate.send(messageToSend);
    }

рдЙрджрд╛рд╣рд░рдгрд▓реЗ рджреЗрдЦрд╛рдЙрдБрдЫ рдХрд┐ рдзреЗрд░реИ рдЬрд╛рдирдХрд╛рд░реА рд╣реЗрдбрд░рд╣рд░реВрдорд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реБрдиреНрдЫред RETRY_AT рдХреЛ рдорд╛рди рдЙрдкрднреЛрдХреНрддрд╛ рд╕реНрдЯрдк рдорд╛рд░реНрдлрдд рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдореЗрдХрд╛рдирд┐рдЬрдордХреЛ рд▓рд╛рдЧрд┐ рдЬрд╕реНрддреИ рдлреЗрд▓рд╛ рдкрд░реНрджрдЫред DESTINATION рд░ RETRY_AT рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рд╛рдореА рдкрд╛рд╕ рдЧрд░реНрдЫреМрдВ:

  • GROUP_ID, рдЬрд╕рджреНрд╡рд╛рд░рд╛ рд╣рд╛рдореА рдореНрдпрд╛рдиреБрдЕрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд░ рд╕рд░рд▓реАрдХреГрдд рдЦреЛрдЬрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рд╕рдореВрд╣рдмрджреНрдз рдЧрд░реНрдЫреМрдВред
  • ORIGINAL_PARTITION рдкреБрди: рдкреНрд░рд╢реЛрдзрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЙрд╣реА рдЙрдкрднреЛрдХреНрддрд╛ рд░рд╛рдЦреНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиред рдпреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╢реВрдиреНрдп рд╣реБрди рд╕рдХреНрдЫ, рдЬрд╕рдорд╛ рдирдпрд╛рдБ рд╡рд┐рднрд╛рдЬрди рдореВрд▓ рд╕рдиреНрджреЗрд╢рдХреЛ record.key() рдХреБрдЮреНрдЬреА рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░рд┐рдиреЗрдЫред
  • рдкреБрди: рдкреНрд░рдпрд╛рд╕ рд░рдгрдиреАрддрд┐ рдкрдЫреНрдпрд╛рдЙрди COUNTER рдорд╛рди рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░рд┐рдпреЛред
  • SEND_TO рднрдиреЗрдХреЛ рд╕рдиреНрджреЗрд╢ RETRY_AT рдкреБрдЧреЗрдкрдЫрд┐ рдкреБрди: рдкреНрд░рд╢реЛрдзрдирдХрд╛ рд▓рд╛рдЧрд┐ рдкрдард╛рдЗрдпреЛ рд╡рд╛ DLQ рдорд╛ рд░рд╛рдЦрд┐рдПрдХреЛ рд╣реЛ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрдиреЗ рд╕реНрдерд┐рд░ рд╣реЛред
  • REASON - рд╕рдиреНрджреЗрд╢ рдкреНрд░рд╢реЛрдзрди рдЕрд╡рд░реБрджреНрдз рднрдПрдХреЛ рдХрд╛рд░рдгред

рдкреБрди: рдкреНрд░рдпрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ PostgreSQL рдорд╛ рдкреБрди: рдкрдард╛рдЙрдиреЗ рд░ рдореНрдпрд╛рдиреБрдЕрд▓ рдкрд╛рд░реНрд╕рд┐рдЩрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рднрдгреНрдбрд╛рд░ рдЧрд░реНрджрдЫред рдЯрд╛рдЗрдорд░рд▓реЗ рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдп рд╕реБрд░реБ рдЧрд░реНрдЫ рдЬрд╕рд▓реЗ RETRY_AT рд╕рдБрдЧ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдХреБрдЮреНрдЬреА record.key() рдХреЛ рд╕рд╛рде DESTINATION рд╡рд┐рд╖рдпрдХреЛ ORIGINAL_PARTITION рд╡рд┐рднрд╛рдЬрдирдорд╛ рдлрд┐рд░реНрддрд╛ рдкрдард╛рдЙрдБрдЫред

рдПрдХ рдкрдЯрдХ рдкрдард╛рдЗрдПрдкрдЫрд┐, рд╕рдиреНрджреЗрд╢рд╣рд░реВ PostgreSQL рдмрд╛рдЯ рдореЗрдЯрд╛рдЗрдиреНрдЫред рд╕рдиреНрджреЗрд╢рд╣рд░реВрдХреЛ рдореНрдпрд╛рдиреБрдЕрд▓ рдкрд╛рд░реНрд╕рд┐рдЩ рдПрдХ рд╕рд╛рдзрд╛рд░рдг UI рдорд╛ рд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ REST API рдорд╛рд░реНрдлрдд Retryer рд╕рдБрдЧ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ рдЧрд░реНрдЫред рдпрд╕рдХреЛ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ DLQ рдмрд╛рдЯ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкреБрди: рдкрдард╛рдЙрдиреЗ рд╡рд╛ рдореЗрдЯрд╛рдЙрдиреЗ, рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рд╣реЗрд░реНрдиреЗ рд░ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдЦреЛрдЬреНрдиреЗ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рддреНрд░реБрдЯрд┐ рдирд╛рдорджреНрд╡рд╛рд░рд╛ред

рд╣рд╛рдореНрд░реЛ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рдирд┐рдпрдиреНрддреНрд░рдг рд╕рдХреНрд╖рдо рдЧрд░рд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рдкреБрди: рдкреНрд░рдпрд╛рд╕рдХрд░реНрддрд╛рд▓реЗ рд╕реБрдирд┐рд░рд╣реЗрдХреЛ рд╡рд┐рд╖рдпрдорд╛ рдкрд╣реБрдБрдЪрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрд░реЛрдз рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдкреБрди: рдкреНрд░рдпрд╛рд╕рдХрд░реНрддрд╛рд▓рд╛рдИ DESTINATION рд╢реАрд░реНрд╖рдХрдорд╛ рд▓реЗрдЦреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреБрд╣реЛрд╕реНред рдпреЛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ, рддрд░, рдЕрдиреНрддрд░рд╛рд▓ рд╡рд┐рд╖рдп рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рд╡рд┐рдкрд░реАрдд, рд╣рд╛рдореАрд╕рдБрдЧ рдпрд╕рд▓рд╛рдИ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреВрд░реНрдг DLQ рд░ UI рдЫред

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

рдХрд╛рдлреНрдХрд╛рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рд╣рд░реВ рдкреБрди: рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджреИ

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

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

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

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

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

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