【问题标题】:Singleton for sidekiq threads possible?Sidekiq线程的单例可能吗?
【发布时间】:2026-01-04 23:30:01
【问题描述】:

所以我需要能够为每个 Sidekiq 线程创建一个 RabbitMQ 连接和通道,因为如果我不这样做,我会用完 RabbitMQ 连接,而且docs 建议这样做。文档展示了如何使用Unicorn

before_fork do |server, worker|
  $rabbitmq_connection.close if $rabbitmq_connection
end

after_fork do |server, worker|
  # the following is *required* for Rails + "preload_app true",
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection

    $rabbitmq_connection = Bunny.new
    $rabbitmq_connection.start

    $rabbitmq_channel    = $rabbitmq_connection.create_channel
  end
end

是否可以为 Sidekiq 线程做类似的事情? Sidekiq.server_configure 有什么我可以做的吗?看起来this 是 Sidekiq 启动线程的地方,但我看不到要挂接到启动/停止?

【问题讨论】:

    标签: multithreading rabbitmq unicorn sidekiq bunny


    【解决方案1】:

    创建您自己的 RabbitMQ 连接池,详见此处:

    https://github.com/mperham/sidekiq/wiki/Advanced-Options#connection-pooling

    【讨论】:

    • 如果我使用默认的 Sidekiq 并发 25,我是否应该将 ConnectionPool size 设置为 25,即 ConnectionPool.new(size: Sidekiq.options[:concurrency], timeout: 3) { LaGear::Bus.new }
    • 通常是的,除非您出于某种原因想要限制连接。
    • 那么,如果我使用 25 进行并发,Sidekiq 是否会为每个工作线程启动 25 个线程?
    • 我不知道worker 是什么意思。每个进程 25 个线程,是的。
    • 在初始化程序中定义池。两个工人都可以使用它。 25 个线程意味着如果您同时处理 25 个作业,则最多需要 25 个连接。
    最近更新 更多