рд░реЗрд▓ рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛ 4 - рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд╛



рд░реЗрд▓ 4.0 рдореЗрдВ, config.threadsafe рд╡рд┐рдХрд▓реНрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛ рдЬрд╛рдПрдЧрд╛! рдФрд░ рдЗрд╕ рдкрд╛рда рдореЗрдВ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдЦрд┐рд░ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред



рд░реЗрд▓ 4 рд╕реВрдХреНрд╖реНрдорддрд╛ рдЪрдХреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА



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

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╛рдордХ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реЗрд▓ 3 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ:

рдЕрдВрддрд┐рдо
$ rails new thready $ cd thready 

рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдирд╛ рдФрд░ рджреЗрдЦрдирд╛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИ:

/config/environments/production.rb
 # Enable threaded mode # config.threadsafe! 

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

 def threadsafe! @preload_frameworks = true @cache_classes = true @dependency_loading = false @allow_concurrency = true self end 


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

рдЪреМрдерд╛ рд╡рд┐рдХрд▓реНрдк, Rack :: Lock рдХреА рдордзреНрдпрд╡рд░реНрддреА рдкрд░рдд рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ allow_concurrency рдХрдЯ рдЬрд╛рддреА рд╣реИред рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рдореЗрдВ рд░реЗрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдкрд░, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реИрдХ :: рд▓реЙрдХ рдЙрди рдкрд╣рд▓реА рдкрд░рддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреА рд╣реИ:

рдЕрдВрддрд┐рдо
 $ rake middleware use ActionDispatch::Static use Rack::Lock #    . 

рдЙрддреНрдкрд╛рджрди рдФрд░ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдереНрд░реЗрдбрд╕реЗрдлрд╝ рд╡рд┐рдХрд▓реНрдк рдЪрд╛рд▓реВ рдХрд░рдирд╛:

 $ rake middleware RAILS_ENV=production 

рдпрд╣ рдкрд░рдд рдЕрдм рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧреАред рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП "рд░реИрдХ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ :: рд▓реЙрдХ рдХрд░реЗрдВ", рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ( рдзреНрдпрд╛рди рджреЗрдВ, рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ ):

/lib/rack/lock.rb
 require 'thread' require 'rack/body_proxy' module Rack class Lock FLAG = 'rack.multithread'.freeze def initialize(app, mutex = Mutex.new) @app, @mutex = app, mutex end def call(env) old, env[FLAG] = env[FLAG], false @mutex.lock response = @app.call(env) response[2] = BodyProxy.new(response[2]) { @mutex.unlock } response rescue Exception @mutex.unlock raise ensure env[FLAG] = old end end end 

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

рдЕрдВрддрд┐рдо
 $ rails g controller foo bar 

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

/app/controllers/foo_controller.rb
 class FooController < ApplicationController def bar sleep 1 render text: "foobar\n" end end 

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

рдЕрдВрддрд┐рдо
 $ curl http://localhost:3000/foo/bar foobar 

рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рд╕рдВрджреЗрд╢ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреВрд╕рд░реА рджреЗрд░реА рд╣реЛ рдЧрдИред рдЕрдм рд╣рдо рдПрдХ рд╕рд╛рде 5 рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП & рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 % repeat 5 (curl http://localhost:3000/foo/bar &) % foobar foobar foobar foobar foobar 

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

рдЕрдВрддрд┐рдо
 % rails s -e production % repeat 5 (curl http://localhost:3000/foo/bar &) 

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

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

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпреВрдирд┐рдХреЙрд░реНрди рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

/ рдЬреЗрдордлрд╛рдЗрд▓
 # Use unicorn as the app server gem 'unicorn' 

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

рдЕрдВрддрд┐рдо
 $ unicorn -E production -p 3000 

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

рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рдиреЛрдЯ: рдереНрд░реЗрдбрд╕реЗрдлрд╝ рд╡рд┐рдХрд▓реНрдк ! рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рддрд░реНрдХ рдХреЛ рдмреЗрд╣рддрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 4 рд░реЗрд▓реЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ рдореЗрдВ рдЕрдкрдирд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

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

/ рдЬреЗрдордлрд╛рдЗрд▓
 # Use unicorn as the app server # gem 'unicorn' gem 'puma' 

рдЕрдм рдЙрддреНрдкрд╛рджрди рдореЛрдб рдореЗрдВ рд╕рд░реНрд╡рд░ рдЪрд▓рд╛рдПрдВ:

рдЕрдВрддрд┐рдо
 $ rails s puma -e production 

рдЪрд▓ рд░рд╣рд╛ рдХрд░реНрд▓ рдЕрдм, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдЖрддреА рд╣реИрдВред

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

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

/app/controllers/foo_controller.rb
 class FooController < ApplicationController @@counter = 0 def bar counter = @@counter sleep 1 counter += 1 @@counter = counter render text: "#{@@counter}\n" end end 


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

рдЕрдВрддрд┐рдо
 $ rails s 

4 рдмрд╛рд░ рдХрд░реНрд▓ рдЪрд▓рд╛рдПрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж 4 рдЕрдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ, рдкреНрд░рддреНрдпреЗрдХ рджреВрд╕рд░реЗ рд╡рд┐рд▓рдВрдм рдХреЗ рд╕рд╛рде:

рдЕрдВрддрд┐рдо
 % repeat 4 (curl http://localhost:3000/foo/bar &) % 1 2 3 4 

рдЕрдм рд╕рд░реНрд╡рд░ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдкреНрдпреВрдорд╛ рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдПрдВ:

рдЕрдВрддрд┐рдо
 $ rails s puma -e production 

рдЙрд╕рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрд▓рдЧ рд╣реЛрдЧрд╛:

рдЕрдВрддрд┐рдо
 % repeat 4 (curl http://localhost:3000/foo/bar &) % 1 1 1 1 

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

/app/controllers/foo_controller.rb
 class FooController < ApplicationController @@counter = 0 @@mutex = Mutex.new def bar @@mutex.synchronize do counter = @@counter sleep 1 counter += 1 @@counter = counter end render text: "#{@@counter}" end end 

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

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

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

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

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

/app/controllers/foo_controller.rb
 def bar #@@mutex.synchronize do counter = @@counter sleep 1 counter += 1 @@counter = counter #end render text: "#{@@counter}\n" end 


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

рдкреВрд▓ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ 15 рддрдХ рдмрдврд╝рд╛рдХрд░, рдЖрдк рдкрд┐рдЫрд▓реЗ рдХрд░реНрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рджреЛрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реЛрдВрдЧреЗред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд▓реЗрдЦрдХ рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреЗрдб рд╕реНрдХреНрд░реЗрдВрд╕реНрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ)ред рдХреГрдкрдпрд╛ рдкреАрдПрдо рдореЗрдВ рд╕рднреА рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВред



рдЖрд╡реЗрджрди



рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ !

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


All Articles