我正在构建一个Rack中间件,订阅Redis频道,并使用服务器发送事件将消息推送到客户端。Sinatra为此提供了一个不错的DSL。我有一个工作示例,但是当我达到7或8个客户端时,性能会显著下降。我在尝试重用请求之间的Redis连接时也遇到了“死锁”服务器的问题。
我正在使用Thin来提供应用程序服务(其底层使用EventMachine)。我认为Sinatra DSL已经处理了事件机制的并发性,但也许这是我需要自己实现的东西?我不想限制自己只使用基于EventMachine的服务器(如Thin、Rainbows!),以防某人想使用多线程服务器,例如Puma。我该怎么做才能增加代码的并发性?
我正在使用Thin来提供应用程序服务(其底层使用EventMachine)。我认为Sinatra DSL已经处理了事件机制的并发性,但也许这是我需要自己实现的东西?我不想限制自己只使用基于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