独角兽服务器工作者配置

Unicorn server worker config

我刚刚在我的新项目代码库中看到了这样的独角兽服务器配置:

worker_processes ENV['UNICORN_WORKERS'].to_i || 2
preload_app true
timeout 30

after_fork do |server, worker|
  Thread.new do
    begin
      RABBIT_CONNECTION = Bunny.new(ENV['AMQP_URL'])
      RABBIT_CONNECTION.start
    rescue Bunny::TCPConnectionFailed => e
      puts "Connection failed"
    end
    begin
      OUTGOING_CHANNEL = RABBIT_CONNECTION.create_channel
    rescue Bunny::PreconditionFailed => e
      puts "Channel-level exception! Code: #{e.channel_close.reply_code},
      message: #{e.channel_close.reply_text}".squish
    ensure
      RABBIT_CONNECTION.close
    end
  end
end

据我所知,unicorn 是一个单线程、多进程的 Web 服务器。

这个 Thread.do 块有什么作用?如果所有这些其他代码没有被包围在 Thread.do 块中,会发生什么情况?

是的 unicorn 是一个 single-threaded, multi-process 网络服务器。 这里,Thread.do 被用来异步连接到 RabbitMQ,使用兔子客户端。即unicorn创建进程后不等待RabbitMQ连接。线程会等待相同的。

在 Unicorn(或 MRI ruby 中)一次只有一个线程可以使用 CPU。这是使用称为 GIL 或全局解释器锁的东西来完成的。

读这个:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil

还有这个:https://en.wikipedia.org/wiki/Global_interpreter_lock

但是,对于等待与 RabbitMQ 服务器的连接等 IO 操作,此线程不会用完 CPU 个周期,而其他线程可以 运行 CPU。

如果 Thread.do 不存在,并且 RabbitMQ 服务器不可访问,进程将等待服务器可用或连接超时。