рд░реВрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдЧреНрдиреЗрдХреНрд╕ рдкреБрд╢ рдореЙрдбреНрдпреВрд▓ рдЪреИрдирд▓ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛

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

рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрд╛рд░реНрдп Nginx рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдзреВрдордХреЗрддреБ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ ред

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

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


рдХрд╛рд░реНрдп


рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?


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

рдирдЧреНрдиреЗрдХреНрд╕ рдкреБрд╢ рдореЙрдбреНрдпреВрд▓ - рд╕реБрд░рдХреНрд╖рд┐рдд


Nginx Push Module рд╣рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nginx config рдореЗрдВ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛:


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рддреЛ, рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдирд╛рдо рджреЗрдВ - рдЪреИрдирд▓ред рд╣рдо рдЗрд╕реЗ рд░реВрдмреА рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ (рд░реЗрд▓ рдореЗрдВ рдЫреЛрдЯреЗ рдЖрд╡реЗрд╖рдг рднреА рд▓рдЧреЗрдВрдЧреЗ)ред
рдЪреИрдирд▓реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ( рдмреЗрд╕рд┐рдХ HTTP рдкреБрд╢ рд░рд┐рд▓реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреЗрдЦреЗрдВ ), рд╣рдореЗрдВ рдПрдХ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдкреИрдЯреНрд░рди рдкрд╕рдВрдж рд╣реИред
рдУрдкрди рдЪреИрдирд▓ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдУрдкрди рдУрдкрди рдЪреИрдирд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреИрдирд▓ рдЖрдИрдбреА рдЬрдирд░реЗрдЯ_рдЪреИрдирд▓_рдЖрдИрдбреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдПрдХ рдЪреИрдирд▓ (рдУрдкрди рдореЗрдердб) рдмрдирд╛рдирд╛ PUT рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдмрд┐рдВрджреБ рдкрд░ рднреЗрдЬрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл / рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реИ)ред рдПрдХ рдирдП рдЪреИрдирд▓ (рд╕реНрдерд┐рддрд┐ 200) рдХреЗ рд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рдкрд░, рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рдЖрдИрдбреА рдХреЛ open_channels рдРрд░реЗ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЪреИрдирд▓ (рдХреНрд▓реЛрдЬ рдореЗрдердб) рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DELETE рдЕрдиреБрд░реЛрдз рднреЗрдЬрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪреИрдирд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ (рдореМрдЬреВрдж рд╡рд┐рдзрд┐?) рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GET рдЕрдиреБрд░реЛрдз рднреЗрдЬрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рд░реНрд╡рд░ 200 рд▓реМрдЯрд╛ рд╣реИ, рддреЛ рдЪреИрдирд▓ рдЦреБрд▓рд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, рд╕рд░рдгреА рд╕реЗ рдЪреИрдирд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рдбреЗрдЯрд╛ рдФрд░ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдХрд░ рдЪреИрдирд▓ (рдкреБрд╢ рд╡рд┐рдзрд┐) рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рд╣рдо рдХреЗрд╡рд▓ рдЪреИрдирд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред

рд╕рднреА HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдПрдХ рдЪреИрдирд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдЪреИрдирд▓ рд╣реИ)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рдХрд╛рд╢рди-рдмрд┐рдВрджреБ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдореЙрдбреНрдпреВрд▓ рдХреЛрдб:


module Channel @http_client = Patron::Session.new @http_client.base_url = "http://localhost/publish" @@opened_channels = [] mattr_accessor :opened_channels class << self def open id = generate_channel_id resp = @http_client.put(build_request_for_channel(id), "") if resp.status == 200 opened_channels << id id else false end end def close(id) resp = @http_client.delete(build_request_for_channel(id)) resp.status end def exist?(id) resp = @http_client.get(build_request_for_channel id) if resp.status == 200 true else opened_channels.delete id false end end def push(id, data, content_type) if exist? id puts "pushing to channel with id=#{id}..." resp = @http_client.post(build_request_for_channel(id), data, {"Content-Type" => content_type}) resp.status end end def push_to_all_channels(data, content_type="application/json") opened_channels.each { |c| push(c, data, content_type) } end private def generate_channel_id UUIDTools::UUID.timestamp_create.to_s end def build_request_for_channel(id) "/?channel=#{id}" end end end 


рдЕрдиреБрд░реЛрдз рдкрд░ рдЪреИрдирд▓ рдЦреЛрд▓рдиреЗ:


 def subscribe if channel_id = Channel::open render text: channel_id else render nothing: true, status: 500 end end 


рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:


 user = current_user channel_id = user.channel_id msg = user.messages.last data = msg.to_json(only: [:created_at, :text]) status = Channel::push(channel_id, msg, "application/json") 

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


All Articles