рдХреНрд╡рд┐рдХ рд╕реНрдЯрд╛рд░реНрдЯ: рдЧреЛ + рдЕрдкрд╛рдЪреЗ рдХрд╛рдлреНрдХрд╛ + рд░реЗрдбрд┐рд╕

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



рдЬреЛ рд▓реЛрдЧ рдЗрди рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реЗ рд╕рдордп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдкрд░ рдкрдврд╝реЗрдВред

рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░рдХ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░, рдПрдХ рдирдВрдмрд░ рдкреНрд░реЛрд╕реЗрд╕рд░, рдПрдХ рдХрддрд╛рд░, рд╕реНрддрдВрдн рднрдВрдбрд╛рд░рдг рдФрд░ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред

рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:


рд╕рд┐рд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:



рддрд╕реНрд╡реАрд░ рдореЗрдВ, рдЕрдВрдбрд╛рдХрд╛рд░ рдХрдиреНрд╡реЗрдпрд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ред

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

рдлреИрди-рдЗрди - рдлреИрди-рдЖрдЙрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЧреЛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдХрд╛ рдЕрд░реНрде рд╣реИ рдЧреЛрд░реЛрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХрд╛ рд╕рдорд╛рдирд╛рдВрддрд░рдг, рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдиреАрдЪреЗред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рднреА рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ, рдЪреИрдирд▓ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЧреЛрд░реЛрдиреЗрдЯреНрд╕ рдЬрдЧрд╣ рдкрд░ рдмрдиреЗ рд░рд╣реЗред

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

рдХрд╛рдлреНрдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдкреИрдХреЗрдЬ "github.com/segmentio/kafka-go" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рджреВрд╕рд░реА рдУрд░, Redis, рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд╕реНрддрдВрдн рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рддрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдиреНрдп рд╣реИрдВред рд░реЗрдбрд┐рд╕ рдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рддреЗрдЬ (рдпрд╛ рд╕рдмрд╕реЗ) рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдБрдХрдбрд╝реЛрдВ, рдореАрдЯреНрд░рд┐рдХ, рд╕рдВрджреЗрд╢ рдкреНрд░рд╡рд╛рд╣ рдЖрджрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред
рд░реЗрдбрд┐рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ "github.com/go-redis/redis" рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдЪреВрдБрдХрд┐ рдпрд╣ рд▓реЗрдЦ рдПрдХ рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо DockerHub рд╕реЗ рддреИрдпрд╛рд░ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛрдиреЛрдВ рд╕рд┐рд╕реНрдЯрдореЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ docker-compose.yml рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рд╡реАрдПрдо рдкрд░ рдХрдВрдЯреЗрдирд░ рдореЛрдб рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ 10 рдкрд░ рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬ (рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреЙрдХрд░ рд╡реАрдПрдо рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka:latest ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_CREATE_TOPICS: "Generated:1:1,Solved:1:1,Unsolved:1:1" KAFKA_DELETE_TOPIC_ENABLE: "true" volumes: - /var/run/docker.sock:/var/run/docker.sock redis: image: redis ports: - "6379:6379" 

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ, рдЗрд╕рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 docker-compose up -d 

рддреАрди рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдХрд╛рдлреНрдХрд╛ (рдХрддрд╛рд░), рдЬрд╝реБрдХреАрдкрд░ (рдХрд╛рдлреНрдХрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд░реНрд╡рд░) рдФрд░ (рд░реЗрдбрд┐рд╕)ред

рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

 docker-compose ps 

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Name State Ports -------------------------------------------------------------------------------------- docker-compose_kafka_1 Up 0.0.0.0:9092->9092/tcp docker-compose_redis_1 Up 0.0.0.0:6379->6379/tcp docker-compose_zookeeper_1 Up 0.0.0.0:2181->2181/tcp, 22/tcp, 2888/tcp, 3888/tcp 

Yml-file рдХреЗ рдЕрдиреБрд╕рд╛рд░, рддреАрди рдХрддрд╛рд░реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрдорд╛рдВрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 docker exec kafka-container_kafka_1 /opt/kafka_2.12-2.1.0/bin/kafka-topics.sh --list --zookeeper zookeeper:2181 

рдЗрд╕рдореЗрдВ рдХрддрд╛рд░реЗрдВ (рд╡рд┐рд╖рдп - рдХрд╛рдлреНрдХрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╖рдп) рдЙрддреНрдкрдиреНрди, рд╣рд▓ рдФрд░ рдЕрдирд╕реБрд▓рдЭреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

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

 docker exec kafka-container_kafka_1 /opt/kafka_2.12-2.1.0/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic Generated --from-beginning 

рдЕрдЧрд▓рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ - рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ рдХрддрд╛рд░ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

  var wg sync.WaitGroup c := 0 //counter for { //       15     ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() //      //    -     m, err := r.ReadMessage(ctx) if err != nil { fmt.Println("3") fmt.Println(err) break } wg.Add(1) //       10      goCtx, goCcancel := context.WithTimeout(context.Background(), 10*time.Millisecond) defer goCcancel() //     () go process(goCtx, c, &wg, m) c++ } //     wg.Wait() 

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

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

рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

 func BenchmarkFactorize(b *testing.B) { ch := make(chan []int) var factors []int for i := 1; i < bN; i++ { num := 2345678901234 go factorize(num, ch) factors = <-ch b.Logf("\n%d   %+v\n\n", num, factors) } } 

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

рдЬрд┐рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ DB рдирдВрдмрд░ 1 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрд╕рдВрдмрджреНрдз рд╕рдВрдЦреНрдпрд╛рдПрдБ DB рдирдВрдмрд░ 1 рдореЗрдВ рд╣реИрдВред
рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд░реЗрдбрд┐рд╕ рдореЗрдВ рд╢рд╛рд╕реНрддреНрд░реАрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдирд╣реАрдВ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, DBMS рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ 16 рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпреЗ рдЖрдзрд╛рд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ - 0 рд╕реЗ 15 рддрдХред

рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЧреЛрд░рдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реАрдорд╛ рд╕рдВрджрд░реНрдн рдФрд░ рдЪрдпрди рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдереА:

  //   go factorize(n, outChan) var item data select { case factors = <-outChan: { fmt.Printf("\ngoroutine #%d, input: %d, factors: %+v\n", counter, n, factors) item.Number = n item.Factors = factors err = storeSolved(item) if err != nil { fmt.Println("6") log.Fatal(err) } } case <-ctx.Done(): { fmt.Printf("\ngoroutine #%d, input: %d, exited on context timeout\n", counter, n) err = storeUnsolved(n) if err != nil { fmt.Println("7") log.Fatal(err) } return nil } } 

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

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд░реВрдЯреАрди рд╡рд╛рдВрдЫрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ (0 рдпрд╛ 1) рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдирдХрдореНрдкреЛрдЬреНрдб рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдирдВрдмрд░реЛрдВ рдпрд╛ (рдирдВрдмрд░ - рдирдВрдмрд░) рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо (рд╕рдВрдЦреНрдпрд╛ - рдХрд╛рд░рдХ) рдХреЗ рдЬреЛрдбрд╝реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

 func storeSolved(item data) (err error) { //    0 cmd := redis.NewStringCmd("select", 0) err = client.Process(cmd) b, err := json.Marshal(item.Factors) err = client.Set(strconv.Itoa(item.Number), string(b), 0).Err() return err } 

рдЕрдВрддрд┐рдо рднрд╛рдЧ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдЬрд╕рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдФрд░ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрд╕рдХреЗ рдкрд╛рд╕ рджреЛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╣реЛрдВрдЧреЗ:

  http.HandleFunc("/solved", solvedHandler) http.HandleFunc("/unsolved", unsolvedHandler) 

Redis рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ json рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде http рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 func solvedHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET") w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") //   тДЦ0 -   cmd := redis.NewStringCmd("select", 0) err := client.Process(cmd) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } //      keys := client.Keys("*") var solved []data var item data //          for _, key := range keys.Val() { item.Key = key val, err := client.Get(key).Result() if err != nil { w.WriteHeader(http.StatusInternalServerError) return } item.Val = val solved = append(solved, item) } //    JSON err = json.NewEncoder(w).Encode(solved) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } } 

рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрд░рд┐рдгрд╛рдо: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рд╣рд▓

 [{ "Key": "1604388558816", "Val": "[1,2,3,227]" }, { "Key": "545232916387", "Val": "[1,545232916387]" }, { "Key": "1786301239076", "Val": "[1,2]" }, { "Key": "698495534061", "Val": "[1,3,13,641,165331]" }] 

рдЕрдм рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╡рд┐рд╢реЗрд╖ рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рдерд╛ред

рдореИрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЖрд▓рд╕реА рди рд╣реЛрдВ рдФрд░ рдЕрдкрдиреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред

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


All Articles