Нужно чтобы несколько клиентов слушали метод, который отправлял в случае изменения/создания записи, эту самую запись в виде JSON.
Rails 4. бд - postgresql, сервер Puma
В интернете полно бесполезных инструкций где метод отправляет с интервалом что-либо а потом закрывает соединение. Либо пишут middleware/модуль в lib который в обход роутов/контроллеров/авторизации выполняет полезный функционал, но это все выглядит как костыль.
Нашел
что то похожее на то что нужно, но там тоже не все так гладко
Контроллер
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
Метод on_change. Событие из бд тригерится в стандартных калбеках Rails
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
Но сервер после нескольких коннектов повисает где то на этапе ожидания ивента из бд. Пробовал больше воркеров, результат не сильно изменился. Ну и судя по всему он каждый раз держит отдельное соединение с бд в ожидании ивента отчего ActiveRecord временами уходит в таймаут.
В общем вопрос, где почитать/посмотреть "полезную" реализацию sse?