【问题标题】:How to share worker among two different applications on heroku?如何在heroku上的两个不同应用程序之间共享worker?
【发布时间】:2014-11-12 11:52:27
【问题描述】:

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

请建议,这是否可能?

【问题讨论】:

    标签: ruby-on-rails ruby heroku sidekiq worker


    【解决方案1】:

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

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

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

    请注意,'class' 是一个字符串,因此 SomeWorker 实际上可以在其他应用程序中定义。

    【讨论】:

    • 是的,两个应用程序都指向同一个 redis URL,并且两个应用程序都在将作业添加到队列中,如果我没有在任何一个应用程序上添加工作人员,则无法将作业添加到 redis 服务器处理。
    • @SachinSingh 如果这不是您问题的答案,那么我不明白您的问题是什么。
    • 如何测试作业是否已推送到客户端?
    【解决方案2】:

    使用 3 个不同的 Heroku 应用怎么样?

    1. 用户界面应用程序(用户界面存储库)
      • 网络:捆绑 exec rails 服务器
    2. 管理界面应用程序(管理存储库)
      • 网络:捆绑 exec rails 服务器
    3. 工人(管理存储库)

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

    【讨论】:

      【解决方案3】:

      Mike 的答案仍然是一个安全的选择,尽管必须在任何地方将所有相关的 sidekiq 选项都包含在内,这有点恶心。

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

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

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

      博文的作者重写了一些标准的 Sidekiq 逻辑,从代理类重定向到接收端的非代理类。覆盖 gem 的行为有点冒险,并且它对你的类命名实施了额外的约定。但你也许可以不做那部分而侥幸。

      【讨论】:

      • 截至 2018 年 11 月 15 日,该博文已下线。
      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 2017-11-28
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多