我有两个Rails应用程序运行在两个不同的示例上(比如Server1
和Server2
),但它们具有相似的代码并共享相同的Postgresql DB。
我安装了Sidekiq并从两个服务器推送Queue中的作业,但我只在Server1
中运行Sidekiq进程。
我有一个Redis服务器,它运行在与Server2共享Redis的Server1上。
如果一个作业从Server2推送,它将在Server1的Sidekiq进程中处理,这就是我真正想要的。
我的问题是
- Server1上的Sidekiq进程是如何知道一个作业被推送到Redis的?*
- Sidekiq进程是否持续检查Redis服务器上是否有新作业,或者Redis服务器是否向Sidekiq进程通知新作业?*
我对此感到困惑和惊讶!
有人能澄清一下Sidekiq从Redis服务器获取作业的过程吗?
对像我这样的新手会有帮助的。
2条答案
按热度按时间kmbjn2e31#
Sidekiq使用名为BRPOP的redis命令。
这个命令从一个列表(你的作业队列)中获取一个元素。如果列表是空的,它会等待元素出现,然后弹出/返回它。这个命令也适用于同时处理多个队列。
所以,sidekiq不会轮询redis,redis也不会向sidekiq推送通知。
kzmpq1sx2#
Sidekiq使用轮询机制来检查Redis中的新作业,默认的轮询间隔设置为5秒,可以在
lib/sidekiq/config.rb
[link]的配置文件中进行调整。顺便说一下,作业以列表形式存储在Redis中,Sidekiq使用BRPOP(Blocking Right Pop)命令来检索作业,以避免任何争用情况,这确保了运行在不同示例上的多个Sidekiq进程能够以协调的方式检索作业。