我有两个单独的应用程序在heroku上运行并指向同一个数据库,第一个负责user interface
,第二个负责admin interface
,我使用sidekiq
redis
对于后台作业处理,我添加了一个工作人员,我可以共享“redis-server”#39;通过设置环境变量指向相同的Redis提供Addon,现在我也希望共享worker,因为添加额外的worker会花费两倍。
请建议,这是否可行?
答案 0 :(得分:12)
如果两个应用程序使用相同的Redis URL和相同的命名空间,您可以使用相同的Redis配置启动一个工作线程,并且它们将由两者共享。
请注意,您的Sidekiq进程将启动一个应用程序或另一个应用程序。您的Workers的代码必须在该应用程序中。另一个应用程序将无法引用代码,但可以使用以下方式推送作业:
Sidekiq::Client.push('class' => 'SomeWorker', 'args' => [1,2,3])
请注意,'class'是一个String,因此SomeWorker实际上可以在另一个应用程序中定义。
答案 1 :(得分:0)
如何使用3种不同的heroku应用程序?
即使2和3使用相同的代码库,您也可以拥有2个不同的heroku应用程序。一个启动管理员,一个实际启动sidekiq。这会解决你的问题吗?
答案 2 :(得分:0)
这是一篇更详细的博文,并提供了第二种方法:
http://coderascal.com/ruby/using-sidekiq-across-different-applications/
基本上,替代方法是在排队应用程序上有一个“代理”类来控制sidekiq行为(队列,重试等)。然后在接收/出队应用程序上会有一个匹配的类名。
博客文章的作者覆盖了一些标准的Sidekiq逻辑,以便从代理类重定向到接收端的非代理类。覆盖gem的行为有点冒险,它会对类命名强制执行额外的约定。但是你可能会因为没有做那部分而逃脱。