配置
--
Transfer-Encoding: chunked我无法完成这项工作,也无法找到明确的答案:在上面的配置中,我希望将大量数据流到客户端(在响应中)--这支持吗?
\r\n,0等吗?
write,write,write,flushwrite,write,write,flushclose
self.response_body = Enumerator.new和response.stream.write等--所有测试的结果都类似(通过curl) -- Malformed encoding found in chunked-encoding或transfer closed with outstanding read data remaining有人能给我看看灯吗?
发布于 2018-08-07 05:44:32
行动主计长:实况 API提供了您所描述的内容:response.stream.write和response.stream.close。(write会自动刷新块;如果对您不起作用,则需要自己进行缓冲。)
只要您使用include ActionController::Live (并注意到这会影响整个控制器的行为,而不仅仅是一个操作),那么您就应该能够编写流响应,而无需做进一步的努力:您不需要也不应该设置任何与分块相关的头等。
补充参考:http://tenderlovemaking.com/2012/07/30/is-it-live.html
发布于 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反应器。有关更多详细信息,请参阅这篇博客文章。
https://stackoverflow.com/questions/51714559
复制相似问题