perform_async在sidekiq中不起作用

Mar*_*ira 3 ruby sidekiq

我正在尝试使用sidekiq在后台处理一些请求(已与padrino框架集成)。

我的期望是,一旦调用了工作程序,请求处理程序就会立即将答案返回给用户。

为了确保它正常工作,我实现了一个工作程序,该工作程序会在处理完成之前打印一些消息并休眠约44秒钟(以模拟在后台进行长时间处理)。

令我惊讶的是,直到工人完成工作之前,该请求都被搁置了。只有在那之后,请求处理程序才能向用户返回答案。

起初,我以为睡眠功能可能是个问题,所以我忙了一段时间取代了睡眠功能,但是我的行为却是一样的:请求处理程序被挂起,直到工作人员完成任务为止。

知道为什么会这样吗?

您可以看到以下内容:

请求处理程序:

get :hardworker, map: '/hardworker' do
  logger.info "I'll call HardWorker"
  HardWorker.perform_async(44)
  logger.info "HardWorker was called"
  return "The job should still be running in background."
end
Run Code Online (Sandbox Code Playgroud)

Sidekiq工作人员:

class HardWorker
  include Sidekiq::Worker

  def perform(count)

    logger.info "Doing hard work"
    Sidekiq.redis { |c| logger.info "redis location: [#{c.client.location }]" }

    redis_info = Sidekiq.redis { |conn| conn.info }
    logger.info "connected clients: [#{redis_info['connected_clients']}]"

    sleep count

    logger.info "hard work was done"
  end
end
Run Code Online (Sandbox Code Playgroud)

Redis服务器正在运行:

ps -ef | grep redis
Run Code Online (Sandbox Code Playgroud)

退货

redis     1232     1  0 16:54 ?        00:00:09 /usr/bin/redis-server 127.0.0.1:6379
Run Code Online (Sandbox Code Playgroud)

以及sidekiq服务器:

bundle exec sidekiq -r ./config/boot.rb -v
2015-06-06T20:31:26.207Z 3343 TID-8614g INFO: Booting Sidekiq 3.3.4 with redis options {:url=>"redis://127.0.0.1:6379/0", :concurrency=>25}
Run Code Online (Sandbox Code Playgroud)

此外,从我放入工作器中的日志中,我们可以看到客户端显然已连接到redis:

INFO -  redis location: [127.0.0.1:6379]
INFO -  connected clients: [3]
Run Code Online (Sandbox Code Playgroud)

sidekiq版本:3.3.4 Redis服务器:2.8.4 ruby​​:2.1.2p95

注意:我在padrino上安装了sidekiq Web工具,并且在工作人员执行之前和执行之后,所有状态(处理,失败,忙碌,入队,重试,计划,已死)的状态均显示为0。

可以从此处下载示例项目:https : //github.com/plicatibu/sidekiq-problem.git

Ant*_*ony 5

好吧,我找到了您的错误,在您的boot.rb文件中,您有以下这一行:

require 'sidekiq/testing/inline' if RACK_ENV == 'development'
Run Code Online (Sandbox Code Playgroud)

这段代码使用了Sidekiq的Testing框架,该框架绕过redis并几乎像是ruby类一样运行它(即,它从未在redis上排队)。删除该行,仅在测试套件中使用它(如果需要)。

您还需要从YML文件中删除该pid文件,不需要它,如果这样做,则可能仅用于生产。我的2cents-删除它。

一旦这样做,您就可以开始:

这是您对/ hardworker的获取请求的总结:

[2015-06-07 07:54:25] INFO  WEBrick 1.3.1
[2015-06-07 07:54:25] INFO  ruby 2.2.2 (2015-04-13) [x86_64-darwin14]
[2015-06-07 07:54:25] INFO  WEBrick::HTTPServer#start: pid=74128 port=9292
   INFO -  I'll call HardWorker
   INFO -  HardWorker was called
  DEBUG -       GET (0.0131s) /hardworker - 200 OK
::1 - - [07/Jun/2015:07:55:32 -0400] "GET /hardworker HTTP/1.1" 200 46 0.0291
Run Code Online (Sandbox Code Playgroud)

这是sidekiq在后台处理该作业:

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
          ss
     sss  sss         ss
     s  sss s   ssss sss   ____  _     _      _    _
     s     sssss ssss     / ___|(_) __| | ___| | _(_) __ _
    s         sss         \___ \| |/ _` |/ _ \ |/ / |/ _` |
    s sssss  s             ___) | | (_| |  __/   <| | (_| |
    ss    s  s            |____/|_|\__,_|\___|_|\_\_|\__, |
    s     s s                                           |_|
          s s
         sss
         sss

   INFO -  Running in ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
   INFO -  See LICENSE and the LGPL-3.0 for licensing details.
   INFO -  Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org/pro
   INFO -  Starting processing, hit Ctrl-C to stop
  DEBUG -
   INFO -
   INFO -  Doing hard work
   INFO -  redis location: [127.0.0.1:6379]
   INFO -  connected clients: [3]
   INFO -  hard work was done
   INFO -
Run Code Online (Sandbox Code Playgroud)