我有一个在 Heroku 上运行的 Rails 7 API,带有 Web 和 Worker dyno。前端调用对话创建控制器操作,这会触发工作人员的作业。然后紧接着,frontned 调用conversation_entry create 操作,这会再次触发worker 的作业。
第一个作业在调用操作时立即开始,执行并完成它。尽管控制器操作早已完成,但下一个作业仍需要大约 20 秒才能开始执行。
如何缩短 Sidekiq 接受新工作的时间而不是闲着?
我尝试在 Heroku 上将工作人员规模扩大到 2 个,但这没有帮助。
相关代码如下:
sidekiq.rb
require 'sidekiq'
Sidekiq.configure_client do |config|
config.redis = { :size => 1 }
end
Sidekiq.configure_server do |config|
config.redis = { :size => 12 }
config.average_scheduled_poll_interval = 5
config.concurrency = 5
end
sidekiq.yml
:concurrency: 5
:pidfile: ./tmp/pids/sidekiq.pid
:queues:
- [urgent, 8]
- [high, 5]
- [default, 3]
:production:
url: <%= ENV['REDIS_URL'] %>
pool_size: 12
:development:
:concurrency: 10
:url: redis://localhost:3001/0
看看这个链接:https://github.com/sidekiq/sidekiq/wiki/Active+Job
基准测试显示,Active Job 将作业推送到 Redis 的速度慢 2-20 倍,并且处理开销约为 3 倍(使用 Rails 5.1.4 和 Sidekiq 5.1.1)。与所有基准测试一样,性能可能会因版本而异,YMMV。
所以...解决方法是在 production.rb 中注释此行:
# config.active_job.queue_adapter = :sidekiq
显然,使用 Sidekiq 和 Active Job 会大大减慢速度!