Ruby 数据库池赛璐珞ZMQ vs赛璐珞vs线程

Ruby 数据库池赛璐珞ZMQ vs赛璐珞vs线程,ruby,multithreading,postgresql,activerecord,celluloid,Ruby,Multithreading,Postgresql,Activerecord,Celluloid,我看到了一些奇怪的问题,我试图理解,这个问题的第一部分是试图理解数据库池在赛璐珞和赛璐珞/ZMQ中是如何工作的 数据库池 1) 线。 注意,我正在输出线程使用的连接id。 O/p O/p 接收方(又称服务器) 现在,有趣的部分。执行此命令时 我看到以下输出 {"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280 <- connection id {"version"=>"PostgreSQL 9.4.5 ..."} -

我看到了一些奇怪的问题,我试图理解,这个问题的第一部分是试图理解数据库池在赛璐珞和赛璐珞/ZMQ中是如何工作的

数据库池

1) 线。 注意,我正在输出线程使用的
连接id
。 O/p

O/p

  • 接收方(又称服务器)
现在,有趣的部分。执行此命令时

我看到以下输出

{"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
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280“PostgreSQL 9.4.5…”---7029937292280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280
{“版本”=>“PostgreSQL 9.4.5…”---70299372892280
所有查询都使用相同的连接id

这就是我的问题

为什么
赛璐珞/ZMQ
使用相同的连接id。 理想情况下,它应该为每个
异步
调用使用不同的

,因为一个
接收方
为多个
发送方
实例提供服务。 注意:
Celluloid::ZMQ
示例中的
Sender
不处理记录本身。许多人把它们交给一个接收者。因此,您可以看到连接被
接收器
独占使用,这也是一种有效的行为,如下所示

如果您希望它有所不同,那么您将需要第三种类型的参与者,他们在其生命周期中只处理一个数据库连接。这可能是前两种方法和后一种方法的组合。

因为一个
接收者
正在为许多
发送者
实例提供服务。 注意:
Celluloid::ZMQ
示例中的
Sender
不处理记录本身。许多人把它们交给一个接收者。因此,您可以看到连接被
接收器
独占使用,这也是一种有效的行为,如下所示


如果您希望它有所不同,那么您将需要第三种类型的参与者,他们在其生命周期中只处理一个数据库连接。这是前两种方法和后一种方法的某种组合。

我假设
.async
将使用池中的新连接id,至少这是我在普通赛璐珞示例中看到的。那么,为什么它在赛璐珞/zmq中的行为会不同呢创建连接池时,您的
ActiveRecord
配置代码是什么?不,我没有任何配置代码,我计划使用ActiveRecord::connection<代码>与_连接之前,我无意中发现了上述问题。这突出了我在赛璐珞zmq中使用相同的连接id的
async
可以更详细地解释上述内容,以及为什么每次使用async调用纯赛璐珞时都会创建一个新的连接id,而赛璐珞/zmq async没有假设
。async
至少会使用池中的新连接id这就是我在普通赛璐珞示例中看到的。那么,为什么它在赛璐珞/zmq中的行为会不同呢创建连接池时,您的
ActiveRecord
配置代码是什么?不,我没有任何配置代码,我计划使用ActiveRecord::connection<代码>与_连接之前,我无意中发现了上述问题。这突出了我在赛璐珞zmq中使用相同的连接id的
async
可以更详细地解释上述内容,以及为什么纯赛璐珞每次使用async调用时都会创建一个新的连接id,而赛璐珞/zmq async没有
{"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     ...
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
{"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       ...
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