рдЬрдм рдореИрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрд░рдкреАрд╕реА рдЧреНрд░рд╛рд╣рдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ рдордЬрд╛рдХ рдпрд╛рдж рдЖрддрд╛ рд╣реИ:
рджрд░рдмрд╛рд░ред
"рдкреНрд░рддрд┐рд╡рд╛рджреА, рдЖрдкрдиреЗ рдПрдХ рдорд╣рд┐рд▓рд╛ рдХреЛ рдХреНрдпреЛрдВ рдорд╛рд░рд╛?"
- рдореИрдВ рдмрд╕ рдореЗрдВ рд╣реВрдВ, рдХрдВрдбрдХреНрдЯрд░ рдиреЗ рдорд╣рд┐рд▓рд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛, рдЯрд┐рдХрдЯ рдЦрд░реАрджрдиреЗ рдХреА рдорд╛рдВрдЧ рдХреАред рдорд╣рд┐рд▓рд╛ рдиреЗ рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдирд┐рдХрд╛рд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЙрд╕рдореЗрдВ рдЕрдкрдирд╛ рдкрд░реНрд╕ рд░рдЦрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдиреЗ рдкрд░реНрд╕ рдХреЛ рдЦреЛрд▓рд╛, рдЕрдкрдиреЗ рдкрд░реНрд╕ рдХреЛ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рд▓рд┐рдпрд╛, рдЕрдкрдиреЗ рдкрд░реНрд╕ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛ рдФрд░ рд╡рд╣рд╛рдВ рдЕрдкрдирд╛ рдкрд░реНрд╕ рд░рдЦрд╛ред , рдЙрд╕рдХрд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдЙрд╕рдХрд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рд╡рд╣реАрдВ рд░рдЦ рджрд┐рдпрд╛ред
- рдФрд░ рдХреНрдпрд╛?
- рдХрдВрдЯреНрд░реЛрд▓рд░ рдиреЗ рдЙрд╕реЗ рдЯрд┐рдХрдЯ рджрд┐рдпрд╛ред рдПрдХ рдорд╣рд┐рд▓рд╛ рдиреЗ рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдирд┐рдХрд╛рд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рд╡рд╣рд╛рдВ рд░рдЦрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рд╡рд╣рд╛рдВ рдЕрдкрдирд╛ рдЯрд┐рдХрдЯ рд░рдЦрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдирд┐рдХрд╛рд▓рд╛, рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛ред , рдкрд░реНрд╕ рд╡рд╣рд╛рдБ рд░рдЦрд╛, рдкрд░реНрд╕ рдмрдВрдж рдХрд┐рдпрд╛, рдкрд░реНрд╕ рдЦреЛрд▓рд╛, рдкрд░реНрд╕ рд╡рд╣рд╛рдБ рд░рдЦрд╛, рдкрд░реНрд╕ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред
"рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ," рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдЖрд╡рд╛рдЬ рдЖрдИред рдорд╣рд┐рд▓рд╛ рдиреЗ ... рдЕрдкрдирд╛ рдкрд░реНрд╕ рдЦреЛрд▓рд╛ ...
"рд╣рд╛рдБ, рдпрд╣ рдЙрд╕реЗ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ," рдЕрднрд┐рдпреЛрдЬрдХ рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред
"рддреЛ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред"
┬й рдПрд╕ред рдЕрд▓реНрдЯреЛрд╡

рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рдд рд╣реЛрддреА рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рдордмрджреНрдз рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрддреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдУрдПрд╕ рд╕реНрддрд░ рдкрд░ рд╕реЙрдХреЗрдЯ рдмрдлрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛;
рдпрд╣ рдПрдХ рдХрдард┐рди рдСрдкрд░реЗрд╢рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рднрд▓реЗ рд╣реА рдпрд╣ "рдЖрд╕рд╛рди" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ); - рдЬрдм рдпрд╣ рдУрдПрд╕ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдкреИрдХреЗрдЯ рдмрдирддрд╛ рд╣реИ (рдЕрдиреБрд░реЛрдз рдлрд┐рд░ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреИрдХреЗрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рдмрдлрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж);
- (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ, рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ рдХрдИ рдмрд╛рд░ рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдмрдлрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ);
- рдЕрдВрдд рдореЗрдВ, рдкреИрдХреЗрдЯ рдЧрдВрддрд╡реНрдп рд╣реЛрд╕реНрдЯ рдкрд░ рдЖрддрд╛ рд╣реИ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдкрд░ рдмрдлрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ;
- рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рд╕реВрдЪрдирд╛ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреИрдХреЗрдЯ рдХреЛ рдЙрд╕рдХреЗ рдмрдлрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рддреИрдпрд╛рд░ рдзреНрд╡рдЬ рдХреЛ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ;
- (рдЖрдкрдХреЛ рдЬрд╡рд╛рдм рдореЗрдВ ACK рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП);
- рдХреБрдЫ рд╕рдордп рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рддреИрдпрд╛рд░ рд╣реИ (рдПрдкреЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдФрд░ рдХрд┐рд╕реА рджрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдлрд░ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ;
- рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдЕрдкрдиреЗ рд░рдЦрд░рдЦрд╛рд╡ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╕рдордп рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрд╕реА рд╕рдордп рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦрд░реНрдЪ рдХрд░рддреА рд╣реИред
рдореЗрд▓реНрдЯрдбрд╛рдЙрди / рд╕реНрдкреЗрдХреНрдЯрд░ рдХреЗ рдмрд╛рдж рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдкреИрдЪ рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рд▓рд╛рдЧрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдХреАред рдЬрдирд╡рд░реА 2018 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рд░реЗрдбрд┐рд╕ рдХреНрд▓рд╕реНрдЯрд░ рдиреЗ рдЕрдЪрд╛рдирдХ рдбреЗрдврд╝ рд╕реЗ рджреЛ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдореЗрдЬрд╝реЕрди рдиреЗ рдЗрди рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд┐рдП рд╣реИрдВред (рд╕рдЪ рд╣реИ, рдЕрдореЗрдЬрд╝реЕрди рдиреЗ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдкреИрдЪ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдФрд░ рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рд▓рдЧрднрдЧ рдкрд┐рдЫрд▓реЗ рд╕реНрддрд░ рддрдХ рдЧрд┐рд░ рдЧрдИред рд▓реЗрдХрд┐рди рдХрдиреЗрдХреНрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреИрджрд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИред)
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд░реЗрдбрд┐рд╕ рдФрд░ рдореЗрдореНрдХреЗрдб рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЧреЛ рдХрдиреЗрдХреНрдЯрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рдХрдиреЗрдХреНрдЯрд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдкреВрд▓ рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред (рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреБрдЦрдж рд╣реИ рдХрд┐ рдореЗрдореЗрдХреИрдб рдХреЛ рдХрдиреЗрдХреНрдЯрд░ рдХреЛ рдмреНрд░реИрдб рдлрд┐рдЯреНрдЬрдкреИрдЯреНрд░рд┐рдХ рдиреЗ рдЦреБрдж рд▓рд┐рдЦрд╛ рдерд╛ред) рдФрд░ рдХреБрдЫ рдХрдиреЗрдХреНрдЯрд░реЛрдВ рдореЗрдВ рдЗрд╕ рдкреВрд▓ рдХрд╛ рдРрд╕рд╛ рдЕрд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдХрд┐ рдкреВрд▓ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╣рдЯрд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдмреЙрдЯрдиреЗрдЯ рдмрди рдЬрд╛рддреА рд╣реИред
рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдЧреНрд░реЗрд╖рдг рдХреЗ рдЗрд╕ рдХрдард┐рди рдХрд╛рд░реНрдп рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реАрдзреА рдкрд╣реБрдБрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: DPDK, netmap, PF_RING, рдЖрджрд┐ред
- рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рди рднреЗрдЬреЗрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдбрд╝реЗ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛рдПрдВ, рдЕрд░реНрдерд╛рдд, рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдлреИрд▓рд╛рдПрдВред рдПрдХ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдордЬрд╝рд╛!
рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдмрд╣рд╛рджреБрд░ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреЗрд▓рд╛рдмреАрдбреА рдореЗрдВ)ред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рддрд░рдл рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВ - рдЙрд╕ рдкрд░ рдЬреЛ рд╣рдо рдЦреБрдж рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдореИрдВ Redis (рдЕрднреА рддрдХ) рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдЙрд╕реА рд░рд╛рд╢рд┐ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рднрд▓реЗ рд╣реА рдЧреНрд░рд╛рд╣рдХ рд╢рд╛рдВрдд DPDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реЛред
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рддреБрд░рдВрдд рд╕реБрдЧрдо рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ-рдЗрди-рдореЗрдореЛрд░реА рдбреЗрдЯрд╛рдмреЗрд╕ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд╛рдЦреЛрдВ рдЖрд░рдкреАрдПрд╕ рдХреА рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд░реЗрдбрд┐рд╕ рдПрдХ рд╕реМ рджреЛ рд╣рдЬрд╛рд░ рдХреА рд╕реЗрд╡рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╕рдлрд▓рддрд╛ рдЙрд╕ рдЗрди-рдореЗрдореЛрд░реА рдмреЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдмрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛, рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рдЗрд╕ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ) рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдХрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВред
рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рд▓реЗрдЦ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд░реЗрдбрд┐рд╕ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдПрдХ рдорд┐рд▓рд┐рдпрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреА рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрди-рдореЗрдореЛрд░реА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд┐рдВрдЧ рдПрд╕рд╡рд╛рдИрдПрд╕ рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдПрдХрдорд╛рддреНрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрджрд┐ рд░реЗрдбрд┐рд╕ рдореЗрдВ рдЖрд╡реЗрджрди рдЕрдиреБрд░реЛрдз рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЖрддреЗ рд╣реИрдВ? рдФрд░ рдпрджрд┐ рдПрдХ рд╕рд░реНрд╡рд░ рдЧрд╛рдпрдм рд╣реИ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╢рд╛рд░реНрдХ рдХреЗ рд╕рд╛рде Redis Cluster рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЯ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрд╡рд╛рдм, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, "рд╕реНрдкрд╖реНрдЯ" рд╣реИ: рдПрдХ рд░реЗрдбрд┐рд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЧреЛрд░реЛрдЗрдиреНрдЯреНрд╕ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрдХрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд╛рдЗрдк-рд╕рдВрдЧреНрд░рд╣ рдХрд░рдирд╛ред
рд╡реИрд╕реЗ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд╛рдЗрдк- рдмрд┐рдЫрд╛рдиреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдореЗрдВ рдЗрддрдирд╛ рджреБрд░реНрд▓рдн рдирд╣реАрдВ рд╣реИ: рдиреЛрдбрдЬ рдиреЛрдб_рд░реЗрдбрд┐рд╕ , рд╕реА # рд░реЗрдбрд┐рд╕рдмреЛрд╕реНрдЯ , рдкрд╛рдпрдерди рдХреЗ рдПрдпреЛрд░реЗрдбрд┐рд╕ рдФрд░ рдХрдИ рдЕрдиреНрдпред рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрдиреЗрдХреНрдЯрд░ рдЗрд╡реЗрдВрдЯ рд▓реВрдкреНрд╕ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ "рдЧрдгрдирд╛ рдкреНрд░рд╡рд╛рд╣" рд╕реЗ рдЕрдиреБрд░реЛрдз рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдЧреЛ рдореЗрдВ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рд▓реВрдк" рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред
рд╣рдо рд░реЗрдбрд┐рд╕ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рдирдпрд╛ "рдмреЗрд╣рддрд░" (рдЯреАрдПрдо) рдХрдиреЗрдХреНрдЯрд░: рд░реЗрдбрд┐рд╕рдкрд╛рдЗрдк рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдирд┐рд╣рд┐рдд рдкрд╛рдЗрдк-рдмрд┐рдЫрд╛рдиреЗ рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдореВрд▓ рдпреЛрдЬрдирд╛:
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЗ рдЧреЛрд░реВрдЯрд╛рдЗрди рд╕реАрдзреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЧреЛрд░реЛрдЗрди рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ;
- рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдХрд▓реЗрдХреНрдЯрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧреЛрд░реЛрдЗрди рд░реАрдбрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ;
- рдЧреЛрд░реМрдЯрд╛рдЗрди-рд░реАрдбрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдпреЗ рд╣реБрдП рдЙрддреНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХреЗ рдЧреЛрд░реЛрдЗрдиреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЪрд╛рд▓рд╛рдХ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╣реЗрдЧрд╛: "рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ!"
рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо рдирд╣реАрдВ рд╣реИ рдФрд░ рдЧреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рднреА рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд╝рд░реВрд░рддреЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддрдВрддреНрд░ рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕реЗ Future
рдХрд╣рддреЗ рд╣реИрдВ):
type Future interface { Resolve(val interface{}) }
рдФрд░ рдлрд┐рд░ рдореВрд▓ рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
type future struct { req Request fut Future } type Conn struct { c net.Conn futmtx sync.Mutex wfutures []future futtimer *time.Timer rfutures chan []future } func (c *Conn) Send(r Request, f Future) { c.futmtx.Lock() defer c.futmtx.Unlock() c.wfutures = append(c.wfutures, future{req: r, fut: f}) if len(c.wfutures) == 1 { futtimer.Reset(100*time.Microsecond) } } func (c *Conn) writer() { for range c.futtimer.C { c.futmtx.Lock() futures, c.wfutures = c.wfutures, nil c.futmtx.Unlock() var b []byte for _, ft := range futures { b = AppendRequest(b, ft.req) } _, _err := ccWrite(b) c.rfutures <- futures } } func (c *Conn) reader() { rd := bufio.NewReader(cc) var futures []future for { response, _err := ParseResponse(rd) if len(futures) == 0 { futures = <- c.rfutures } futures[0].fut.Resolve(response) futures = futures[1:] } }
рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХреЛрдб рд╣реИред рдЫреЛрдбрд╝реЗ рдЧрдП:
- рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрдирд╛;
- I / O рдЯрд╛рдЗрдордЖрдЙрдЯ
- рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ;
- рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ;
- рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛;
- рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди (рдмрдлрд░ рдФрд░ рд╡рд╛рдпрджрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ)ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА I / O рддреНрд░реБрдЯрд┐ (рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рд╣рд┐рдд) рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рднреЗрдЬреЗ рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
рдХрдиреЗрдХреНрд╢рди рдкрд░рдд рдЕрдиреБрд░реЛрдз рдХреЗ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ (рдФрд░ рд╕рдВрднрд╡ рд╣реИ), рдпрд╣ рдЕрдореВрд░реНрдд рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд░реЗрдбрд┐рд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ)ред
Remarqueред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╕рд░реНрдХрд┐рдЯ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
рдЯрд┐рдкреНрдкрдгреА 2. Future.esolve рдкрджреНрдзрддрд┐ рдкрд░ рдмрд╣реБрдд рд╕рдЦреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд▓рдЧрд╛рдИ рдЧрдИ рд╣реИрдВ: рдпрд╣ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдиреА рддреЗрдЬреА рд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдФрд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрддрдВрдХ рдирд╣реАрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╛рдардХ рдЪрдХреНрд░ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА "рдмреНрд░реЗрдХ" рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред Future.Resolve рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд░реИрдЦрд┐рдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рдЬрдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП; рд╢рд╛рдпрдж рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ рдФрд░ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░рд┐рдЯреНрд░реА рднреЗрдЬреЗрдВ (рдХреНрд▓рд╕реНрдЯрд░ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдкреНрд░рднрд╛рд╡
рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЖрдзрд╛ рд▓реЗрдЦ рд╣реИ!
рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╡рд╣ рд╣реИ рдЬреЛ рдкреНрд░реЗрдХреНрд╖рд┐рдд рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рд╣реИред рдФрд░ рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╡рд┐рдХрд▓реНрдк , рдЬреЛ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рд╕рдорд╛рди рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИ:
- рдореБрдЦреНрдп "рд╕реНрдХреНрд░рд┐рдкреНрдЯ" 5 рд╕рдорд╛рдирд╛рдВрддрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ,
- рдкреНрд░рддреНрдпреЗрдХ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ 300-1000 "рд╡рд╛рдВрдЫрд┐рдд" рдЖрд░рдкреАрдПрд╕ рдХреЗ рд▓рд┐рдП, рдЧреЛрд░реЛрдЗрдирдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (1000 рдЖрд░рдкреАрдПрд╕ рдХреЗ рд▓рд┐рдП 3 рдЧреЙрд░реБрдЯрд┐рди рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддреЗ рд╣реИрдВ, 124 рдЧреЛрд░реВрдЯрд┐рди 128000 рдЖрд░рдкреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ),
- рдЧреЛрд░реБрдЯрд┐рди рджрд░ рд╕реАрдордХ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ 5 рд╕реЗ 15 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ - рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред
рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рд╣рдореЗрдВ рд╕рдордпрд░реЗрдЦрд╛ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд┐рддрд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рддреА рд╣реИред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рдардЧрд▓рдд рд╡рд┐рдХрд▓реНрдк рдереЗ:
a) "рдХреНрд▓рд╛рдЗрдВрдЯ" рдХреЗ рд╕рднреА рдЧреЛрд░реБрдЯрд┐рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░ рд╕реАрдордХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ - рдЗрд╕рд╕реЗ рджрд░ рд╕реАрдордХ рджреНрд╡рд╛рд░рд╛ рдЕрддреНрдпрдзрд┐рдХ CPU рдЦрдкрдд рд╣реЛрддреА рд╣реИ, рд╕рд╛рде рд╣реА рдЧреЛрд░реЛрдЯрд┐рди рдХреЗ рд╕рдордп рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдордзреНрдпрдо рдЖрд░рдкреАрдПрд╕ рдкрд░ RedisPipe рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдкрдорд╛рдирд┐рдд рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рдореЗрдВ рд╕реБрдзрд╛рд░);
рдмреА) "рдЧреНрд░рд╛рд╣рдХ" рдХреЗ рд╕рднреА рдЧреЛрд░реБрдЯрд┐рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░ рд╕реАрдордХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ - рджрд░ рд╕реАрдордХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реАрдкреАрдпреВ рдирд╣реАрдВ рдЦрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордп рдореЗрдВ рдЧреЛрд░реЛрдЗрдЯрд┐рди рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдмрдврд╝рддрд╛ рд╣реИ;
рдЧ) рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд░рдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░ рд╕реАрдордХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди 10 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╣реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рднреЗрдЬреЗрдВ - рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдЧреЛрд░реЛрдЗрдВрдЯрд┐рди рдПрдХ рд╕рд╛рде рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдЧрддреЗ рд╣реИрдВ, рдЬреЛ рд░реЗрдбрд┐рд╕рдкрд╛рдЗрдк рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕реБрдзрд╛рд░рддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдЪрд╛рд░-рдХреЛрд░ AWS c5-2xlarge рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╣реБрдЖред рд░реЗрдбрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг 5.0 рд╣реИред
рд╡рд╛рдВрдЫрд┐рдд рдХреНрд╡реЗрд░реА рддреАрд╡реНрд░рддрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреБрд▓ рддреАрд╡реНрд░рддрд╛ рдФрд░ CPU рдореВрд▓реА рджреНрд╡рд╛рд░рд╛ рдЦрдкрдд рдХрд╛ рдЕрдиреБрдкрд╛рдд:
рдЗрд░рд╛рджрд╛ рд╣реИ | redigo рдЖрд░рдкреАрдПрд╕ /% рд╕реАрдкреАрдпреВ | рд░рд┐рдбрд┐рд╕реНрдкрд┐рдк рдиреЛ рд╡реЗрдЯ рдЖрд░рдкреАрдПрд╕ /% рд╕реАрдкреАрдпреВ | рд░реЗрдбрд┐рд╕рд┐рдк рдХреЛ 50┬╡ рд╕реЗ рдЖрд░рдкреАрдПрд╕ /% рд╕реАрдкреАрдпреВ | рд░рд┐рдбрд┐рд╕рд┐рдк 150 ┬╡ рдЖрд░рдкреАрдПрд╕ /% рд╕реАрдкреАрдпреВ |
---|
1000 * 5 | 5015/7% | 5015/6% | 5015/6% | 5015/6% |
2000 * 5 | 10022/11% | 10022/10% | 10022/10% | 10022/10% |
4000 * 5 | 20036/21% | 20036/18% | 20035/17% | 20035/15% |
8000 * 5 | 40020/45% | 40062/37% | 40060/26% | 40056/19% |
резремрежрежреж * рел | 79994/71% | 80102/58% | 80096/33% | 80090/23% |
32000 * 5 рд╣реИ | 159,590 / 96% | 160 180/80% | 160,167 / 39% | 160 150/29% |
64000 * 5 рд╣реИ | рез,реорен,ренренрек / 99% | 320 313/98% | 320,283 / 47% | 320,258 / 37% |
92000 * 5 | рез,реорей,реирежрем / 99% | 480,443 / 97% | 480,407 / 52% | 480 366/42% |
128000 * 5 | резренрепренрекрек / 99% | 640,484 / 97% | 640,488 / 55% | 640,428 / 46% |


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХрд▓ рд╕реНрдХреАрдо (рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ / рд░рд┐рд╕реНрдкрд╛рдВрд╕ + рдХрдиреЗрдХреНрд╢рди рдкреВрд▓) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде, рд░реЗрдбрд┐рд╕ рдмрд╣реБрдд рдЬрд▓реНрджреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреЛ рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж 190 krps рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рдВрднрд╡ рдХрд╛рд░реНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
RedisPipe рдЖрдкрдХреЛ Redis рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╢рдХреНрддрд┐ рдХреЛ рдирд┐рдЪреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╣рдо рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реБрдХрддреЗ рд╣реИрдВ, рдЙрддрдирд╛ рд╣реА рдХрдо Redis CPU рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдареЛрд╕ рд▓рд╛рдн рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА 4krps (рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 20krps) рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдпрджрд┐ 150 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдХрд╛ рдПрдХ рдард╣рд░рд╛рд╡ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ Redis CPU рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рддрдм рднреА рдпрджрд┐ рд╡рд┐рд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд▓рдВрдм рд╕реНрд╡рдпрдВ рд╣реА рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрд░реЛрдз рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдмрдлрд╝рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдпрд╣ RedisPipe рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдХреНрд▓рд╛рд╕рд┐рдХ рдХрдиреЗрдХреНрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдкрдВрдЬреЗ рдХреЛ рдХрдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рдореБрдЦреНрдп рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рддрдм, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ CPU рдЦрдкрдд рдФрд░ рд╡рд┐рд▓рдВрдмрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
рдЗрд░рд╛рджрд╛ рд╣реИ | redigo % рд╕реАрдкреАрдпреВ / рдПрдордПрд╕ | рд░реЗрдбреАрд╕реНрдЯрд╛рдЗрдк рдирд╛рдЙрдЯ % рд╕реАрдкреАрдпреВ / рдПрдордПрд╕ | 50 рдорд┐рд▓реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдХрд╛рдПрдВ % рд╕реАрдкреАрдпреВ / рдПрдордПрд╕ | рдкреБрдирд░реНрдирд╡рд╛ 150 рдорд┐ % рд╕реАрдкреАрдпреВ / рдПрдордПрд╕ |
---|
1000 * 5 | 13 / 0.03 | 20 / 0.04 | 46 / 0.16 рд╣реИ | рекрек / реж.реирем |
2000 * 5 | 25 / 0.03 | 33 / 0.04 | 77 / 0.16 рд╣реИ | 71 / 0.26 рд╣реИ |
4000 * 5 | 48 / 0.03 | 60 / 0.04 | 124 / 0.16 | 107 / 0.26 рд╣реИ |
8000 * 5 | 94 / 0.03 | 119 / 0.04 | 178 / 0.15 рд╣реИ | 141 / 0.26 рд╣реИ |
резремрежрежреж * рел | 184 / 0.04 | 206 / 0.04 рд╣реИ | 228 / 0.15 | 177 / 0.25 |
32000 * 5 рд╣реИ | 341 / 0.08 | 322 / 0.05 рд╣реИ | 280 / 0.15 | 226 / 0.26 рд╣реИ |
64000 * 5 рд╣реИ | 316 / 1.88 | 469 / 0.08 рд╣реИ | 345 / 0.16 | 307 / 0.26 |
92000 * 5 | 313 / 2.88 | 511 / 0.16 рд╣реИ | 398 / 0.17 рд╣реИ | 366 / 0.27 |
128000 * 5 | 312 / 3.54 | 509 / 0.37 рд╣реИ | 441 / 0.19 | 418 / 0.29 рд╣реИ |


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЫреЛрдЯреЗ рд░реИрдк рдкрд░ рд░реЗрдбрд┐рд╕рдкрд╛рдЗрдк рд╕реНрд╡рдпрдВ "рдкреНрд░рддрд┐рдпреЛрдЧреА" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдард╣рд░рд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреЛ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ (рд▓рд┐рдирдХреНрд╕ рдкрд░ рдпрд╣ futexsleep рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ "рдиреЛ рдкреЙрдЬрд╝" рдореЛрдб рдореЗрдВ рдЕрдВрддрд░ рдХрд╛рдлреА рдХрдо рд╣реИред
рдмрдврд╝рддреЗ рд╕рдордп рдХреЗ рд╕рд╛рде, рдЯрд╛рдЗрдорд░ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрдо рдУрд╡рд░рд╣реЗрдб рджреНрд╡рд╛рд░рд╛ рдСрдлрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ 16 krps рдХреЗ рдмрд╛рдж, 150 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдХреЗ рдард╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде RedisPipe рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд░реНрдд рд▓рд╛рдн рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рд╕реАрдкреАрдЖрдИ рдореЗрдВ рд░реЗрдбрд┐рд╕ рдХреЗ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рд╕рд┐рдХ рдХрдиреЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╡рд┐рд▓рдВрдмрддрд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдк рдЕрдХреНрд╕рд░ рдПрдХ рд░реЗрдбрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ 180 krps рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рдЬрдм рддрдХ рд░реЗрдбрд┐рд╕ рд╕реАрдкреАрдпреВ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рддрдм рддрдХ рд╡рд┐рд▓рдВрдмрддрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдард╣рд░рд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред рдпрд╣ рд╕рдордЭреМрддрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рдВрдмрдВрдзрдХ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╡реНрдпрд╛рдкрд╛рд░ рдмрдВрдж рдХреЗрд╡рд▓ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдпрджрд┐ Redis рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╣реА рднреМрддрд┐рдХ рд╣реЛрд╕реНрдЯ рдкрд░ рд╣реИрдВред рдиреЗрдЯрд╡рд░реНрдХ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрдбрд╝реЛрд╕реА рдореЗрдЬрдмрд╛рди рдХреА рдПрдХ рдЧреЛрд▓ рдпрд╛рддреНрд░рд╛ рдПрдХ рд╕реМ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рд╕реЗ рдПрдХ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рддрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдиреМ рдЧреБрдирд╛ (0.26 / 0.03) рдХреЗ рдмрдЬрд╛рдп рджреЗрд░реА рдореЗрдВ рдЕрдВрддрд░ рддреАрди рдЧреБрдирд╛ (0.36 / 0.13) рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рджрд╕рд┐рдпреЛрдВ рдкреНрд░рддрд┐рд╢рдд (1.26 / 1.03) рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрднрд╛рд░ рдореЗрдВ, рдЬрдм рд░реЗрдбрд┐рд╕ рдХреЛ рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреИрд╢ рдорд┐рд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдХреБрд▓ рдЕрдкреЗрдХреНрд╖рд╛ рд░реЗрдбрд┐рд╕ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдХреБрд▓ рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рджреЗрд░реА рдореЗрдВ рд╡реГрджреНрдзрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рд╡рд┐рдХрд╛рд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рд╣реИ: рдпрджрд┐ рдЕрдЪрд╛рдирдХ рд╕реЗрд╡рд╛ рдкрд░ рднрд╛рд░ рдПрди рдмрд╛рд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд░реЗрдбрд┐рд╕ рд╕реАрдкреАрдпреВ рдХреЛ рдЙрд╕реА рдПрди рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред 160 krps рд╕реЗ 640 krps рддрдХ рдХреЗ рд▓реЛрдб рдХреЛ рдЪреМрдЧреБрдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Redis рдиреЗ рдХреЗрд╡рд▓ 1.6 рдЧреБрдирд╛ рдЕрдзрд┐рдХ CPU рдЦрд░реНрдЪ рдХрд┐рдпрд╛, рдЦрдкрдд 29 рд╕реЗ 46% рддрдХ рдмрдврд╝ рдЧрдИред рдпрд╣ рд╣рдореЗрдВ рдбрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдбрд┐рд╕ рдЕрдЪрд╛рдирдХ рдЭреБрдХ рдЬрд╛рдПрдЧрд╛ред рдЖрд╡реЗрджрди рдХреА рдорд╛рдкрдиреАрдпрддрд╛ рднреА рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреА рд▓рд╛рдЧрдд (рд░реАрдб: рдПрд╕рд╡рд╛рдИрдПрд╕ рд╕реАрдкреАрдпреВ рд▓рд╛рдЧрдд) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред
Remarqueред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛрдб рдЫреЛрдЯреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ 768 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдпрд╛ред рдореВрд▓реА рджреНрд╡рд╛рд░рд╛ рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реГрджреНрдзрд┐ рд╣реБрдИ (150, рдХреЗ рдард╣рд░рд╛рд╡ рдкрд░ 66% рддрдХ), рдФрд░ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЫрдд 170 krps рддрдХ рдЧрд┐рд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╕рднреА рдордирд╛рдпрд╛ рдЕрдиреБрдкрд╛рдд рд╕рдорд╛рди рд░рд╣реЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдирд┐рд╖реНрдХрд░реНрд╖ред
рд╕рдореВрд╣
рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рдо рд░реЗрдбрд┐рд╕ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рди рдХреЗрд╡рд▓ Redis рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрд╕реНрдерд┐рд░ рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд / рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдкрд░ рдбреЗрдЯрд╛ рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред
рд░реЗрдбрд┐рд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдорд╛рд░реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ "рдореВрд▓реА" рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рднреА рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм "рдЧреБрд▓рджрд╕реНрддрд╛" рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рднреА Redis рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЬрд╛рд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдерд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░рд╛рд╣рдХ (рд╣рдо рдЙрдВрдЧрд▓реА рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ) рдХреЛ рдмрд╣реБрдд рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдиреЗ рдЧреЛ (CSP, рдЪреИрдирд▓, рдЧреЛрд░реЛрдЗрдЯрд┐рди) рдХреЗ рд╡рд┐рдкрдгрди рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛, рдиреЗ рдХреЗрдВрджреНрд░реАрдп рдЧреЛрд░реЛрдЗрди рдХреЛ рдХреЙрд▓рдмреИрдХ рднреЗрдЬрдХрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЧрдВрднреАрд░ рд╡рдирд╕реНрдкрддрд┐ рдмрди рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреИрдЪ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдЪрд╛рд░ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдерд╛, рдкреНрд░рддреНрдпреЗрдХ, рдмрджрд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдбрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд▓ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдХрдиреЗрдХреНрд╢рди рддрдХ рдмрдврд╝рд╛ред
рддрджрдиреБрд╕рд╛рд░, рдирдП рдХрдиреЗрдХреНрдЯрд░ рдХреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдХрд╛рдо рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдкрд░ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд▓реЙрдХ-рдлрд╝реНрд░реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд┐рддрд┐ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдФрд░ рдкрд░рдорд╛рдгреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд╛рджрд┐рдд рдХрдИ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВ
- рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдБрдЪ atomic.StorePointer / atomic.LoadPointer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдЯреЗрдЯ рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди рднреА, рдЕрдиреБрд░реЛрдз рд▓реЙрдХ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдкрд┐рдЫрд▓реЗ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд░ 5 рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреНрд▓рд╕реНрдЯрд░ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рд╕рдВрджреЗрд╣ рд╣реИ, рддреЛ рдЕрдкрдбреЗрдЯ рдордЬрдмреВрд░ рд╣реИ:
func (c *Cluster) control() { t := time.NewTicker(c.opts.CheckInterval) defer t.Stop()
рдпрджрд┐ рдореВрд▓реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд MOVED рдпрд╛ ASK рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬреЛрдбрд╝ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдБ рд▓рд┐рдВрдХ рд╣реИ ред) рдпрд╣ рддрд╛рд▓реЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдереЛрдбрд╝реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░рдгреА рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕рд╣реЗрдЬрдХрд░ рдореБрдЦреНрдп рдЕрдкреЗрдХреНрд╖рд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рдорд╛рди рднрд╡рд┐рд╖реНрдп, рд╕рд╛рдЗрдб рд╡реНрдпреВред
рд╕рднреА рд░реЗрдбрд┐рд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реНрд╡рд╛рдореА рдХреЛ, рдФрд░ рджрд╛рд╕реЛрдВ рдХреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд╕рдВрджреАрджрд╛ рдиреАрддрд┐ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рдХрд╛рд░ (рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдиреБрд░реЛрдз рдХреЛ рдорд╛рд╕реНрдЯрд░ рдФрд░ рджрд╛рд╕ рджреЛрдиреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ "рдЖрдЬреАрд╡рд┐рдХрд╛" рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рджреЛрдиреЛрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред
func (c *Cluster) connForSlot(slot uint16, policy ReplicaPolicyEnum) (*redisconn.Connection, *errorx.Error) { var conn *redisconn.Connection cfg := c.getConfig() shard := cfg.slot2shard(slot) nodes := cfg.nodes var addr string switch policy { case MasterOnly: addr = shard.addr[0]
рдпрд╣рд╛рдБ рдПрдХ RoundRobinSeed.Current()
ред рдпрд╣, рдПрдХ рддрд░рдл, рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реИ, рдФрд░ рджреВрд╕рд░реА рддрд░рдл, рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рдЬреЛ рдЕрдХреНрд╕рд░ рдмрджрд▓рддреА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рджрдХреНрд╖рддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд░ рдХреБрдЫ рджрд╕рд┐рдпреЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд╕рдордп рдореЗрдВ рдХрдо рдУрд╡рд░рд▓реЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдЬрдмрд╛рди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдХрдиреЗрдХреНрд╢рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд╕реНрдЯрд░ рдПрдХ рд╣реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдХрд╕реНрдЯрдо рдлреНрдпреВрдЪрд░ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХрд┐рдП рдЧрдП рдореЗрдВ рдЦреБрдж рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╕реНрдЯрдо рднрд╡рд┐рд╖реНрдп рдХреНрдпреЛрдВ рд▓рдкреЗрдЯреЗрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдб рдореЗрдВ, "рдореВрд▓реА" рдЕрджреНрднреБрдд "рддреНрд░реБрдЯрд┐рдпреЛрдВ" рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде MOVED рдФрд░ ASK, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣реЛрд╕реНрдЯ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рдЪреВрдБрдХрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ I / O рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдЕрдЧрд░ рд░реАрдб рдЕрдиреБрд░реЛрдз):
type request struct { c *Cluster req Request cb Future slot uint16 policy ReplicaPolicyEnum mayRetry bool } func (c *Cluster) SendWithPolicy(policy ReplicaPolicyEnum, req Request, cb Future) { slot := redisclusterutil.ReqSlot(req) policy = c.fixPolicy(slot, req, policy) conn, err := c.connForSlot(slot, policy, nil) if err != nil { cb.Resolve(err) return } r := &request{ c: c, req: req, cb: cb, slot: slot, policy: policy, mayRetry: policy != MasterOnly || redis.ReplicaSafe(req.Cmd), } conn.Send(req, r, 0) } func (r *request) Resolve(res interface{}, _ uint64) { err := redis.AsErrorx(res) if err == nil { r.resolve(res) return } switch { case err.IsOfType(redis.ErrIO): if !r.mayRetry {
рдпрд╣ рднреА рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдХреЛрдб рд╣реИред рд░рд┐рдЯреНрд░реАрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз, рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдВрд╕реНрдорд░рдг рдЖрджрд┐ред
рдЖрд░рд╛рдо
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз, рднрд╡рд┐рд╖реНрдп рдПрдХ рд╕реБрдкрд░рдХреНрдпреВрд▓ рд╣реИ! рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрд╕рд╣рдЬред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рд╣реИред рдЖрдк рдПрдХ рдЕрдЪреНрдЫрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рднреА рдмреЗрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ Redis рдФрд░ MongoDB рдиреЗ рдЕрдкрдиреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрдВ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
AsError
рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЗрд╢реА рдЧреЛ-рд╡реЗ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдХрд╛ Result<T,Error>
, рдФрд░ AsError
рдПрдХ AsError
рдорд┐рд▓рд╛рди рдкреИрдЯрд░реНрди рд╣реИред
рдХрдорд┐рдпреЛрдВ
рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рднрд▓рд╛рдИ рдореЗрдВ рдорд░рд╣рдо рдореЗрдВ рдПрдХ рдордХреНрдЦреА рд╣реИред
Redis рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЕрдиреБрд░реЛрдз рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдЗрд╕рдореЗрдВ BLPOP, BRPOP рдЬреИрд╕реЗ рдЕрд╡рд░реЛрдзрдХ рдЕрдиреБрд░реЛрдз рд╣реИрдВред
рдпрд╣ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдЕрд╡рд░реБрджреНрдз рд╣реИ, рддреЛ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред
рдПрдХ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, RedisPipe рдореЗрдВ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
рдмреЗрд╢рдХ, рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкреИрд░рд╛рдореАрдЯрд░ ScriptMode: true
рдмреЗрдирдХрд╛рдм рдХрд░реЗрдВ ScriptMode: true
, рдФрд░ рдпрд╣ рд╕рдм рдЖрдкрдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рд╣реИред
рд╡рд┐рдХрд▓реНрдк
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрднреА рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬреЛ рдЬрд╛рдирдХрд╛рд░ рдкрд╛рдардХреЛрдВ рдиреЗ рд╕реЛрдЪрд╛ рдерд╛, рд╡рд╣ рдХреНрд▓рд╕реНрдЯрд░ рдХреИрд╢реНрд╕ рдЯреНрд╡реЗрдордкреНрд░реЛрдХреНрд╕реА рдХрд╛ рд░рд╛рдЬрд╛ рд╣реИред
рд╡рд╣ рд░реЗрдбрд┐рд╕ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░рд╛ рдХрдиреЗрдХреНрдЯрд░ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдХреНрд░реВрдб рдФрд░ рд╕реНрдореЗрд▓рд╕ "рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛" рдХреЛ рдПрдХ рд╕реМрдореНрдп "рдкрд╛рдЗрдк-рдмрд┐рдЫрд╛рдиреЗ" рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЯреНрд╡реЗрдордкреНрд░реЛрдХреНрд╕реА рдЦреБрдж рдЗрд╕ рддрдереНрдп рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рдЙрд╕реЗ "рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛" рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмрд╛рд░ред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╣рдо "рдореВрд▓реА" рдХреЗ рд╕рд╛рде-рд╕рд╛рде "рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рднрдВрдбрд╛рд░рдг" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдЯреНрд╡реЗрдордкреНрд░реЛрдХреНрд╕реА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрд╕рдВрддреБрд▓рди рдХрд╛рд░реНрдп рдХреА рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рд░рд┐рдмреВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкреНрд░рднрд╛рд╡
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдФрд░ рд░реЗрдбрд┐рд╕рдкрд╛рдЗрдк рд╕реЗ рддрд░рдВрдЧреЗрдВ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛ рдЪреБрдХреА рд╣реИрдВред Radix.v3 рдореЗрдВ рдПрдХ рдкреИрдЪ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдкреВрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
RedisPipe рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ / рдмреИрдЪрд┐рдВрдЧ рдХреА рд░рдгрдиреАрддрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдкреВрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ
рд╡реЗ рдЧрддрд┐ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╣реАрди рд╣реИрдВ (рдЙрдирдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП; рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдкреВрд▓ рд╕реЗ рдЕрдиреНрдп рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХрдорд╛рдВрдб рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдЬрд▓реНрдж рд╣реА рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╣реА рд╣реИ рдХрд┐ RedisPipe рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред
рдФрд░ рдХрд┐рд╕реА рднреА "рдЧрд░реНрдо рджрд┐рдиреЛрдВ" рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬрд┐рд╕рдХреА рдХреНрд╖рдорддрд╛ рдЪрд┐рдВрддрд╛ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рд░реЗрдбрд┐рд╕ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реАрдкреАрдпреВ рд╣реИред
рдХреЛрд╖
рдмреЗрдВрдЪрдорд╛рд░реНрдХ