Ruby on Rails Wednesday, October 28, 2015

I need to make realtime updates for all subscribers. After creating new record i need to publish it for all subscribers. 
I found a solution using postgre listen/notify
In controller: 
def index
  response
.headers['Content-Type'] = 'text/event-stream'
  sse
= SSE.new(response.stream)
 
begin
   
Comment.on_change do |data|
      sse
.write(data)
   
end
 
rescue IOError
   
# Client Disconnected
  ensure
    sse
.close
 
end
  render nothing
: true
end

and model
[...]
after_create
:notify_comment_added
[...]
private

def notify_comment_added
 
Comment.connection.execute "NOTIFY comments, 'data'"
end


class << self
 
def on_change
   
Comment.connection.execute "LISTEN comments"
    loop
do
     
Comment.connection.raw_connection.wait_for_notify do |event, pid, comment|
       
yield comment
     
end
   
end
 
ensure
   
Comment.connection.execute "UNLISTEN comments"
 
end
end


Problems are
1) Every listeners occupies a connection to db, and after some clients its reach maximum and i got ActiveRecord timeout
2) it works only with config.cache_classes = true and config.eager_load = true  otherwise servers froze on 1-2nd execution of controller. And its a big pain to restart server after every small change.

Does rails have any another solutions to perform this task? 




--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/0ec03c37-a117-4845-ad10-d02434669043%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment