我正在构建一个Rack中间件,该中间件订阅Redis通道并使用Server Sent Events将消息推送到客户端。 Sinatra provides a nice DSL for doing this.我有一个工作的例子,但是,我遇到的问题是,一旦我到达7或8个客户端,性能就会大大降低。在尝试重用请求之间的Redis连接时,我也遇到了“锁定”服务器的问题。如何提高使用Sinatra Server发送事件流时的并发性
我使用Thin来提供应用程序(它使用EventMachine)。我认为Sinatra DSL已经处理了EventMachine的并发性,但也许这是我需要实现的东西?我不想只限于基于EventMachine的服务器(Thin,Rainbows!),以防有人想使用像Puma这样的多线程服务器。我应该怎样做才能提高我的代码的并发性?
require 'redis'
require 'sinatra/base'
class SSE < Sinatra::Base
def send_message(json)
"id: #{Time.now}\n" +
"data: #{json}" +
"\r\n\n"
end
get '/channels/:id/subscribe', provides: 'text/event-stream' do
channel_id = params['id']
stream(:keep_open) do |connection|
Redis.new.subscribe("channels:#{channel_id}") do |on|
on.message do |channel, json|
connection << send_message(json)
end
end
end
end
end
谢谢你的好例子,我解决了很多问题,只有第一次连接按预期工作。经过研究,我发现Redis.new应该在每个请求中被调用,否则只有首先会被处理。 –