【发布时间】:2011-12-20 04:56:39
【问题描述】:
我有以下 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 接收其他用户发布到 feed 的事件,然后使用 sinatra 流 api 发送这些事件。 问题是,当浏览器重新连接到 feed 时,redis 客户端保持连接,并且不断接收事件,因此 redis 服务器充满了无用的连接。 broser 关闭与 Web 服务器的连接后,如何关闭所有这些连接?
【问题讨论】:
-
你有没有想过这个问题?我在 Rails 中遇到了类似的问题,并且有posted a similar question。这个问题包括一个潜在的解决方案,它确实有效但非常愚蠢。
标签: ruby sinatra redis publish-subscribe