【问题标题】:Sidekiq async tasks are done synchronouslySidekiq 异步任务同步完成
【发布时间】:2018-06-22 07:29:33
【问题描述】:

我有两个 Sidekiq 工人:

# app/workers/client_worker.rb
class ClientWorker
  include Sidekiq::Worker

  def perform(*args)
    puts "client started\n"
  end
end

# app/workers/server_worker.rb
class ServerWorker
  include Sidekiq::Worker

  def perform(*args)
    i = 0
    loop do
      begin
        i = i + 1
        puts "server waiting"
        sleep(2)
        if i > 5
          break
        end
      rescue => e
      end
    end
  end
end

我有两个 Rails 应用程序,相同的 rails 版本,相同的 ruby​​ 版本,相同的 gems 版本。

rvm use ruby-2.4.2@rails5.2

在全新的 Rails 应用上 当我启动服务器工作者时,紧接着,客户端工作者,我在服务器消息中得到了预期的客户端消息:

2018-06-21T22:44:19.855Z 32364 TID-gn863tph0 ServerWorker JID-7cdd1fd3d6fe63c91d99f3b0 INFO: start
server waiting
server waiting
server waiting
2018-06-21T22:44:24.356Z 32364 TID-gn865q1zk ClientWorker JID-7dc887d6824d0b789afec69d INFO: start
client started
2018-06-21T22:44:24.357Z 32364 TID-gn865q1zk ClientWorker JID-7dc887d6824d0b789afec69d INFO: done: 0.001 sec
server waiting
server waiting
server waiting
2018-06-21T22:44:31.858Z 32364 TID-gn863tph0 ServerWorker JID-7cdd1fd3d6fe63c91d99f3b0 INFO: done: 12.003 sec

在已开发的 Rails 应用上

当我重复这个过程时,任务一个接一个地运行:

2018-06-21T22:41:34.250Z 32247 TID-grdaosqf3 ServerWorker JID-5a2d9917e6575d6858644474 INFO: start
server waiting
server waiting
server waiting
2018-06-21T22:41:38.402Z 32247 TID-grdamch6b ClientWorker JID-5da83582991bf284f6357046 INFO: start
server waiting
server waiting
server waiting
client started
2018-06-21T22:41:46.259Z 32247 TID-grdaosqf3 ServerWorker JID-5a2d9917e6575d6858644474 INFO: done: 12.007 sec
2018-06-21T22:41:46.259Z 32247 TID-grdamch6b ClientWorker JID-5da83582991bf284f6357046 INFO: done: 7.858 sec

我试过的

  • 我已删除旧应用程序中所有已安装的 gem,以便旧 Rails 应用程序 Gemfile 与新应用程序相似。我已删除所有自定义库、所有作业、所有自定义配置
  • 我在两个应用程序上比较了Sidekiq.options,它们是相同的:

    {:queues=>[], :labels=>[], :concurrency=>25, :require=>".", :environment=>nil, :timeout=>8, :poll_interval_average=>nil, :average_scheduled_poll_interval=>5, :error_handlers=>[], :death_handlers=>[], :lifecycle_events=>{:startup=>[], :quiet=>[], :shutdown=>[], :heartbeat=> []}, :dead_max_jobs=>10000, :dead_timeout_in_seconds=>15552000, :reloader=>#}

现在我的想法不多了!谁能建议我找出问题所在的方法?

编辑 好吧,经过长时间的犹豫,我决定在旧应用程序中进行与新应用程序相同的更改,即:在新应用程序中我注意到工人不会自动包含,所以我添加了以下初始化程序:

# config/initializers/01_extensions.rb
Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }

在旧的应用程序中,worker 是自动包含在内的(我真的不知道哪个是默认行为!),所以这个初始化器不是必需的。

但现在当我决定向旧应用程序添加相同的初始化程序时,任务正在按预期异步运行。

现在我有两个问题:

  • 我们是否需要明确包括 sidekiq 工作人员? (文档中未提及)
  • 在 sidekiq 行为中明确包含工人有什么变化?

【问题讨论】:

    标签: sidekiq ruby-on-rails-5.2 ruby-2.4


    【解决方案1】:

    在开发过程中,Rails 5 有效地将您一次只能完成一项工作,即使使用多个线程也是如此。这种全局“执行者”锁允许 Rails 著名的开发重载。

    在生产中,作业将按照您的预期同时执行。

    【讨论】:

    • 但我能够在开发模式下,在一个全新的 Rails 应用程序中同时运行多个作业(前提是我添加了我刚刚在编辑中提到的初始化程序)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多