我正在运行一个Ruby on Rails 应用程序,目前使用delayed_job 发送电子邮件。但我想切换到 RabbitMQ 消息队列。我找不到任何有用的资源来开始使用它。我读了很多 RabbitMQ 文档,什么都没有。请让我注意完成这项任务。
3 回答
Rails 的 RabbitMQ 集成严重依赖于 eventmachine 和基于回调的代码。这将使您的代码变得非常复杂,并且您需要让所有代码都知道事件循环。
例如,如果您在 Thin(已经有一个正在运行的事件循环)或 unicorn(您必须在其中实例化反应器并管理其生命周期)之后部署,则不能使用相同的代码。
另一方面,您可以将其抽象为一个实际的作业队列(Resque 已经比 DJ 快得多,Sidekiq 脱裤子,而 Beanstalkd/Stalker 是一个非常好的竞争者),这可能Rails.queue
与导轨 4.
在 Rails 4 中,您还可以选择将所有 ActionMailer 默认配置为异步(从而委托给任何已配置的作业队列)。http://reefpoints.dockyard.com/ruby/2012/06/26/rails-4-sneak-peek-async-actionmailer.html
如果您想用一块石头杀死 2 只鸟,并且您发送电子邮件的需求是基于活动记录生命周期事件(它们几乎总是如此),那么您应该查看我的 gem。
https://github.com/jasonayre/active_pubsub
它建立在 bunny gem 之上,工作起来很像活动记录观察者,除了你在一个单独的进程中运行订阅者。(这实际上只是一个附加功能,其主要目的是允许多个 Rails 应用程序订阅彼此的事件)- IE
#user model
class User < ::ActiveRecord::Base
include ::ActivePubsub::Publishable
publish_as "myapp"
end
#subscriber
class PostSubscriber < ::ActivePubsub::Subscriber
observes "cms"
as "aggregator"
on :created do |user_hash|
user = User.find(user_hash[:id])
#or whatever
WelcomeMailer.deliver(user)
end
end
== 异步交付 + 让你的控制器更苗条。
如果你正在寻找一个很棒的 Ruby 后台作业处理库来代替 delay_job,你应该试试Sidekiq。甚至还有最近的 Railscast 在这里。
您可以在 Knight.io上获得有关背景工作宝石的概述(我创建了这个网站)。