小编mro*_*oth的帖子

在Heroku上没有使用Sinatra/Thin检测到HTTP流连接(SSE)客户端断开连接

我正在尝试在Cedar堆栈上部署Sinatra流式SSE响应应用程序.不幸的是,虽然它在开发中完美运行,但是一旦部署到Heroku,callback或者errback在调用连接时永远不会被调用,导致连接池被填满过时的连接(永远不会超时,因为数据仍在服务器上发送给他们侧.)

来自Heroku文档的Relvant信息:

长轮询和流媒体响应

Cedar支持HTTP 1.1功能,例如长轮询和流式响应.应用程序有一个初始的30秒窗口,以单个字节响应客户端.但是,此后发送的每个字节(从客户端接收或由您的应用程序发送)重置滚动55秒窗口.如果在55秒窗口期间没有发送数据,则终止连接.

如果您要发送流响应,例如服务器发送的事件,则需要检测客户端何时挂断,并确保您的应用服务器立即关闭连接.如果服务器保持连接打开55秒而不发送任何数据,您将看到请求超时.

这正是我想要做的 - 检测客户端何时挂断,并立即关闭连接.然而,关于Heroku路由层的一些东西似乎阻止Sinatra像通常那样检测流关闭事件.

一些示例代码可用于复制此代码:

require 'sinatra/base'

class MyApp < Sinatra::Base

  set :path, '/tmp'
  set :environment, 'production'

  def initialize
    @connections = []

    EM::next_tick do
      EM::add_periodic_timer(1) do
        @connections.each do |out|
          out << "connections: " << @connections.count << "\n"
        end
        puts "*** connections: #{@connections.count}"
      end
    end

  end

  get '/' do
    stream(:keep_open) do |out|
      @connections << out
      puts "Stream opened from #{request.ip} (now #{@connections.size} open)"

      out.callback do
        @connections.delete(out)
        puts "Stream closed from #{request.ip} (now …
Run Code Online (Sandbox Code Playgroud)

ruby heroku thin sinatra http-streaming

12
推荐指数
1
解决办法
1515
查看次数

标签 统计

heroku ×1

http-streaming ×1

ruby ×1

sinatra ×1

thin ×1