У меня есть следующее приложение sinatra:
require 'sinatra'
require 'redis'
require 'json'
class FeedStream < Sinatra::Application
helpers do
include SessionsHelper
def redis
@redis ||= Redis.connect
end
end
get '/feed', provides: 'text/event-stream' do
stream do |out|
redis.subscribe "feed" do |on|
on.message do |channel, message|
event_data = JSON.parse message
logger.info "received event = #{event_data}"
out << "event: #{event_data['event']}\n"
out << "data: #{{:data => event_data['data'],
:by => current_user}}.to_json\n\n"
end
end
end
end
end
По сути, он получает события, опубликованные другими пользователями, в канал, используя redis pubsub, а затем отправляет эти события с помощью потокового API-интерфейса sinatra.
Проблема заключается в том, что при повторном подключении браузера к каналу клиент redis остается подключенным и продолжает получать события, поэтому сервер redis заполняется бесполезными подключениями.
как я могу закрыть все эти соединения, когда броузер закрывает соединение с веб-сервером?