如何在heroku上的两个不同应用程序之间共享worker?
Posted
技术标签:
【中文标题】如何在heroku上的两个不同应用程序之间共享worker?【英文标题】:How to share worker among two different applications on heroku? 【发布时间】:2014-11-12 11:52:27 【问题描述】:我有两个独立的应用程序在 heroku 上运行并指向同一个数据库,第一个负责user interface
,第二个负责admin interface
,我使用sidekiq
和redis
进行后台作业处理,我添加了一个工人,我可以通过设置环境变量指向提供插件的相同 Redis 来共享“redis-server”,现在我也希望共享工人,因为添加额外的工人将花费两倍。
请建议,这是否可能?
【问题讨论】:
【参考方案1】:如果两个应用程序都使用相同的 Redis URL 和相同的命名空间,您可以使用相同的 Redis 配置启动一个工作程序,它将由两个应用程序共享。
请注意,您的 Sidekiq 进程将启动一个应用程序或另一个。您的工人的代码必须在该应用程序中。其他应用将无法引用代码,但可以使用以下方式推送作业:
Sidekiq::Client.push('class' => 'SomeWorker', 'args' => [1,2,3])
请注意,'class' 是一个字符串,因此 SomeWorker 实际上可以在其他应用程序中定义。
【讨论】:
是的,两个应用程序都指向同一个 redis URL,并且两个应用程序都在将作业添加到队列中,如果我没有在任何一个应用程序上添加工作人员,则无法将作业添加到 redis 服务器处理。 @SachinSingh 如果这不是您问题的答案,那么我不明白您的问题是什么。 如何测试作业是否已推送到客户端?【参考方案2】:使用 3 个不同的 Heroku 应用怎么样?
-
用户界面应用程序(用户界面存储库)
网络:捆绑 exec rails 服务器
管理界面应用程序(管理存储库)
网络:捆绑 exec rails 服务器
工人(管理存储库)
worker:bundle exec sidekiq (documentation)
即使 2 和 3 使用相同的代码库,您也可以拥有 2 个不同的 heroku 应用程序。一个启动管理员,一个实际启动sidekiq。这能解决你的问题吗?
【讨论】:
【参考方案3】:Mike 的答案仍然是一个安全的选择,尽管必须在任何地方将所有相关的 sidekiq 选项都包含在内,这有点恶心。
这是一篇更详细的博文,并提供了第二种方法:
http://coderascal.com/ruby/using-sidekiq-across-different-applications/
基本上,替代方法是在入队应用程序上设置一个“代理”类来控制 sidekiq 行为(排队、重试等)。然后在接收/出队应用程序上会有一个匹配的类名。
博文的作者重写了一些标准的 Sidekiq 逻辑,从代理类重定向到接收端的非代理类。覆盖 gem 的行为有点冒险,并且它对你的类命名实施了额外的约定。但你也许可以不做那部分而侥幸。
【讨论】:
截至 2018 年 11 月 15 日,该博文已下线。以上是关于如何在heroku上的两个不同应用程序之间共享worker?的主要内容,如果未能解决你的问题,请参考以下文章