如何在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,我使用sidekiqredis 进行后台作业处理,我添加了一个工人,我可以通过设置环境变量指向提供插件的相同 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 STM32 微控制器上的两个程序之间共享单段闪存

iOS:在不同设备上的不同应用程序之间共享设置

您可以在不同应用程序之间共享 CloudKit 上的数据吗

如何在不同计算机上的用户之间共享网站上的实时更新?

在不同服务器上的 ReactJS 和 WIX Web 应用程序之间共享会话

如何在两个不同的 Android 应用程序之间共享 SharedPreferences 文件?