Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 避免服务器卡在SSE上(服务器发送事件)_Ruby On Rails_Redis - Fatal编程技术网

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

Ruby on rails 避免服务器卡在SSE上(服务器发送事件),ruby-on-rails,redis,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时

因为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

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

redis = Redis.new
如果您可以创建连接单例模式或工厂模式,您可以执行以下操作,而不是运行此模式:

redis = myPoolObj.getRedisConnection()
然后决定要在该池上执行什么操作以及要使用多少连接。我在上查看了文档,但没有看到类似于检查python时看到的内置API

您可以在回购协议上打开一个问题,询问是否有一种内置的方法可以在不管理自己的池的情况下执行此操作

这有用吗