如何在heroku上的两个不同的应用程序之间共享工作者?

我有两个独立的应用程序在heroku上运行并指向相同的数据库,第一个负责user interface ,第二个用于admin interface ,我使用sidekiqredis进行后台作业处理,我添加了一个工作者,我能够分享’ redis-server’通过设置环境变量指向相同的Redis提供Addon,现在我也希望共享worker,因为添加额外的worker会花费两倍。

请建议,这是否可能?

如果两个应用程序使用相同的Redis URL和相同的命名空间,您可以使用相同的Redis配置启动一个工作程序,并且它们将由两者共享。

请注意,您的Sidekiq进程将启动一个应用程序或另一个应用程序。 您的Workers的代码必须在该应用程序中。 另一个应用程序将无法引用代码,但可以使用以下方式推送作业:

 Sidekiq::Client.push('class' => 'SomeWorker', 'args' => [1,2,3]) 

请注意,’class’是一个String,因此SomeWorker实际上可以在另一个app中定义。

如何使用3种不同的heroku应用程序?

  1. 用户界面应用程序 (ui存储库)
    • web:bundle exec rails server
  2. 管理界面应用程序 (管理库)
    • web:bundle exec rails server
  3. 工人 (管理员存储库)
    • worker:bundle exec sidekiq( 文档 )

即使2和3使用相同的代码库,您也可以拥有2个不同的heroku应用程序。 一个启动管理员,一个实际启动sidekiq。 这会解决你的问题吗?

迈克的答案仍然是一个安全的赌注,尽管必须包括所有相关的sidekiq选项inline你排队这个类有点粗略。

这是一篇更详细的博客文章,并提供了第二种方法:

http://coderascal.com/ruby/using-sidekiq-across-different-applications/

基本上,替代方法是在入队应用程序上有一个“代理”类,用于控制sidekiq行为(队列,重试等)。 然后在接收/出队应用程序上将有一个匹配的类名。

博客文章的作者覆盖了一些标准的Sidekiq逻辑,以便从代理类重定向到接收端的非代理类。 覆盖gem的行为有点冒险,它会对类命名强制执行额外的约定。 但是你可能会因为没有做那部分而逃脱。