当用户多次打开SSE时,我的服务器会卡住,
因为看起来Redis在SSE上有一些错误。
即使客户关闭浏览器或转到另一个页面,流也不会被关闭。
顺便说一下,我不知道
的时间 logger.info "Stream closed"
logger.info "Client disconnected"
会被调用吗? (当我关闭浏览器时不会调用它)
是否有一些解决方法可以避免此问题?
def new_prizes_stream
# http://ngauthier.com/2013/02/rails-4-sse-notify-listen.html
begin
response.headers.delete('Content-Length')
response.headers['Cache-Control'] = 'no-cache'
response.headers['Content-Type'] = 'text/event-stream'
logger.info "New stream starting, connecting to redis"
redis = Redis.new
redis.subscribe('messages.create', 'heartbeat') do |on|
on.message do |event, data|
if event == 'messages.create'
response.stream.write "event: #{event}\n"
response.stream.write "data: #{data}\n\n"
elsif event == 'heartbeat'
response.stream.write("event: heartbeat\ndata: heartbeat\n\n")
end
end
end
rescue IOError
logger.info "Stream closed"
rescue ActionController::Live::ClientDisconnected
logger.info "Client disconnected"
ensure
ap "close a live stream"
redis.quit
response.stream.close
end
end
答案 0 :(得分:0)
我的建议是,您不要在每个请求/ SSE上创建连接,并对结果进行基准测试。每次执行:
redis = Redis.new
如果你可以创建连接(单件或工厂模式),而不是运行它,你会改为:
redis = myPoolObj.getRedisConnection()
然后,您可以决定要在该池上执行的操作以及要使用的连接数。我在redis-db检查了文档,但是我没有看到内置的API,就像我在检查python时看到的那样。
您可以在回购中打开一个问题,询问是否有内置的方法来执行此操作而不管理您自己的池。
这有帮助吗?