рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдкрд╛рд▓рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред

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

рдЧреЛ рдпрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рд╣реИрдВ pprof рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ.

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд░рдгрдиреАрддрд┐

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

  • рд╣рдо рдЕрдиреБрдХреВрд▓рди рд╕реАрдорд╛рдПрдБ (рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ;
  • рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд▓реЗрдирджреЗрди рднрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ;
  • рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ (рдбреЗрдЯрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ);
  • рд╣рдо рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ;
  • рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ - рдХреНрдпрд╛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдкреВрд░реА рд╣реЛрддреА рд╣реИрдВ?
  • рд╣рдо рдЗрд╕реЗ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдврдВрдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ;
  • рд╣рдо рдЗрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд╕рд░рд▓ HTTP рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╣рдо рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЖрд▓реЗрдЦ рд╕реЗ рд╕рднреА рдХреЛрдб рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣рд╛рдВ.

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ HTTP рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП Postgresql рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдореЗрдерд┐рдпрд╕, рдиреЛрдб_рдПрдХреНрд╕рдкреЛрд░реНрдЯрд░ рдФрд░ рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╣реИред

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреЗрд▓рд┐рдВрдЧ (рдФрд░ рдЧрдгрдирд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ) рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд▓рдХреНрд╖реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛

рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рд╣рдо рд▓рдХреНрд╖реНрдп рддрдп рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреНрдпрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╣рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХрдм рдЦрд╝рддреНрдо рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ? рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧреНрд░рд╛рд╣рдХ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреАред

╨Т рдЧреВрдЧрд▓ рдПрд╕рдЖрд░рдИ рдмреБрдХ рдЪрдпрди рдФрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред рдЖрдЗрдП рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ рдФрд░ рдореЙрдбрд▓ рдмрдирд╛рдПрдВ:

  • рд╡рд┐рд▓рдВрдмрддрд╛: 99% рдЕрдиреБрд░реЛрдз 60 рдПрдордПрд╕ рд╕реЗ рдХрдо рд╕рдордп рдореЗрдВ рдкреВрд░реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП;
  • рд▓рд╛рдЧрдд: рд╕реЗрд╡рд╛ рдореЗрдВ рдиреНрдпреВрдирддрдо рдзрдирд░рд╛рд╢рд┐ рдЦрд░реНрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдо рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╕рдордЭрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдереНрд░реВрдкреБрдЯ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддреЗ рд╣реИрдВ;
  • рдХреНрд╖рдорддрд╛ рдирд┐рдпреЛрдЬрди: рдпрд╣ рд╕рдордЭрдиреЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдордЧреНрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╣рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рддрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдб рдФрд░ рдкреНрд░рд╛рд╡рдзрд╛рди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЕрддрд┐рд░реЗрдХ n+1.

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

рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

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

рд▓реЗрди-рджреЗрди рдХрд╛ рднрд╛рд░

рдпрд╣ рд╡рд╛рддрд╛рд╡рд░рдг рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЙрдЧрдирд╛ рд░реБрдХрдиреЗ рддрдХ рдПрдХ рдХрд╕реНрдЯрдо HTTP рдЕрдиреБрд░реЛрдз рджрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

$ make load-test LOAD_TEST_RATE=50
echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report

рджреЗрдЦ

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

рд░реВрдкрд░реЗрдЦрд╛

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

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

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

рдирд┐рд╖реНрдкрд╛рджрди, рдЕрд╡рд▓реЛрдХрди, рд╡рд┐рд╢реНрд▓реЗрд╖рдгред

рдЖрдЗрдП рдПрдХ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ. рд╣рдо рддрдм рддрдХ рдкреНрд░рджрд░реНрд╢рди, рдирд┐рд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ рд╣рдо рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред рдЖрдЗрдП рд╣рдо рдкрд╣рд▓реЗ рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрдо рд▓реЛрдб рдорд╛рди рдЪреБрдиреЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╣рдо рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЪреБрдиреЗ рдЧрдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░рдХ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдмрдврд╝рд╛рдПрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рд░рди рд╕рдорд╛рдпреЛрдЬрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: make load-test LOAD_TEST_RATE=X.

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 50 рдЕрдиреБрд░реЛрдз

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд╢реАрд░реНрд╖ рджреЛ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ. рд╢реАрд░реНрд╖ рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 50 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ) рдФрд░ рд╢реАрд░реНрд╖ рджрд╛рдИрдВ рдУрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреА рдЕрд╡рдзрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдкреНрд░рджрд░реНрд╢рди рд╕реАрдорд╛рдУрдВ рдХреЗ рднреАрддрд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЧреНрд░рд╛рдлрд╝ рдкрд░ рд▓рд╛рд▓ рд░реЗрдЦрд╛ HTTP рдЕрдиреБрд░реЛрдз рд╡рд┐рд▓рдВрдмрддрд╛ 60ms рдкрд░ SLO рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд░реЗрдЦрд╛ рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рд╕реЗ рдХрд╛рдлреА рдиреАрдЪреЗ рд╣реИрдВред

рдЖрдЗрдП рд▓рд╛рдЧрдд рдкрдХреНрд╖ рдкрд░ рдирдЬрд░ рдбрд╛рд▓реЗрдВ:

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10000 рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ 50 рдЕрдиреБрд░реЛрдз = 200 рд╕рд░реНрд╡рд░ + 1

рд╣рдо рдЕрднреА рднреА рдЗрд╕ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 500 рдЕрдиреБрд░реЛрдз

рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рддрдм рдШрдЯрд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИрдВ рдЬрдм рд▓реЛрдб 500 рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ:

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдкреБрдирдГ, рд╢реАрд░реНрд╖ рдмрд╛рдПрдБ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдб рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд▓рдВрдмрддрд╛ рдЧреНрд░рд╛рдлрд╝ рд╢реАрд░реНрд╖ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд┐рдд рд╣реИ, рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 500 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 25-40ms рдХреА рджреЗрд░реА рд╣реБрдИред 99рд╡рд╛рдБ рдкреНрд░рддрд┐рд╢рддрдХ рдЕрднреА рднреА рдКрдкрд░ рдЪреБрдиреЗ рдЧрдП 60ms SLO рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

рд▓рд╛рдЧрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ:

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10000 рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ 500 рдЕрдиреБрд░реЛрдз = 20 рд╕рд░реНрд╡рд░ + 1

рд╕рдм рдХреБрдЫ рдЕрднреА рднреА рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 рдЕрдиреБрд░реЛрдз

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд╢рд╛рдирджрд╛рд░ рд▓реЙрдиреНрдЪ! рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдиреЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП, рд▓реЗрдХрд┐рди рдПрд╕рдПрд▓рдУ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд▓рдВрдмрддрд╛ рд╕реАрдорд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕реЗ рд╢реАрд░реНрд╖ рджрд╛рдПрдБ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдкрдВрдХреНрддрд┐ p99 рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ p100 рд▓рд╛рдЗрди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд▓рдВрдм рдЕрдзрд┐рдХрддрдо 60ms рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдЖрдЗрдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдореЗрдВ рдЙрддрд░реЗрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

рд░реВрдкрд░реЗрдЦрд╛

рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓реЛрдб рдХреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ pprof рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реАрдкреАрдпреВ рд╕рдордп рдХрд╣рд╛рдВ рдЦрд░реНрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ HTTP рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ pprof, рдФрд░ рдлрд┐рд░, рд▓реЛрдб рдХреЗ рддрд╣рдд, рдХрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗрдВ:

$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof

рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдЧреНрд░рд╛рдлрд╝ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди CPU рд╕рдордп рдХрд╣рд╛рдБ рдФрд░ рдХрд┐рддрдирд╛ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИред рд╕реЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ:

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рдкрд░рд┐рдХрд▓реНрдкрдирд╛

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

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

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдпрджрд┐ рдЖрдк рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдкрд░ рдХрд░реНрд╕рд░ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕реНрдЯреИрдХ рдкрд░ рдмрд┐рддрд╛рдпрд╛ рдЧрдпрд╛ рдХреБрд▓ рд╕рдордп рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред HTTPServe рдлрд╝рдВрдХреНрд╢рди 65% рд╕рдордп, рдЕрдиреНрдп рд░рдирдЯрд╛рдЗрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдореМрдЬреВрдж рдерд╛ runtime.mcall, mstart ╨╕ gc, рдмрд╛рдХреА рд╕рдордп рд▓реЗ рд▓рд┐рдпрд╛ред рдордЬрд╝реЗрджрд╛рд░ рддрдереНрдп: рдХреБрд▓ рд╕рдордп рдХрд╛ 5% DNS рдХреНрд╡реЗрд░реАрдЬрд╝ рдкрд░ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ:

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬрд┐рди рдкрддреЛрдВ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рд╡реЗ Postgresql рдХреЗ рд╣реИрдВред рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ FindByAge:

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рддреАрди рдореБрдЦреНрдп рд╕реНрд░реЛрдд рд╣реИрдВ рдЬреЛ рджреЗрд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдирд╛ рдФрд░ рдмрдВрдж рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ред рдЧреНрд░рд╛рдлрд╝ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ DNS рдЕрдиреБрд░реЛрдз, рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рдХреБрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рд▓рдЧрднрдЧ 13% рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рдЗрдкреЛрдереАрд╕рд┐рд╕: рдкреВрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдХрд▓ HTTP рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рдордп рдХрдо рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рдЙрдЪреНрдЪ рдереНрд░реВрдкреБрдЯ рдФрд░ рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреА.

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯ рдХрд░рдирд╛ - рдкреНрд░рдпреЛрдЧ

рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП Postgresql рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░. рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╣рдо рдЖрдЗрдП рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдХреНрдпреВрдПрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд┐рдВрдЧ:

db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)

if err != nil {
   return nil, err
}

рдирд┐рд╖реНрдкрд╛рджрди, рдЕрд╡рд▓реЛрдХрди, рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреА99 рдХрд╛ рд╡рд┐рд▓рдВрдмрддрд╛ рд╕реНрддрд░ 60 рдПрдордПрд╕ рдХреЗ рдПрд╕рдПрд▓рдУ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ!

рд▓рд╛рдЧрдд рдХреНрдпрд╛ рд╣реИ?

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10000 рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ 1000 рдЕрдиреБрд░реЛрдз = 10 рд╕рд░реНрд╡рд░ + 1

рдЖрдЗрдП рдЗрд╕реЗ рдФрд░ рднреА рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд░реЗрдВ!

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 2000 рдЕрдиреБрд░реЛрдз

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд▓реЛрдб рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдирд╛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдКрдкрд░реА рдмрд╛рдПрдБ рдЧреНрд░рд╛рдлрд╝ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 2000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, p100 60ms рд╕реЗ рдХрдо рд╣реИ, p99 SLO рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рд▓рд╛рдЧрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ:

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10000 рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ 2000 рдЕрдиреБрд░реЛрдз = 5 рд╕рд░реНрд╡рд░ + 1

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3000 рдЕрдиреБрд░реЛрдз

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдпрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди 3000ms рд╕реЗ рдХрдо рдХреА p99 рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЗ рд╕рд╛рде 60 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрд╕рдПрд▓рдУ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд▓рд╛рдЧрдд рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:

10000 рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб / рдкреНрд░рддрд┐ 3000 рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ = 4 рд╕рд░реНрд╡рд░ + 1 (рд▓реЗрдЦрдХ рдиреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рд╣реИ, рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджрдХ)

рдЖрдЗрдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдПрдХ рдФрд░ рджреМрд░ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рдкрд░рд┐рдХрд▓реНрдкрдирд╛

рд╣рдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3000 рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рдЕрднреА рднреА 6% рд╕рдордп рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред рдкреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирдП рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред

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

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯ рдХрд░рдирд╛ - рдкреНрд░рдпреЛрдЧ

рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдореИрдХреНрд╕рдЖрдЗрдбрд▓рдХреЙрдиреНрд╕ рдкреВрд▓ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ (рдпрд╣ рднреА рд╡рд░реНрдгрд┐рдд рд╣реИ)ред рдпрд╣рд╛рдВ):

db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
   return nil, err
}

рдирд┐рд╖реНрдкрд╛рджрди, рдЕрд╡рд▓реЛрдХрди, рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3000 рдЕрдиреБрд░реЛрдз

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

p99 рдХрд╛рдлреА рдХрдо p60 рдХреЗ рд╕рд╛рде 100ms рд╕реЗ рдХрдо рд╣реИ!

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

рд▓реМ рдЧреНрд░рд╛рдлрд╝ рдХреА рдЬрд╛рдБрдЪ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдЕрдм рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ! рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪреЗрдВ pg(*conn).query - рд╣рдо рдпрд╣рд╛рдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХрдиреЗрдХреНрд╢рди рдкрд░ рднреА рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рдПрд╕рдЖрд░рдИ: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред рдЧреЛ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ