perform_async 无法在 sidekiq 中工作
perform_async not working in sidekiq
我正在尝试使用 sidekiq 在后台处理一些请求(它与 padrino 框架集成)。
我的期望是,一旦工作人员被调用,请求处理程序将 return 立即答复用户。
为了确保它正常工作,我实现了一个 worker,它会打印一些消息并在完成处理之前休眠大约 44 秒(以模拟后台的长时间处理)。
令我惊讶的是,请求一直卡在工作人员完成工作之前。只有在那之后,请求处理程序才能 return 回答用户。
起初我认为睡眠函数可能是问题所在,所以我将睡眠函数替换为忙碌的一段时间,但我有相同的行为:请求处理程序挂起,直到工作人员完成其任务。
知道为什么会这样吗?
您可以看到以下内容:
请求处理程序:
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
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
redis 服务器是运行:
ps -ef | grep redis
returns
redis 1232 1 0 16:54 ? 00:00:09 /usr/bin/redis-server 127.0.0.1:6379
以及 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}
此外,从我放入 worker 的日志中我们可以看到客户端显然已连接到 redis:
INFO - redis location: [127.0.0.1:6379]
INFO - connected clients: [3]
sidekiq版本:3.3.4
Redis 服务器:2.8.4
ruby: 2.1.2p95
注意:我在我的 padrino 上安装了 sidekiq web 工具,它在 worker 执行之前和之后的所有统计信息(已处理、失败、忙碌、排队、重试、计划、死亡)都显示为 0。
示例工程可以从这里下载:https://github.com/plicatibu/sidekiq-problem.git
好吧,我发现了你的错误,在你的 boot.rb
文件中你有这一行:
require 'sidekiq/testing/inline' if RACK_ENV == 'development'
这段代码使用了 Sidekiq 的测试框架,它绕过了 redis 并几乎像 ruby class 一样运行它(即它永远不会在 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
这是在后台处理该作业的 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 -
我正在尝试使用 sidekiq 在后台处理一些请求(它与 padrino 框架集成)。
我的期望是,一旦工作人员被调用,请求处理程序将 return 立即答复用户。
为了确保它正常工作,我实现了一个 worker,它会打印一些消息并在完成处理之前休眠大约 44 秒(以模拟后台的长时间处理)。
令我惊讶的是,请求一直卡在工作人员完成工作之前。只有在那之后,请求处理程序才能 return 回答用户。
起初我认为睡眠函数可能是问题所在,所以我将睡眠函数替换为忙碌的一段时间,但我有相同的行为:请求处理程序挂起,直到工作人员完成其任务。
知道为什么会这样吗?
您可以看到以下内容:
请求处理程序:
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
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
redis 服务器是运行:
ps -ef | grep redis
returns
redis 1232 1 0 16:54 ? 00:00:09 /usr/bin/redis-server 127.0.0.1:6379
以及 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}
此外,从我放入 worker 的日志中我们可以看到客户端显然已连接到 redis:
INFO - redis location: [127.0.0.1:6379]
INFO - connected clients: [3]
sidekiq版本:3.3.4 Redis 服务器:2.8.4 ruby: 2.1.2p95
注意:我在我的 padrino 上安装了 sidekiq web 工具,它在 worker 执行之前和之后的所有统计信息(已处理、失败、忙碌、排队、重试、计划、死亡)都显示为 0。
示例工程可以从这里下载:https://github.com/plicatibu/sidekiq-problem.git
好吧,我发现了你的错误,在你的 boot.rb
文件中你有这一行:
require 'sidekiq/testing/inline' if RACK_ENV == 'development'
这段代码使用了 Sidekiq 的测试框架,它绕过了 redis 并几乎像 ruby class 一样运行它(即它永远不会在 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
这是在后台处理该作业的 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 -