首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails + Puma +传输-编码:分块响应支持还是不支持?

Rails + Puma +传输-编码:分块响应支持还是不支持?
EN

Stack Overflow用户
提问于 2018-08-06 19:37:15
回答 2查看 2.4K关注 0票数 2

配置

  • Rails: 4.2.7.1
  • 美洲狮: 3.8.2

--

代码语言:javascript
复制
Transfer-Encoding:  chunked

我无法完成这项工作,也无法找到明确的答案:在上面的配置中,我希望将大量数据流到客户端(在响应中)--这支持吗?

  • 如果是,我的责任是什么?
    • 我的控制器应该释放十六进制块大小,\r\n0等吗?

  • 感觉像是我想要的,但是找不到一个简单的响应API,比如:
    • writewritewriteflush
    • writewritewriteflush
    • close

  • 我读过100篇关于Rack,猴子修补和其他疯狂的文章
  • 我读过关于Puma和/或Rack破坏编码的文章,可能是gzip/放气的顺序不对
  • 这似乎是一个简单的特性,应该很容易获得,但我感到很困惑。
  • 我创建了许多测试,例如self.response_body = Enumerator.newresponse.stream.write等--所有测试的结果都类似(通过curl) -- Malformed encoding found in chunked-encodingtransfer closed with outstanding read data remaining

有人能给我看看灯吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-07 05:44:32

行动主计长:实况 API提供了您所描述的内容:response.stream.writeresponse.stream.close。(write会自动刷新块;如果对您不起作用,则需要自己进行缓冲。)

只要您使用include ActionController::Live (并注意到这会影响整个控制器的行为,而不仅仅是一个操作),那么您就应该能够编写流响应,而无需做进一步的努力:您不需要也不应该设置任何与分块相关的头等。

补充参考:http://tenderlovemaking.com/2012/07/30/is-it-live.html

票数 1
EN

Stack Overflow用户

发布于 2018-08-27 23:30:01

@matthewd精彩答案的重要增编:

Rack规范支持通过响应对象上的方法或通过hijack进行流响应。

@matthewd说得对:

ActionController::Live提供了您所描述的.

但是,该实现要么劫持套接字,要么使用each方法使用Rack规范的"hack“。

最好的情况是,实现劫持套接字并在一个新线程上运行它(这是它通常应该做的,AFAIK)。

然而,这可能会导致相当多的线程,而可能会成为堆栈数据(每个线程/客户端1MB-2MB)内存空间中的高性能线程,并且随着创建更多线程,上下文切换变得更加昂贵。

在最坏的情况下,缓慢的each 循环将阻塞服务器的线程,使服务器瘫痪,最终导致DoS情况。

正确的答案应该是不要在单个HTTP请求上流数据--而是使用本机* WebSockets、SSE或AJAX解决方案。

另一种半正确的方法是将所有数据保存到一个临时文件中,并使用服务器发送该文件,该服务器支持Ruby层(如)或代理(如nginx)之外的静态文件流。

*本机:本机WebSocket / SSE解决方案遵循这个劫掠提案,允许服务器处理网络层,而不是运行另一个线程/ IO反应器。有关更多详细信息,请参阅这篇博客文章

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51714559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档