避免服务器卡在SSE上(服务器发送事件)

时间:2015-02-12 23:30:18

标签: ruby-on-rails redis

当用户多次打开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

1 个答案:

答案 0 :(得分:0)

我的建议是,您不要在每个请求/ SSE上创建连接,并对结果进行基准测试。每次执行:

redis = Redis.new

如果你可以创建连接(单件或工厂模式),而不是运行它,你会改为:

redis = myPoolObj.getRedisConnection()

然后,您可以决定要在该池上执行的操作以及要使用的连接数。我在redis-db检查了文档,但是我没有看到内置的API,就像我在检查python时看到的那样。

您可以在回购中打开一个问题,询问是否有内置的方法来执行此操作而不管理您自己的池。

这有帮助吗?