
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЗрдВрдЯрд░рдиреЗрдЯ рд╡рд╛рдгрд┐рдЬреНрдп рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣реА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реНрдпрд╛рдкрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХрдХрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рд╕реВрдЪрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИред рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреЗ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрд░реНрдбрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХреАрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдРрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рднреБрдЧрддрд╛рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рд╡рд┐рддрд░рдг, рд▓реЗрдЦрд╛рдВрдХрди рдФрд░ рд╡рдлрд╛рджрд╛рд░реА рд╕реЗрд╡рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЖрджреЗрд╢ рдХрд╛ рднреБрдЧрддрд╛рди, рд░рд┐рдХреЙрд░реНрдб, рдЗрдХрдЯреНрдард╛ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрд░реНрдбрд░ рджреЗрддреЗ рд╕рдордп рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдФрд░ рджрд░реНрджрдирд╛рдХ рд░реВрдк рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреНрд╡рд░рд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рджреЗрд░реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЦреЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдореИрдВ RabbitMQ рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ Node.js рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рд╕рд┐рджреНрдзрд╛рдВрдд
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ RabbitMQ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдХрд╛ рдкрд╣рд▓рд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рдВрд╕реНрдХрд░рдг, AMQP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╣реА 2007 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рдкреВрд░реЗ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреВрдЯреА рд╣реБрдИ рдлреВрд▓рджрд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреАрд╡рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрдВрдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╣реИ рдЬреЛ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХреЛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ RabbitMQ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдмреНрд░реЛрдХрд░ рдХреЗ рддреАрди рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ:
- рд╕рдВрджреЗрд╢ред рдпрд╣ рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдФрд░ рд╣рдорд╛рд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗрд╡рд╛ рдХреЗ рднреАрддрд░ рд╕реВрдЪрдирд╛ рдХреА рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдЗрдХрд╛рдИ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред RabbitMQ рд╕реНрд╡рдпрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмрд╛рдЗрдирд░реА рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдФрд░ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рд╣рдо JSON рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рд░реИрдмрд┐рдЯрдХреНрдпреВ рдореЗрдВ рд╕рдВрджреЗрд╢ рд╣реЗрдбрд░ рд╣реИрдВред рд╡реЗ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
- рд╕рдВрджреЗрд╢ рдХреА рдХрддрд╛рд░ ред рдпрд╣ рд╡рд╣ рдХрддрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ RabbitMQ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рджрд╕реНрдпрддрд╛ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЦрд░рдЧреЛрд╢ рдХрддрд╛рд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдХреЛ рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдПрдХреНрд╕рдЪреЗрдВрдЬред рдпрд╣, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рдирд┐рдордп рдмрд┐рдВрджреБ рд╣реИред рдХрддрд╛рд░ рдпрд╛ рдЕрдиреНрдп рдПрдХреНрд╕рдЪреЗрдВрдЬрд░реНрд╕ рдХреЛ рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рдирд┐рдордп рдмрд┐рдВрджреБ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рдпрд╛ рдХрдИ рдХрддрд╛рд░реЛрдВ, рдпрд╛ рдПрдХ рд╣реА рд╡рд┐рдирд┐рдордп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд░реВрдЯ рдХрд░рдирд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрддрд╛рд░ рдпрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬрд░ рдПрдХ рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзреНрдп рд╣реИред RabMMQ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХреНрд╕рдЪреЗрдВрдЬрд░реНрд╕ рд╣реИрдВ рдЬреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдЗрд╕рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреЛ рд░реВрдЯ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХреНрд╕рдЪреЗрдВрдЬрд░реНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдХреНрдпрд╛ рд╣реИрдВред рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рджреЛрдиреЛрдВ рдХрддрд╛рд░ рд╕реЗ рдПрдХреНрд╕рдЪреЗрдВрдЬрд░ рддрдХ рдФрд░ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╣реА рд╣реЛрддреА рд╣реИред рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдмрд╕ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЛ рдПрдХ рдмрд┐рдВрджреА рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "inform.sendEmail.sendSms"ред рдЙрд╕реА рд╕рдордп, рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг # рдФрд░ * рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рдорд╛рд░реНрдЧ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред * - рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж рдХреЛрдИ рднреА рдмреНрд▓реЙрдХ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди # рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдХреЛрдИ рднреА рдирдВрдмрд░ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "inform.sendSmsред *" рдпрд╛ "рд╕реВрдЪрд┐рдд рдХрд░реЗрдВред #"ред рдЕрдм рдЖрдк рд╡рд┐рдирд┐рдордп рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХреНрд╕рдЪреЗрдВрдЬрд░реНрд╕ рдХреЗ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдлреИрдирдЖрдЙрдЯред рдЗрд╕ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХрд╛ рд░реВрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рд╕рд░рд▓ рд╣реИ; рдпрд╣ рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рднреА рдХрддрд╛рд░реЛрдВ рдпрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬреЛрдВ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред

- рдкреНрд░рддреНрдпрдХреНрд╖ред рдпрд╣ рд╡рд┐рдирд┐рдордп рд╕рдВрджреЗрд╢ рдХреЛ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдХреА рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреА рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред

- рд╡рд┐рд╖рдпред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдФрд░ рд╕рд╛рде рд╣реА рд╕рдВрджреЗрд╢ рд░реВрдЯ рд░реВрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдкреИрдЯрд░реНрди рдПрдХ рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдЖрд░реЗрдЦ рдкрд░ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпреЛрдЬрдирд╛ рдХреЛ рдмреНрд▓реЙрдХреЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдлреЗрдж рдмреНрд▓реЙрдХ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЧреНрд░реЗ рдмреНрд▓реЙрдХ RabbitMQ рддрддреНрд╡реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХрддрд╛рд░реЛрдВ рдФрд░ рдПрдХреНрд╕рдЪреЗрдВрдЬреЛрдВред рд╣рд░рд╛ рд░рдВрдЧ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рддрд░реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдХреНрд░рдо рдореЗрдВ рдЙрдкрдкреНрд░рдХреНрд░рдо рджрд░реНрд╢рд╛рддреА рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, HTTP рдПрдкреАрдЖрдИ рд╕рдВрджреЗрд╢ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдСрд░реНрдбрд░ рдХреЛ рдПрдХ рдирдВрдмрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдСрд░реНрдбрд░ рдХреЛ "рдирдпрд╛" рдХреЗ рд╕рд╛рде рд╕реЗрд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдСрд░реНрдбрд░ рдХреЗ рд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде, рдкреАрдЫреЗред рдХреНрд▓рд╛рдЗрдВрдЯ, рдСрд░реНрдбрд░ рдХреЗ рд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрдХрд░, рд╣рдо рдСрд░реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рдпрд╣ рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд░реНрдордЪрд╛рд░реА рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдСрд░реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ (рдЪрд╛рд╣реЗ рдСрд░реНрдбрд░ рдореЗрдВ рдХреЛрдИ рдИрдореЗрд▓ рдпрд╛ рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдлреЛрди рд╣реЛ, рдЬрд┐рд╕реЗ рдбрд┐рд▓реАрд╡рд░реА рд╡рд┐рдзрд┐ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛) рдХреЛ рдСрд░реНрдбрд░ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдСрд░реНрдбрд░ рдХреА рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдмрджрд▓ рдЧрдИ рд╣реИ рдФрд░ рдПрдХреНрд╕рдЪреЗрдВрдЬрд░ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рд░реНрдЧ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдСрд░реНрдбрд░ рдХреЛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реВрдЪрдирд╛рдУрдВ, рдПрдХреНрд╕рдЪреЗрдВрдЬ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдпрд╛ рдПрдХ рд╕рд╛рде рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдФрд░ рдЖрдЧреЗ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рд╣реА рддрд░реНрдХ рдФрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛рдУрдВ рдкрд░ред
рдПрд╕рдПрдордПрд╕ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рд╢реНрд░рдорд┐рдХ рдФрд░ рд╡рд┐рддрд░рдг рд╕реЗрд╡рд╛рдПрдВ рд╕рдВрджреЗрд╢ рдХреЛ рдХрдИ рдмрд╛рд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреАред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдпрд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рддрд░реНрдХ рдореЗрдВ рд╣реА рдирд┐рд╣рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдиреБрдордд рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрджреЗрд╢ рдХреЛ рдХрддрд╛рд░реЛрдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реНрдЯреЛрд░ рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реНрддрд░ рдкрд░ рд╡рд╛рдкрд╕ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЦрд░рдЧреЛрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореИрдВ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдбреЙрдХрдЯрд░ рдФрд░ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреНрд░реЛрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред
docker run -d --name rabbit -p 5672:5672 -e rabbitmq:3.7.15-management-alpine
рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 15672 рдкрд░ рдЙрдкрд▓рдмреНрдз рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рд╣реИред
рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдПрдордХреНрд▓рд┐рдм рд▓рд╛рдЗрдмреНрд░реЗрд░реА (Node.js рдХреЗ рд▓рд┐рдП RabbitMQ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдСрд░реНрдбрд░ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЦрд░рдЧреЛрд╢ рдХреЛ рднреЗрдЬреЗрдВрдЧреЗред
рдЕрдм рд╣рдореЗрдВ рдХрддрд╛рд░реЛрдВ рдФрд░ рдПрдХреНрд╕рдЪреЗрдВрдЬреЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдЦрд░рдЧреЛрд╢ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред
import { Types, ExchangeTypes } from '../constants'; import { Options } from 'amqplib';
рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░реЗрдЦ рдкрд░ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рдерд╛ред
рдХрддрд╛рд░
export default [
рдХрддрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЯрд┐рдХрд╛рдК ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдХрддрд╛рд░ рд╕рдВрджреЗрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдмреНрд░реЛрдХрд░ рд░рд┐рдмреВрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЦрд░рдЧреЛрд╢ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдбрд┐рд╕реНрдХ рдореЗрдВ рдлреНрд▓рд╢ рдХрд░ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдХреИрд╡рд┐рдПрдЯ рд╣реИред рдмреНрд░реЛрдХрд░ рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдХрддрд╛рд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- messageTtl рд╕рдВрджреЗрд╢ рдЬреАрд╡рди рднрд░ред рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛
- deadLetterExchange ред рдПрдХреНрд╕рдЪреЗрдВрдЬрд░ рдХрд╛ рдирд╛рдо рдЬрд╣рд╛рдВ рд╕рдВрджреЗрд╢ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдХрддрд╛рд░ рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛
- deadLetterRoutingKey ред RoutingKey рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛
рдПрдХреНрд╕рдЪреЗрдВрдЬреЛрдВ
import { ExchangeTypes } from '../constants'; export default [ { name: 'postprocessing', type: ExchangeTypes.TOPIC, }, { name: 'notify', type: ExchangeTypes.TOPIC, }, { name: 'integrates', type: ExchangeTypes.TOPIC, }, ];
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ
import { Types } from '../constants'; export default [ { type: Types.EXCHANGE, destination: 'notify', source: 'postprocessing', routingKey: '#.notify.#', }, { type: Types.EXCHANGE, destination: 'integrates', source: 'postprocessing', routingKey: '#.integrates.#', }, { type: Types.QUEUE, destination: 'generateRoutingKey', source: 'postprocessing', routingKey: 'generateRoutingKey', }, { type: Types.QUEUE, destination: 'sendSms', source: 'notify', routingKey: '#.sendSms.#', }, { type: Types.QUEUE, destination: 'delivery', source: 'integrates', routingKey: '#.delivery.#', }, { type: Types.QUEUE, destination: 'sendSmsHold', source: 'notify', routingKey: 'sendSmsHold', }, { type: Types.QUEUE, destination: 'deliveryHold', source: 'integrates', routingKey: 'deliveryHold', }, ];
рдкреВрд░реНрдг рд╡рд┐рдиреНрдпрд╛рд╕
import { PipelineConfig } from '../interfaces'; import exchanges from './exchanges'; import queues from './queues'; import bindings from './bindigs'; export const pipelineConfig: PipelineConfig = { exchanges, queues, bindings, };
рдЦрд░рдЧреЛрд╢ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВред
import { connect, Connection, Channel } from 'amqplib'; export class RabbitConnect { private _uri: string; private _connection: Connection; private _chanel: Channel; constructor() {
рдЖрдЗрдП, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦреЗрдВ, рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦрд░рдЧреЛрд╢ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред
import { RabbitConnect } from './RabbitConnect'; import { PipelineConfig } from './interfaces'; import { Types } from './constants'; export class Pipeline extends RabbitConnect { private _pipeline: PipelineConfig; constructor(pipelineConfig: PipelineConfig) { super(); this._pipeline = pipelineConfig; } public async create() { try { await this.connect();
рдЕрдм рд╣рдо рд╕рднреА рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдореВрд░реНрдд рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
import { RabbitConnect } from './RabbitConnect'; import { Message, Order, FailOrder } from './interfaces'; import { ConsumeMessage } from 'amqplib'; export interface WorkerParams { maxRetry?: number;
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЦрд░рдЧреЛрд╢ рдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рд╕рдлрд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдХрдиреЗрдХреНрд╢рди рдЪреИрдирд▓ рдореЗрдВ рдПрдХ рдРрдХ рд╡рд┐рдзрд┐ рд╣реИред рдпрджрд┐ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдерд╛, рддреЛ рдПрдХ рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЦрд░рдЧреЛрд╢ рдХреЛ рд╕рдВрджреЗрд╢ рдХреЛ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреА рд╣реИред
рдЕрдм рд╣рдо рдЖрд░реЗрдЦ рд╕реЗ рдХреБрдЫ рд╕рд░рд▓ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ред
import { Worker } from '../Worker'; import { isOrderWithPhone, isOrderWithDeliveryAddress, Order, Message, } from '../interfaces'; import { Keys } from '../constants'; export class GenerateRoutingKey extends Worker<Order> { constructor() { super({ active: 'generateRoutingKey', exchange: 'postprocessing', }); } protected async handler(order: Order) { try { const routingKey: string[] = []; if (isOrderWithPhone(order)) { routingKey.push(Keys.SEND_SMS); } if (isOrderWithDeliveryAddress(order)) { routingKey.push(Keys.SEND_TO_DELIVERY); } const message: Message<Order> = { retry: 0, errors: [], order, }; await this.chanel.publish( this.exchange, routingKey.join('.'), Buffer.from(JSON.stringify(message)), ); await this.ack(); } catch (error) { console.error(error); await this.sendToErrorStorage(error); } } }
рдПрд╕рдПрдордПрд╕ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдордЬрджреВрд░ред
import { Worker } from '../Worker'; import { OrderWithPhone } from '../interfaces'; export class SendSms extends Worker<OrderWithPhone> { constructor() { super({ active: 'sendSms', exchange: 'notify', holdKey: 'sendSmsHold', maxRetry: process.env.MAX_RETRY ? parseInt(process.env.MAX_RETRY) : 5, }); } protected async handler(message: OrderWithPhone) { try { console.log(' sms : ', message.phone); this.ack(); } catch (error) { console.error(error); await this.hold(error); } } }
рд╡рд┐рддрд░рдг рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдПрдХреАрдХрд░рдгред
import { Worker } from '../Worker'; import { OrderWithDeliveryAddress } from '../interfaces'; export class Delivery extends Worker<OrderWithDeliveryAddress> { constructor() { super({ active: 'delivery', exchange: 'interates', holdKey: 'deliveryHold', maxRetry: process.env.MAX_RETRY ? parseInt(process.env.MAX_RETRY) : 5, }); } protected async handler(message: OrderWithDeliveryAddress) { try { console.log(' : ', message.deliveryAddress); this.ack(); } catch (error) { console.error(error); await this.hold(error); } } }
рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБред
import { Pipeline } from './Pipeline'; import { pipelineConfig } from './pipeline'; import { GenerateRoutingKey } from './workers/GenerateRoutingKey'; import { SendSms } from './workers/SendSms'; import { Delivery } from './workers/Delivery'; (async () => { try { const pipeline = new Pipeline(pipelineConfig); const generateRoutingKey = new GenerateRoutingKey(); const sendSms = new SendSms(); const delivery = new Delivery(); await pipeline.create(); await Promise.all([generateRoutingKey.subscribe(), sendSms.subscribe(), delivery.subscribe()]); } catch (error) { console.error(error); process.exit(1); } })();
рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдСрд░реНрдбрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдСрд░реНрдбрд░ рдирдВрдмрд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкреЙрд╕рд░рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдСрд░реНрдбрд░ рдЬрд╕рди рднреЗрдЬрдХрд░ рдЦрд░рдЧреЛрд╢ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдСрдирд▓рд╛рдЗрди рдСрд░реНрдбрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдирд┐рд░реНрдорд╛рдг рдпреЛрдЬрдирд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИред рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдИ рдХрддрд╛рд░реЛрдВ рдФрд░ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдИрдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ 1 рд╕реА рдореЗрдВ рд▓реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рд░реНрдХрд┐рдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд▓реЗрдЦ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред рд╕рднреА рдкреНрд░рд╕реНрддреБрдд рдХреЛрдб рдЬреАрдердм рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ