рдореЛрд▓реЗрдХреНрдпреВрд▓рд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд╡рд░реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдЬрд╛рдиреЗрдВ

рд╣% рд╣рдмрдирд╕%!

рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдореЛрд▓реЗрдХреНрдпреВрд▓рд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд╡рд░реНрдХ рд╕реЗрд╡рд╛ред



рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдпрд╣ рд░реВрдкрд░реЗрдЦрд╛ Node.js рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдпрд╣ рдЬрд╛рд╡рд╛, рдЧреЛ, рдкрд╛рдпрдерди рдФрд░ .NET рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ рджрд┐рдЦрд╛рдИ рджреА рдФрд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ ред рд╣рдо рд▓рдЧрднрдЧ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдХрдИ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрди рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рд╕реАрдиреЗрдХрд╛ рдФрд░ рд╣рдорд╛рд░реА рдмрд╛рдЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╣ рд╣рдореЗрдВ рдХрд┐рддрдирд╛ рдзрдиреНрдп рд▓рдЧрддрд╛ рдерд╛ред рд╣рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд╛рд╣рд┐рдП: рдореЗрдЯреНрд░рд┐рдХреНрд╕, рдХреИрд╢рд┐рдВрдЧ, рдмреИрд▓реЗрдВрд╕рд┐рдВрдЧ, рдлреЙрд▓реНрдЯ-рдЯреЙрд▓рд░реЗрдВрд╕, рд╕реЗрд▓реЗрдХреНрдЯ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ, рдкреИрд░рд╛рдореАрдЯрд░ рд╡реЗрд░рд┐рдлрд┐рдХреЗрд╢рди, рд▓реЙрдЧрд┐рдВрдЧ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдПрдБ, рдХрдИ рддрд░рд╣ рдХреЗ рдЪреМрд░рд╛рд╣реЛрдВ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди, рдорд┐рдХреНрд╕рд┐рдиреНрд╕ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдФрд░ рдЕрдм рдХреНрд░рдо рдореЗрдВред

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


рдлреНрд░реЗрдорд╡рд░реНрдХ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рддреАрди рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдиреАрдЪреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВрдЧреЗ)ред

рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯрд░


рдЙрдирдХреЗ рдмреАрдЪ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рд╕рдВрдЪрд╛рд░ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдПрдХ рдмрдбрд╝реА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рдмреЙрдХреНрд╕ рд╕реЗ 7 рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: рдЯреАрд╕реАрдкреА, рд░реЗрдбрд┐рд╕, рдПрдПрдордХреНрдпреВрдкреА, рдПрдордХреНрдпреВрдЯреАрдЯреА, рдПрдирдПрдЯреАрдПрд╕, рдПрдирдПрдЯреАрдПрд╕ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ, рдХрд╛рдлреНрдХрд╛ред рдпрд╣рд╛рдБ рдЖрдк рдЕрдзрд┐рдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо Redis рдкрд░рд┐рд╡рд╣рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░рд╛рдЬреНрдп рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдЯреАрд╕реАрдкреА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред

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

// ./moleculer.config.js module.exports = { transporter: 'redis://:pa$$w0rd@127.0.0.1:6379', // ...   } 

рдбреЗрдЯрд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрд╡рд░реЛ, MsgPack, Notepack, ProtoBuf, Thrift, рдЖрджрд┐ред

рд╕реЗрд╡рд╛


рд╡рд╣ рд╡рд░реНрдЧ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реЗрд╡рд╛ рд╣реИ, рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 // ./services/telemetry/telemetry.service.js const { Service } = require('moleculer'); module.exports = class TelemetryService extends Service { constructor(broker) { super(broker); this.parseServiceSchema({ name: 'telemetry', }); } }; 


рд╕реЗрд╡рд╛ рджрд▓рд╛рд▓


рдврд╛рдБрдЪреЗ рдХрд╛ рдореВрд▓ред



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

рдмреНрд░реЛрдХрд░ рд╣реЛрдиреЗ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рдорд┐рд▓рддреА рд╣реИред рдЕрдм рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣рдЯрдирд╛ рд╣реЛрдЧрд╛ред рдврд╛рдВрдЪреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдиреЛрдб рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рд╣реИред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдиреЛрдб рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ (рдЬреЛ рдХрд┐, рдЬрдм рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ "рдиреЛрдб index.js" рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП)ред рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ microservices рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ ServiceBroker рд╣реИред рдЬреА рд╣рд╛рдВ, рдЖрдкрдиреЗ рд╕рд╣реА рд╕реБрдирд╛ред рд╣рдо рдЕрдкрдиреА рд╕реЗрд╡рд╛ рд╕реНрдЯреИрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдкрдиреА рджрд┐рд▓ рдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреНрдпреЛрдВ рд╣реИ? рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдиреЛрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреНрдпреЗрдХ), рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реЙрдЯреНрд░реЗрд▓реЛрдб рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдЙрддреНрдкрд╛рджрди рдореЗрдВ - рд╕реЗрд╡рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдиреЛрдбред рдЦреИрд░, рдпрд╛ рдПрдХ рдорд┐рд╢реНрд░рдг, рдЬрдм рдПрдХ рдиреЛрдб рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рджреВрд╕рд░реЗ рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИ, рдмрд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдпрд╣ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдпрд╣ рд╣рдорд╛рд░реЗ index.js рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
 const { resolve } = require('path'); const { ServiceBroker } = require('moleculer'); const config = require('./moleculer.config.js'); const { SERVICES, NODE_ENV, } = process.env; const broker = new ServiceBroker(config); broker.loadServices( resolve(__dirname, 'services'), SERVICES ? `*/@(${SERVICES.split(',').map(i => i.trim()).join('|')}).service.js` : '*/*.service.js', ); broker.start().then(() => { if (NODE_ENV === 'development') { broker.repl(); } }); 


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

рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд╣рднрд╛рдЧрд┐рддрд╛


рдЗрд╕реЗ рддреАрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдХреЙрд▓


рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (рдпрд╛ рддреНрд░реБрдЯрд┐) рдкреНрд░рд╛рдкреНрдд рдХреАред

 //   "report",     "csv". async getCsvReport({ jobId }) { const rows = []; // ... return this.broker.call('csv.stringify', { rows }); } 

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЙрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрддреБрд▓рд┐рдд рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрд╡рд╛ рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдврд╛рдВрдЪрд╛ рд╣реА рд╕рдВрддреБрд▓рди рдХрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред



рдлреЗрдВрдХрдирд╛


рдЬрдм рд╣рдо рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

 //   "user"    . async registerUser({ email, password }) { // ... this.broker.emit('user_registered', { email }); return true; } 

рдЕрдиреНрдп рд╕реЗрд╡рд╛рдПрдВ рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреА рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рддреАрд╕рд░рд╛ рддрд░реНрдХ, рдЖрдк рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрд╡рд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗрдЧрд╛, рдЕрд░реНрдерд╛рддред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 10 "рдореЗрд▓" рдФрд░ 5 "рд╕рджрд╕реНрдпрддрд╛" рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ 2 рдкреНрд░рддрд┐рдпрд╛рдВ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреА - рдПрдХ "рдореЗрд▓" рдФрд░ рдПрдХ "рд╕рджрд╕реНрдпрддрд╛"ред рдпреЛрдЬрдирд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ:



рдкреНрд░рд╕рд╛рд░рдг


рдЙрддреНрд╕рд░реНрдЬрди рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдмрд┐рдирд╛ред рд╕рднреА 10 рдореЗрд▓ рдФрд░ 5 рд╕рджрд╕реНрдпрддрд╛ рд╕реЗрд╡рд╛рдПрдВ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреАред

рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рддреНрдпрд╛рдкрди


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

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

рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
 module.exports = class JobService extends Service { constructor(broker) { super(broker); this.parseServiceSchema({ name: 'job', actions: { update: { params: { id: { type: 'number', convert: true }, name: { type: 'string', empty: false, optional: true }, data: { type: 'object', optional: true }, }, async handler(ctx) { return this.update(ctx.params); }, }, }, }); } async update({ id, name, data }) { // ... } } 


hagfish


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рд╕реЗ рд╕реЗрд╡рд╛ рдореЗрдВ рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдмрдЪреЗрдВред

рд░реЗрдбрд┐рд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдорд┐рдХреНрд╕рд┐рди
 const Redis = require('ioredis'); module.exports = ({ key = 'redis', options } = {}) => ({ settings: { [key]: options, }, created() { this[key] = new Redis(this.settings[key]); }, async started() { await this[key].connect(); }, stopped() { this[key].disconnect(); }, }); 


рд╕реЗрд╡рд╛ рдореЗрдВ рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
 const { Service, Errors } = require('moleculer'); const redis = require('../../mixins/redis'); const server = require('../../mixins/server'); const router = require('./router'); const { REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, } = process.env; const redisOpts = { host: REDIS_HOST, port: REDIS_PORT, password: REDIS_PASSWORD, lazyConnect: true, }; module.exports = class AuthService extends Service { constructor(broker) { super(broker); this.parseServiceSchema({ name: 'auth', mixins: [redis({ options: redisOpts }), server({ router })], }); } } 


рдХреИрд╢рд┐рдВрдЧ


рдПрд▓рдЖрд░рдпреВ, рдореЗрдореЛрд░реА, рд░реЗрдбрд┐рд╕: рдореЗрдердб рдХреЙрд▓ (рдХреНрд░рд┐рдпрд╛) рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рдХреЙрд▓ рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╢рд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде TTLред

рдХреИрд╢реНрдб рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛ рдЙрджрд╛рд╣рд░рдг
 module.exports = class InventoryService extends Service { constructor(broker) { super(broker); this.parseServiceSchema({ name: 'inventory', actions: { getInventory: { params: { steamId: { type: 'string', pattern: /^76\d{15}$/ }, appId: { type: 'number', integer: true }, contextId: { type: 'number', integer: true }, }, cache: { keys: ['steamId', 'appId', 'contextId'], ttl: 15, }, async handler(ctx) { return true; }, }, }, }); } // ... } 


рдХреИрд╢рд┐рдВрдЧ рд╡рд┐рдзрд┐ ServiceBroker рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИред

рд▓реЙрдЧрд┐рдВрдЧ


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

рдореИрдЯреНрд░рд┐рдХреНрд╕


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

рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕- рдХрд┐рдмрдирд╛ рдмрдВрдбрд▓ рдХреЗ рд▓рд┐рдП рд▓реЛрдЪрджрд╛рд░- рдПрдкрдо -рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЙрджрд╛рд╣рд░рдг рдЧрд┐рдердм рдореЗрдВ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХрдВрд╕реЛрд▓ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛


рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд░реНрдХрд┐рдЯ-рдмреНрд░реЗрдХрд░ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд░реНрд╡рд┐рд╕рдмреНрд░реЛрдХрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╕реЗрд╡рд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЗрди рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрд╕реНрд╡рд╛рд╕реНрдереНрдпрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реЛрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред

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

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


рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреА рд╢реБрд░реВрдЖрдд рддрд╛рдЬреА рд╣рд╡рд╛ рдХреА рд╕рд╛рдВрд╕ рдмрди рдЧрдИ, рдЬрд┐рд╕рдиреЗ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдмрдВрдЯ рдХреЛ рдмрдЪрд╛рдпрд╛ (рдЗрд╕ рддрдереНрдп рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдПрдХ рдмрдбрд╝реА рдмрдВрдЯ рд╣реИ) рдФрд░ рд╕рд╛рдЗрдХрд┐рд▓рд┐рдВрдЧ, рдиреЗ рдЕрдЧрд▓реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдХреЛ рд╕рд░рд▓ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд▓рд┐рдЦрд╛ред рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд░рд▓ рдФрд░ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рд╣реИ, рдФрд░ рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдпрд╛ рджреЛ рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рдкрд╣рд▓реА рд╕реЗрд╡рд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЖрдкрдХреА рдЕрдЧрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдк рдЗрд╕ рдЪрдорддреНрдХрд╛рд░ рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдХрд┐рдпрд╛ (рдФрд░ рдЕрднреА рддрдХ рдЗрд╕реЗ рдкрдЫрддрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ)ред рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛!

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдЗрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо - @moleculerchat рдореЗрдВ рдЪреИрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ

Source: https://habr.com/ru/post/hi439810/


All Articles