在Docker上与sidekiq worker分开时钟进程

时间:2015-05-23 19:54:12

标签: ruby-on-rails docker containers sidekiq clockwork

我目前正在努力将我的环境从Heroku移开,部分应用程序运行时钟进程,引发Sidekiq后台工作。

据我所知,Sidekiq由一个客户端组成,该客户端将作业发送到Redis以及一个服务器,该服务器将队列请求拉出并处理它们。我现在正试图将我的应用程序拆分为Docker上的以下容器: - Redis容器 - 时钟容器(使用发条宝石) - 工人容器 - Web应用程序容器(Rails)

但是,我不确定如何分割这个Sidekiq服务器和客户端。本质上,时钟容器需要在其上运行Sidekiq,以便客户端可以每隔一段时间将作业发送到Redis队列。但是,工作容器也应该在它们上运行Sidekiq(服务器),以便它们可以处理作业。我认为分开不同容器之间的责任应该是很有可能的,因为Heroku允许你将它分成不同的dynos。

我可以想象这样做的一种方法是分配时钟容器来拉出一个不存在的队列,这样它就不会从队列中拉出任何作业,然后将worker设置为拉出一个存在的队列。但是,这对我来说似乎不是最优选的方法,因为它仍然会检查这个不存在的队列中的新作业。

有关如何开始讨论此事的任何提示或指南?

1 个答案:

答案 0 :(得分:0)

sidekiq客户端只是将作业发布到redis中。 sidekiq deamon进程只是订阅redis并在发布时启动工作线程。

所以你可以在两个conatainers上安装redis gem:Clock containerWorker Container并仅在Worker Container上启动工作守护程序并为两者提供正确的redis config 。您还必须确保工作源代码在两个服务器/容器上都可用,因为Sidekiq客户端只存储工作类的名称,然后守护程序通过元编程实现它。

但实际上你也可以将sidekiq守护进程与每个需要处理工作的应用程序一起包含在内。是的,每个进程有一个容器的最佳实践,但是imho这不是一个全有或全无的规则。在这种情况下,我将两个过程视为一个整体。它只是在后台运行一些代码的一种方式。然后,您只需将相同应用程序的实例配置为针对相同的sidekiq队列。或者您甚至可以配置每个物理节点再次运行一个单独的队列。