1

我看到了一些我试图理解的奇怪问题,该问题的第一部分是试图了解数据库池在赛璐珞与赛璐珞/ZMQ 中的工作方式。

数据库池。

1) 螺纹。

 5.times do 
   Thread.new do 
      puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}"
      sleep 5
   end
 end
 sleep

请注意,我正在输出(ting)connection id线程使用的那个。O/p

{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833371600 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833339020 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833290000     ...  
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833282580     ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833251100     ...

如您所见,执行 SQL 语句的每个线程返回不同的连接 ID。SELECT version();

根据我的假设,以上是完全有效的。

2) 赛璐珞

class PlainCelluloid
  include Celluloid

  def run
    puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}"
    sleep 5
  end
end

5.times do 
 Sender.new.async.run
end

O/p

{"version"=>"PostgreSQL 9.4.5 .."} --- 70120202935840  <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120202902760  <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186634700       ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186602720       ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186570720       ...

同样,正如预期的那样,每个赛璐珞演员都会产生一个新的连接 ID。完全有效。

3) 赛璐珞/ZMQ

  • 发件人(又名客户端)
class Sender
  include Celluloid::ZMQ

  def initialize()
   @socket = Socket::Push.new
   @socket.connect('ipc:///tmp/qs11')
  end

  def write
   @socket.send('Hello')
  nil
  end
end
  • 接收器(又名服务器)
     class Receiver

      include Celluloid::ZMQ
      def initialize()
        @socket = Socket::Pull.new
          @socket.bind('ipc:///tmp/qs11')
      end

      def run
       loop do 
        async.handle_message @socket.read
       end    
     end

     def handle_message(message)
       puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}"
       sleep 10
       end
    end

    Receiver.new.async.run

现在,有趣的部分。执行此操作时。

5.times do 
  Sender.new.async.write
end

我看到以下输出。

{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280  <- connection id
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280

所有查询都使用相同的连接 ID。

这就是我的问题...

为什么Celluloid/ZMQ使用相同的连接 ID。理想情况下,它应该为每个async调用使用不同的。

4

1 回答 1

0

因为一个Receiver服务于许多Sender实例。

注意:SenderCelluloid::ZMQ示例中,不处理记录本身​​。许多人将它们交给一个接收者。因此,您会看到独占使用的连接Receiver也是有效的行为,如给定的。

如果您希望它与众不同——您将需要第三种类型的参与者,它在其生命周期中纯粹处理单个数据库连接。那将是您的前两种方法和最后一种方法的组合。

于 2016-04-14T11:58:47.137 回答