使用Heroku的应用程序之间共享消息队列

时间:2013-01-10 22:49:47

标签: ruby heroku message-queue sidekiq

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

我的问题是我是否可以在它们之间使用共享消息传递队列,以及这是否是一个好主意,以及Heroku可能的事情?这个用例是否存在附加/服务?列出的大多数排队加载项都将工作人员和任务创建者放在同一个应用程序中。

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

3 个答案:

答案 0 :(得分:4)

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

就Heroku的一般配置服务而言,我一直在主Heroku应用程序中配置插件,并与其他应用程序共享环境配置。

答案 1 :(得分:1)

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

答案 2 :(得分: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 })