Ruby Redis存在同步和PubSub问题



我正在使用Cramp框架与Redis-gem、em synchrony和WebSockets一起构建一个与聊天相关的web应用程序,但遇到了一些问题。

考虑以下代码:

class DrawingAction < Cramp::Action
use_fiber_pool
self.transport = :websocket
on_start :user_joined
on_data :message_received
on_finish :user_left
def user_joined
# Create pub/sub clients for the user who just joined
initialize_pub_sub
end
def initialize_pub_sub
@@redis_client ||= Redis.new(:driver => :synchrony)
@publisher ||= Redis.new(:driver => :synchrony)
@subscriber ||= Redis.new(:driver => :synchrony)
end

def handle_join(join_data)
room_name = join_data[:room_name]
@subscriber.subscribe(room_name) do |on|
on.message do |channel, message|
render message
end
end
puts "fetching history items"
history_items = history_for_room(room_name)
render "{ "history": true, "time:": #{Time.now.to_f}, "data": [#{history_items.join(',')}] }"
end

CCD_ 1是从我的Cramp动作的CCD_,由于cramp支持同步和光纤,在客户端加入通道后,@subscriber.subscribe块像它应该的那样以非阻塞方式运行,这意味着它接受在pubsub通道上获取的消息,并且不会阻塞过程中的所有其他内容(应用程序没有被阻塞),但它不会移动到下一行(puts "fetching history items"),这对我来说是一个主要问题,有人知道如何解决这个问题吗?

我觉得Cramp没有那么有用,可以使用普通的Sinatra,这里有一个例子。考虑将rack-fiber_pool添加到混合物中。Synchrony适配器不能用于相同的目的(示例)。