当前位置: 首页 > 知识库问答 >
问题:

基于Heroku和clojure的HTTP流式/分块响应

陈志
2023-03-14

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

在我的github上可以找到一个显示这种行为的最小示例。前端(在resources/index.html中)执行AJAX GET请求,并在响应块到达时打印响应块。服务器使用http工具包每秒向连接的客户端发送一个新块。根据设计,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个答案

曹高阳
2023-03-14

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

尉迟默
2023-03-14

这是由于http工具包中的一个bug造成的,该bug将很快修复。

 类似资料:
  • 我想在java中对API的HTTP响应实现重试框架。 如果回答是: 400:将json中的参数设为null,然后重试 202:返回成功 429:请等待2分钟,然后重试 5XX:等待5分钟,然后重试 如果重试次数超过,则抛出异常。是否有任何可用的库支持重试响应类型并允许编辑请求对象?如果没有,我怎么能设计一个?有没有围绕它的教程?

  • 本文向大家介绍基于Redis实现分布式应用限流的方法,包括了基于Redis实现分布式应用限流的方法的使用技巧和注意事项,需要的朋友参考一下 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。 前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实现了一个jedis

  • 来自Haskell,我通常的工作流程是

  • 我试图编写一个龙卷风请求处理程序,它生成异步HTTP请求,并在客户端从异步请求接收数据时将数据返回给客户端。不幸的是,我无法让龙卷风返回任何数据到客户端,直到它的所有异步HTTP请求都完成。 下面是我的请求处理程序的演示。 我希望对这个处理程序的GET请求最初返回文本“some opening”,然后很快为小请求返回“some chunk”,然后为大请求返回“some chunk”(可能多次),最

  • 我想处理的情况下401,403,500等只是状态代码应该返回而不是视图。

  • 配置 在使用range分表函数前先了解 分库分表规则原理及自定义配置,range分表与普通规则基本原理相同,只是配置略有不同。根据range的分库分表与原有的稍有不同,具体的规则的xml格式及在管理平台上配置后最后存储的格式其实如下: <?xml version="1.0" encoding="UTF-8"?> <router-rule> <table-shard-rule table="