2

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

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

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

4

3 回答 3

4

我在 Heroku 上使用AMQP取得了很大的成功。有一个可用的 heroku 插件(CloudAMQP)和对 AMQP 的良好 ruby​​ 支持

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

于 2013-01-10T23:24:44.047 回答
1

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

于 2013-01-12T02:13:01.083 回答
0

如果每个应用程序都有自己的 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 })
于 2014-12-22T22:18:55.097 回答