使用clojure在Heroku上进行HTTP流式传输/分块响应

时间:2013-08-17 22:45:57

标签: http heroku clojure chunked-encoding http-kit

我正在制作一个使用分块HTTP响应将数据流式传输到客户端的clojure Web应用程序。当我使用foreman在本地运行它时效果很好,但是当我将它部署到Heroku时它无法正常工作。

可以找到展示此行为的最小示例on my github here。前端(在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/

2 个答案:

答案 0 :(得分:1)

这是由于a bug in http-kit即将修复。

答案 1 :(得分:0)

https://devcenter.heroku.com/articles/request-timeout可能是相关的:像你这样的“长轮询”请求必须每55秒发送一次数据或被终止。