рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдорд╣рддреНрд╡ рдХрд╛ рд╡рдЬрди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ (рдЯрд╛рд░рдирдЯреВрд▓ + рд▓реБрдЖ)

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



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



рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдЧреЗрдо рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣реИред

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

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

рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

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



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

рдХреБрд▓, рд╣рдореЗрдВ 2 рд╕реНрдерд╛рди рдорд┐рд▓рддреЗ рд╣реИрдВред 5 рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛:
Player1
player2
рднрд╛рд░
рдЕрдВрддрд┐рдо рдЕрджреНрдпрддрди рддрд┐рдерд┐
рд╡рдЬрди рдШрдЯрд╛рдиреЗ рдкреНрд░рддрд┐ рджрд┐рди
2 рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛:
Player1
рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдВрддрд┐рдо рдЧрддрд┐рд╡рд┐рдзрд┐ Date1

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

slab_alloc_arena = 1 pid_file = "box.pid" logger="cat - >> Tarantool.log" primary_port = 33013 secondary_port = 33014 admin_port = 33015 rows_per_wal = 5000000 #    space[0].enabled = 1 space[0].index[0].type = "HASH" space[0].index[0].unique = 1 space[0].index[0].key_field[0].fieldno = 0 space[0].index[0].key_field[0].type = "NUM" space[0].index[0].key_field[1].fieldno = 1 space[0].index[0].key_field[1].type = "NUM" space[0].index[1].type = "TREE" space[0].index[1].unique = 0 space[0].index[1].key_field[0].fieldno = 0 space[0].index[1].key_field[0].type = "NUM" space[0].index[2].type = "TREE" space[0].index[2].unique = 0 space[0].index[2].key_field[0].fieldno = 0 space[0].index[2].key_field[0].type = "NUM" space[0].index[2].key_field[1].fieldno = 2 space[0].index[2].key_field[1].type = "NUM" space[1].enabled = 1 space[1].index[0].type = "HASH" space[1].index[0].unique = 1 space[1].index[0].key_field[0].fieldno = 0 space[1].index[0].key_field[0].type = "NUM" 


рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рднрдВрдбрд╛рд░ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 $ tarantool_box --init-storage tarantool/src/box/tarantool_box: space 0 successfully configured tarantool/src/box/tarantool_box: space 1 successfully configured tarantool/src/box/tarantool_box: creating `./00000000000000000001.snap.inprogress' tarantool/src/box/tarantool_box: saving snapshot `./00000000000000000001.snap' tarantool/src/box/tarantool_box: done 


рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рддреИрдпрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдЖрдк рд▓реБрдЖ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг (рд╡реГрджреНрдзрд┐_рд╕реНрдХреЛрд░)
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (get_top)


рд╣рдо рдЙрдиреНрд╣реЗрдВ box_popular_user.lua рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ рдмреЙрдХреНрд╕_config_popular_user.lua рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдлрд┐рд░ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ init.lua рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 1 рд▓рд╛рдЗрди: dofile ("box_popular_user.lua") рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛

рддреЛ, рдЕрдм more_score () рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

 function increase_score(user_id, friend_id, action_type) --    local id = tonumber(user_id) local fid = tonumber(friend_id) if not id or not fid or not map_type_score[action_type] then return false end --     local dt = os.date('*t') local cd = box.time{year = dt.year; month=dt.month; day=dt.day} --     ,          local last_update = box.select('1', '0', id) if not last_update then last_update = box.insert('1',id,cd) end --        local difft = math.floor(( cd-box.unpack('i',last_update[1]) )/24/60/60) --    ,       if difft ~= 0 then if difft > 1 then --      ,        ,        -- ,           ,     table.insert(updates_in_fibers,id,box.fiber.wrap(function() _move_last_update(id, cd, difft) end)) difft = difft-1 else difft = 0 end box.update('1',id,'=p',1,cd) end --       local tup = box.select('0','0', id, fid) --          _get_score_koef if not tup then --      ,   local s_k = _get_score_koef(nil, nil, map_type_score[action_type], nil, cd) tup = box.insert('0', id, fid, s_k[1], cd, s_k[2]) else --      local s_k = _get_score_koef(box.unpack('i', tup[3])+difft, box.unpack('i', tup[2]), map_type_score[action_type], box.unpack('i',tup[4]), cd) --       ,       ,       tup = box.update('0',{id;fid},'=p=p=p',2, s_k[1],3,cd,4,s_k[2]) end return tup end 


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

 function _move_last_update(id, cd, diff) weights = box.space[0] for tup in weights.index[1]:iterator(box.index.EQ, id) do --        if box.unpack('i',tup[3]) < cd then weights:update({box.unpack('i',tup[1]); box.unpack('i',tup[2])},'=p', 3, box.unpack('i',tup[3])+diff) end end --     id    table.remove(updates_in_fibers, id) end 


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

рдЕрдм рд╡рдЬрд╝рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдФрд░ рдЗрд╕рдХреА рдХрдореА рдХреЗ рдЧреБрдгрд╛рдВрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 function _get_score_koef(last_update, last_score, add_score, koef, current_date) local score = 0; if not last_score then --        ,     ,            score = add_score else if current_date == last_update then --       ,          score = last_score + add_score else --      ,           local diff = (current_date-last_update)/24/60/60*koef if diff > last_score then -- ,    ,  ,    -       diff = last_score end --      ,   score = last_score + add_score - diff end end if add_score then --   ,   ,        ,     koef = score/box_pu_default['score_day'] end return {score,koef}; end 


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

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
 function get_top(user_id, count_users, ids) --   ,          (   "box_config_popular_user.lua") local id = tonumber(user_id) if not id then return false end local cu if not count_users then cu = box_pu_default['count_users'] else cu = tonumber(count_users) end local id_users = {} local count = 0 --    id   ,   ,    -   -  ,    if ids then for id in string.gmatch(ids, "%d+") do id_users[tonumber(id)] = 1 count=count+1 end if(count < cu) then cu = count end end --      local ret local last_update = box.select('1', '0', id) --  2                     for iter = 1, 2 do local need_update = {} ret = {} for v in box.space[0].index[2]:iterator(box.index.LE, id) do --         -  if not v or #ret == cu or box.unpack('i',v[0]) ~= id then break end --    ,    ,   if not ids or id_users[box.unpack('i',v[1])] == 1 then --                   --  ,         if not updates_in_fibers[id] and box.unpack('i', v[3]) ~= box.unpack('i', last_update[1]) then table.insert(need_update, v) else --        table.insert(ret, v) end end end local need_another_req = 0 for i = 1, #need_update do local v = need_update[i] local s_k = _get_score_koef(box.unpack('i', v[3]), box.unpack('i', v[2]), 0, box.unpack('i',v[4]), box.unpack('i', last_update[1])) --   ,      if s_k[1] == 0 then box.delete('0',{v[0],v[1]}) else --       ,    , ..     box.update('0',{v[0];v[1]},'=p=p=p',2, s_k[1],3,box.unpack('i', last_update[1]),4,s_k[2]) need_another_req = 1 end end if need_another_req == 0 then break end end return unpack(ret) end 


рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ box_config_popular_user.lua рдореЗрдВ, рдирд┐рдореНрди рдорд╛рди рд░рдЦреЗрдВ:

 map_type_score={user_page=100} --      increase_score,  ,  ,         increase_score box_pu_default={count_users=10;score_day=30} -- -    get_top  -        , . 


Box_popular_user.lua рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ:
 dofile("box_config_popular_user.lua") 


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

рдЕрдм рдЖрдЗрдП рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджреЗрдЦреЗрдВред

рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░реНрд▓ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдХреБрдЫ рд▓реЙрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред

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

рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ DR :: Tarantool рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реНрдХреИрди рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЖрдкрдХреЗ рдкрд╕рдВрджреАрджрд╛ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ yum, apt, ... рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 use strict; use DR::Tarantool ':constant', 'tarantool'; my $client = tarantool host => 'localhost', port => 33013, spaces => { 0 => { name => 'user_score', default_type => 'NUM', fields => [ qw(id fid score last_update koef), ], indexes => { 0 => { name => 'idx_id_fid', fields => [ 'id', 'fid' ] }, 1 => { name => 'idx_id', fields => [ 'id' ] }, 2 => { name => 'idx_id_score', fields => [ 'id', 'score' ] }, } }, 1 => { name => 'user_last_update', default_type => 'NUM', fields => [ qw(id last_update), ], indexes => { 0 => { name => 'idx_id', fields => [ 'id' ] }, } }, }; while(<>){ my $line = $_; my @params = split( " ", $line); $client->call_lua($params[0], @params[1..$#params],($params[0] eq 'increase_score' ? ('user_page') : ()); }; 




рдпрд╣рд╛рдБ рдПрдХ рдРрд╕реА рдЫреЛрдЯреА рд╕реА рд▓рд┐рдкрд┐ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рд╡рд░реНрдгрди рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрдЧрд╣ рдШрд┐рд░реА рд╣реБрдИ рд╣реИ, рдпрд╣ рдПрдХ рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рдЧреНрд░реЗрдлрд╛рдЗрдЯ рдореЗрдВ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реВрддреНрд░ рдореЗрдВ рдореБрдЭреЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд▓рдЧрднрдЧ 3,500 рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реБрдПред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдиреЗ рд▓рдЧрднрдЧ 17% CPU рд╣реА рдЦрд╛рдпрд╛ред рдЖрдЗрдП 4 рдереНрд░реЗрдб рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред



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

рдХрд╛рд░реНрдпрд╡рд╛рд╣реА рдХреЗ рджреМрд░рд╛рди, рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдХрд╣рд╛рдВ-рдХрд╣рд╛рдВ рдзреБрдВрдзрд▓рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб рдореЗрдВ DR :: рдЯрд╛рд░реЗрдВрдЯреВрд▓ рднреА AnyEvent рдФрд░, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ AE :: io рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ , рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреБрдЫ рджреЗрд░реА рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛рдИ рд╕реЗ, рдореИрдВрдиреЗ рдЦреБрджрд╛рдИ рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд▓рд╛рдЗрдВрдЯ :: рдЯрд╛рд░реЗрдВрдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рдЖрд░рдВрдн рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПред

 use Client::Tarantool; my $client = Client::Tarantool->new... 


рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧреНрд░рд╛рдл рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ 1 рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, 100% рд╕реАрдкреАрдпреВ рдкрд░ рдЖрд░рд╛рдо рдХрд┐рдпрд╛, рдлрд┐рд░ рдЗрд╕реЗ 3 рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ 100% рд╕реАрдкреАрдпреВ рдореЗрдВ рднреА рдЖрд░рд╛рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░, рдЬреЛ рдмрд╣реБрдд рд╣реА рдордирднрд╛рд╡рди рдерд╛, рдпрд╣ рдерд╛ рдХрд┐ рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рдереА! рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ 4 рдзрд╛рдЧреЗ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ 100% рд╕реАрдкреАрдпреВ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред рдХреБрд▓ рдпрд╣ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 18-20K рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдХрд▓рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдЪрд╡реАрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рдереА, рдФрд░, рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рд░ рдЧрдИ рдФрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХреА рдЧрдИ, рд╢реЗрд╖ 18-20K рдХреЗ рд╕реНрддрд░ рдкрд░ред

рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ AnyEvent рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╢реБрджреНрдз syswrite рдФрд░ sysread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ "рдЕрддрд┐рд░рд┐рдХреНрдд" AE :: io рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред

рдЦреИрд░, рдЕрдВрдд рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо DR :: Tarantool :: AsyncClient рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗред

 #!/usr/bin/perl use strict; use DR::Tarantool::AsyncClient 'tarantool'; use AnyEvent; use AnyEvent::Handle; my $cv = condvar AnyEvent; my $counts = {}; my $hdl; my $w; my $client; #        my $done_sub = sub { $counts->{ae}--; $cv->send unless $counts->{ae}; }; #      my $read_line_sub = sub { my $line = shift; my @params = split( " ", $line); $counts->{ae}++; $counts->{$params[0]}++; $client->call_lua($params[0], [@params[1..$#params],($params[0] eq 'increase_score' ? ('user_page') : ())], $done_sub); }; my $limit_concur_req = 12000; #  -   DR::Tarantool::AsyncClient->connect( host => '127.0.0.1', port => 33013, spaces => { 0 => { name => 'user_score', default_type => 'NUM', fields => [ qw(id fid score last_update koef), ], indexes => { 0 => { name => 'idx_id_fid', fields => [ 'id', 'fid' ] }, 1 => { name => 'idx_id', fields => [ 'id' ] }, 2 => { name => 'idx_id_score', fields => [ 'id', 'score' ] }, } }, 1 => { name => 'user_last_update', default_type => 'NUM', fields => [ qw(id last_update), ], indexes => { 0 => { name => 'idx_id', fields => [ 'id' ] }, } }, }, sub { ($client) = @_; $counts->{ae}++; $hdl = new AnyEvent::Handle fh => \*STDIN, on_error => sub { #     my ($hdl, $fatal, $msg) = @_; AE::log error => $msg; $hdl->destroy; $cv->send; }, on_eof => $done_sub; my @start_request; #        @start_request = (line => sub { my ($hdl, $line) = @_; $line =~ s/[\r\n]//g; $read_line_sub->($line) if $line; #       -      $hdl->push_read (@start_request) if $counts->{ae} < $limit_concur_req; }); $w = AnyEvent->timer (after => 0, interval => 1, cb => sub{ #             $limit_concur_req += 1000 if $counts->{ae} < 1000; $hdl->push_read (@start_request) if $counts->{ae} < $limit_concur_req; }); } ); $cv->recv; 


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



рдФрд░ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ 7 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ! рдФрд░ рджреВрд╕рд░реЗ рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд▓рдЧрднрдЧ 2 рдмрд╛рд░ред рдпрд╣ рд▓рдЧрднрдЧ 30,000 рдкреНрд░рд╢реНрди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЯрд╛рд░реЗрдВрдЯрдпреБрд▓рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реА рдореЛрддреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рдЧрднрдЧ 100% рд╕реАрдкреАрдпреВ рдХреА рд╕реАрдорд╛ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ

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



рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдФрд╕рддрди, рд╣рдореЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд▓рдЧрднрдЧ 20,000 рдЕрдиреБрд░реЛрдз рдорд┐рд▓рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рдкреНрд░рд╕рд╛рд░ рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╡рд╛рд▓реЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдкрд░ рдЖрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рдореЗрдВ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╡рд╛рд▓реЗ рдЦрд┐рд▓рд╛рдбрд╝реАред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдореЗрдВ рдПрдХ рдмреЙрдХреНрд╕ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ 30,000 рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб (20,000 рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рджреА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ) рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред

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


All Articles