Ruby 来自Sinatra/Rack应用程序的流式数据
我试图从Ruby(1.9.1p378)Sinatra(1.0)Rack(1.2.1)应用程序中传输文本数据(XML/JSON)。建议的解决方案(例如)似乎不起作用-当我生成某个无限流的元素时(例如从Ruby 来自Sinatra/Rack应用程序的流式数据,ruby,sinatra,rack,Ruby,Sinatra,Rack,我试图从Ruby(1.9.1p378)Sinatra(1.0)Rack(1.2.1)应用程序中传输文本数据(XML/JSON)。建议的解决方案(例如)似乎不起作用-当我生成某个无限流的元素时(例如从%w(foo-bar).cycle)服务器只是阻塞。我尝试了webrick和thin作为服务器 有什么建议吗?我应该使用它吗?如果是,我将如何在我的应用程序中使用它?Webrick和Thin都不支持以这种方式进行流式处理。你可以试试杂种或独角兽。如果你想使用薄的或彩虹!,为了实现流式传输,您必须钩住事
%w(foo-bar).cycle
)服务器只是阻塞。我尝试了webrick
和thin
作为服务器
有什么建议吗?我应该使用它吗?如果是,我将如何在我的应用程序中使用它?Webrick和Thin都不支持以这种方式进行流式处理。你可以试试杂种或独角兽。如果你想使用薄的或彩虹!,为了实现流式传输,您必须钩住事件循环:
require 'sinatra'
class Stream
include EventMachine::Deferrable
def initialize
@counter = 0
end
def each(&block)
if @counter > 10
succeed
else
EM.next_tick do
yield counter
each(&block)
end
end
end
end
get '/' do
Stream.new
end
我最近以这种方式编写了一个EventSource实现:
require 'sinatra'
class EventStream
include EventMachine::Deferrable
def each
count = 0
timer = EventMachine::PeriodicTimer.new(1) do
yield "data: #{count += 1}\n\n"
end
errback { timer.cancel }
end
end
get '/' do
EventMachine.next_tick do
request.env['async.callback'].call [
200, {'Content-Type' => 'text/event-stream'},
EventStream.new ]
end
[-1, {}, []]
end
如果您想使用Webrick进行流媒体:是一个补丁。您一定要看看机架式的。它支持开箱即用。我将其用于firehose样式的流式api Goliath既是一个应用程序服务器,也是一个 轻量级框架旨在满足 以下目标:充分 异步处理、中间件 支持,配置简单, 高性能,而且可以说是最 重要的是,可读性和可维护性 代码
正如Colin提到的,Goliath可以流式传输响应数据,以及传入(大文件上传)。repo中有一个将数据流式传输到客户端的示例:
您可以轻松地连接任何其他数据流以将数据推送到客户端,而不是使用计时器。例如,您可以将AMQP队列或任何其他消息队列直接连接到Goliath,并让它充当该数据的HTTP前端 从Sinatra 1.3开始,您还可以使用新的流式API:
get '/evented' do
stream(:keep_open) do |out|
EventMachine::PeriodicTimer.new(1) { out << "#{Time.now}\n" }
end
end
get'/evented'do
溪流(:保持开放)请勿入内|
EventMachine::PeriodicTimer.new(1){out Thin的优点是能够在流媒体传输时回答其他请求。非常有趣的项目!谢谢提示!goliath已经有社区了吗?整个项目似乎非常前沿,我对一些事情很不确定,比如对分块的支持和回调中请求的识别……T邮件列表是一个很好的起点:-有很多人在观看它。不幸的是,一些正在使用Goliath构建的更有趣的应用程序没有公开,但会随着时间的推移而改变。它是最前沿的。-)Konstantin-这适用于所有web服务器还是像Thin这样的事件web服务器?我有g难以找到使用标准服务器(如Passenger)的新流式API的示例代码…仅适用于事件web服务器(如Thin、Rainbows!或Ebb)-但Puma计划支持此功能。不使用的流式处理:保持打开可在所有服务器上工作,但不会在所有服务器上流式处理(即不在Webrick上).如果你让它保持打开,你怎么能关闭它?也就是说,我想保持它打开,直到我通过管道传输完所有内容,然后关闭。