1

我目前正在努力将我的环境从 Heroku 移开,并且我的部分应用程序正在运行一个时钟进程,该进程启动了 Sidekiq 后台作业。

据我了解,Sidekiq 由一个客户端和一个服务器组成,客户端发送作业以排队到 Redis 中,服务器拉出队列的请求并处理它们。我现在正在尝试将我的应用程序拆分为 Docker 上的以下容器: - Redis 容器 - 时钟容器(使用 Clockwork gem) - 工作容器 - Web 应用程序容器(Rails)

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

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

关于我如何开始做这件事的任何提示或指南?

4

1 回答 1

0

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

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

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

于 2015-05-23T20:30:43.300 回答