【问题标题】:Shared message queues between apps with Heroku使用 Heroku 在应用程序之间共享消息队列
【发布时间】:2012-12-25 11:27:39
【问题描述】:

我有两个 Web 应用程序,都托管在 Heroku 上。一个是前端应用程序,从某种意义上说,所有面向消费者的操作都将通过这个应用程序。新注册等。另一个是后端,它处理新客户、他们的订单和相关业务逻辑的所有处理。我需要这些应用程序相互通信并在它们之间传递数据。我宁愿不在 BE 应用程序上编写 api,因为只有 FE 应用程序会使用它,这意味着我需要花时间编写安全规则和限制以防止其他人访问它。

我的问题是我是否可以在它们之间使用共享消息队列,这是否是个好主意,以及在 Heroku 上是否可行?此用例是否存在附加组件/服务?列出的大多数排队插件在同一个应用程序中都有工作人员和任务创建者。

我一直在将 Sidekiq 视为一种可能性,因为 BE 应用程序无论如何都需要一个队列来处理其他任务,这似乎是一个不错的候选者,但我不确定即使我提供了一个共享的 Redis 实例在应用程序之间,Sidekiq 能够在它们之间传递消息。有人知道吗?

【问题讨论】:

    标签: ruby heroku message-queue sidekiq


    【解决方案1】:

    我在 Heroku 上使用 AMQP 取得了很大成功。对于 AMQP,有一个可用的 heroku 插件 (CloudAMQP) 和 good ruby support

    一般而言,在 Heroku 上提供此类服务时,我一直在 Heroku 主应用程序中提供插件,并与其他应用程序共享环境配置。

    【讨论】:

    • 您是否必须在 Procfile 上为侦听消息的客户端创建另一个 dyno 条目?或者您如何监听应用 B 向 Cloud AMQP 发送的应用 A 上的新消息?
    【解决方案2】:

    Sidekiq 在像您这样的分布式环境中运行良好。由于处理作业所需的所有信息都驻留在 1 台 Redis 服务器中,因此您可以让尽可能多的服务器处理任何类型的作业。

    【讨论】:

      【解决方案3】:

      如果每个应用程序都有自己的 Redis 连接,您可以通过设置另一个连接从一个应用程序推送到另一个 Sidekiq 环境:

      class RemoteWorker
        cattr_writer :client
      
        def self.push(worker_class_name, args, queue = 'default')
          client.push(
            'args' => [args],
            'class' => worker_class_name,
            'queue' => queue,
          )
        end
      
        def self.client
          @@client or raise 'Make sure to set client to Sidekiq::Client'
        end
      end
      

      然后从config/initializers/remote_worker.rb进行配置

      redis_config = YAML.load_file(Rails.root.join('config', 'redis.OTHER.yml'))[Rails.env]
      redis = Redis.new(redis_config)
      RemoteWorker.client = Sidekiq::Client.new(ConnectionPool.new{ redis })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-26
        • 2010-11-06
        • 1970-01-01
        • 2012-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多