ruby-on-rails Sidekiq服务器进程如何从Redis的队列中拉取作业?

pinkon5k  于 2023-02-10  发布在  Ruby
关注(0)|答案(2)|浏览(186)

我有两个Rails应用程序运行在两个不同的示例上(比如Server1Server2),但它们具有相似的代码并共享相同的Postgresql DB。
我安装了Sidekiq并从两个服务器推送Queue中的作业,但我只在Server1中运行Sidekiq进程。
我有一个Redis服务器,它运行在与Server2共享Redis的Server1上。
如果一个作业从Server2推送,它将在Server1的Sidekiq进程中处理,这就是我真正想要的。
我的问题是

    • Server1上的Sidekiq进程是如何知道一个作业被推送到Redis的?*
    • Sidekiq进程是否持续检查Redis服务器上是否有新作业,或者Redis服务器是否向Sidekiq进程通知新作业?*

我对此感到困惑和惊讶!
有人能澄清一下Sidekiq从Redis服务器获取作业的过程吗?
对像我这样的新手会有帮助的。

kmbjn2e3

kmbjn2e31#

Sidekiq使用名为BRPOP的redis命令。
这个命令从一个列表(你的作业队列)中获取一个元素。如果列表是空的,它会等待元素出现,然后弹出/返回它。这个命令也适用于同时处理多个队列。
所以,sidekiq不会轮询redis,redis也不会向sidekiq推送通知。

kzmpq1sx

kzmpq1sx2#

Sidekiq使用轮询机制来检查Redis中的新作业,默认的轮询间隔设置为5秒,可以在lib/sidekiq/config.rb [link]的配置文件中进行调整。

# lib/sidekiq/config.rb
average_scheduled_poll_interval: 5

顺便说一下,作业以列表形式存储在Redis中,Sidekiq使用BRPOP(Blocking Right Pop)命令来检索作业,以避免任何争用情况,这确保了运行在不同示例上的多个Sidekiq进程能够以协调的方式检索作业。

相关问题