我正在制作一个使用分块 HTTP 响应将数据流式传输到客户端的 clojure Web 应用程序。当我使用 本地运行它时,这很好用foreman
,但是当我将它部署到 Heroku 时它不能正常工作。
可以在我的 github 上找到展示此行为的最小示例。前端(in resources/index.html
)执行 AJAX GET 请求并在响应块到达时打印它们。服务器每秒使用 http-kit 向连接的客户端发送一个新块。按照设计,HTTP 请求永远不会完成。
当相同的代码部署到 Heroku 时,HTTP 连接在发送第一个块后立即被服务器关闭。似乎是 Heroku 的路由网格导致了这种断开连接。
这也可以通过使用 curl 执行 GET 请求来看到:
$ curl -v http://arcane-headland-2284.herokuapp.com/stream
* About to connect() to arcane-headland-2284.herokuapp.com port 80 (#0)
* Trying 54.243.166.168...
* Adding handle: conn: 0x6c3be0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x6c3be0) send_pipe: 1, recv_pipe: 0
* Connected to arcane-headland-2284.herokuapp.com (54.243.166.168) port 80 (#0)
> GET /stream HTTP/1.1
> User-Agent: curl/7.31.0
> Host: arcane-headland-2284.herokuapp.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Date: Sat, 17 Aug 2013 16:57:24 GMT
* Server http-kit is not blacklisted
< Server: http-kit
< transfer-encoding: chunked
< Connection: keep-alive
<
* transfer closed with outstanding read data remaining
* Closing connection 0
curl: (18) transfer closed with outstanding read data remaining
The time is currently Sat Aug 17 16:57:24 UTC 2013 <-- this is the first chunk
任何人都可以提出为什么会这样吗?Heroku 的 Cedar 堆栈应该支持 HTTP 流。代码使用正确运行的事实foreman
表明它是 Heroku 的路由网格中的某些东西导致它中断。
失败项目的现场演示:http: //arcane-headland-2284.herokuapp.com/