Ruby Redis具有em-synchrony和PubSub问题

时间:2012-10-01 17:30:18

标签: ruby asynchronous redis eventmachine

我正在使用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
从我的Cramp操作的handle_join事件处理程序调用

on_message, 由于cramp支持同步和光纤,在客户端加入通道后,@ subscriber.subscribe块像它应该的那样运行非阻塞,这意味着它接受在pubsub通道上获取的消息,并且不会阻止进程中的其他所有内容(应用程序没有被阻止),但它没有移动到下一行(puts "fetching history items"),这对我来说是一个主要问题,是否有人暗示可以采取哪些措施来纠正这个问题?

1 个答案:

答案 0 :(得分:0)

我没有发现Cramp如此有用,可以使用普通的Sinatra,here就是一个例子。考虑在混合中添加rack-fiber_pool。 Synchrony适配器不能用于相同的目的(example)。