рд╕рднреА рдХреЛ рдмрдзрд╛рдИ! рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕
рдирдЧреАрдиреЗрдХреНрд╕ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ
рдирдЧрдиреЗрдХреНрд╕ рдкреБрд╢ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдмрд╣реБрддреЛрдВ рдиреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рдпрд╛, рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ред
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрд╛рд░реНрдп Nginx рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ
рдзреВрдордХреЗрддреБ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛
рд╣реИ ред
рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рд╣реИ:
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреГрд╖реНрда ,
рдмреЗрд╕рд┐рдХ HTTP рдкреБрд╢ рд░рд┐рд▓реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди, рд╕рд╛рде рд╣реА рдХрдИ рд▓реЗрдЦ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
Nginx рдФрд░ рдзреВрдордХреЗрддреБ: рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛ рд╕рд░реНрд╡рд░ рдкреБрд╢, рдЕрдЪреНрдЫреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рдореИрдиреБрдЕрд▓ рдХреЗрд╡рд▓ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХрд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдореВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреА рдорд╣рд╛рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореЙрдбреНрдпреВрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд▓рдЪреАрд▓рд╛ рдЪреИрдирд▓ рдкреНрд░рдмрдВрдзрди рдФрд░ рдЙрдирдХреА рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЪреИрдирд▓реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреВрдВрдЧрд╛ред
рдХрд╛рд░реНрдп
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
- рдПрдХ рдирдпрд╛ рдЪреИрдирд▓ рдмрдирд╛рдирд╛
- рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░рдирд╛
- рдЪреИрдирд▓ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ
- рдЪреИрдирд▓ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛
- рд╕рднреА рдЪреИрдирд▓реЛрдВ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛
рдирддреАрдЬрддрди, рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЪреИрдирд▓ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП)ред
рдирдЧреНрдиреЗрдХреНрд╕ рдкреБрд╢ рдореЙрдбреНрдпреВрд▓ - рд╕реБрд░рдХреНрд╖рд┐рдд
Nginx Push Module рд╣рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nginx config рдореЗрдВ
рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛:
- push_authorized_channels_only [рдкрд░ | рдмрдВрдж]
рдСрди - рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╣реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреИрдирд▓ рдХреЛ рд╕реБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ (рдкреНрд░рдХрд╛рд╢рдХ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдпрд╛ рдкреАрдпреВрдЯреА рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛)ред рдЕрдиреНрдпрдерд╛, рдЬрдм рдЖрдк рдмрдВрдж рдЪреИрдирд▓ рдХреЛ рд╕реБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 403 рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред
рдмрдВрдж - рдЧреНрд░рд╛рд╣рдХ рдмрдВрдж рдЪреИрдирд▓ рдХреЛ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
- push_max_channel_subscribers [рд╕рдВрдЦреНрдпрд╛]
рд╕рдорд╡рд░реНрддреА рдЪреИрдирд▓ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рддреЛ, рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдирд╛рдо рджреЗрдВ - рдЪреИрдирд▓ред рд╣рдо рдЗрд╕реЗ рд░реВрдмреА рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ (рд░реЗрд▓ рдореЗрдВ рдЫреЛрдЯреЗ рдЖрд╡реЗрд╖рдг рднреА рд▓рдЧреЗрдВрдЧреЗ)ред
рдЪреИрдирд▓реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (
рдмреЗрд╕рд┐рдХ 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=
рдЕрдиреБрд░реЛрдз рдкрд░ рдЪреИрдирд▓ рдЦреЛрд▓рдиреЗ:
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")