Ruby on Rails 中的消息队列
Posted
技术标签:
【中文标题】Ruby on Rails 中的消息队列【英文标题】:Message Queues in Ruby on Rails 【发布时间】:2010-10-17 19:17:03 【问题描述】:人们在他们的 Rails 应用程序中使用了哪些消息队列,以及决定选择它的驱动力是什么。最新的 Twitter 对其内部队列 Starling 倒下的宣传是否会影响任何现有的设计决策。
我正在开发一个需要消息队列来处理一些后台任务的应用程序,我并没有做太多这方面的工作,而且我过去看到的大部分内容都是关于 Starling 和 Workling,以及老实说,应用程序不是很大,这个解决方案可能就足够了,但我很想获得集成最佳解决方案的经验,因为我确信我会在某个时候将一个集成到更大的应用程序中。
你会为 Rails 应用推荐什么消息队列???
编辑:感谢您的建议,本周末我将研究其中的一些建议。
再次编辑:我环顾四周,有点不知所措。然而,我打算将 RabbitMQ 与 Workling 集成到我正在构建的应用程序中,然后如果我需要一些关于快速队列的知识,那么我将拥有它并知道它是否符合我的需求。
编辑:找到越来越多适合我的 DJ,如果我在某个网站上“超越”它,我会说 Resque 是我要去的地方。
编辑:(2014 年 12 月)所以自从我问这个问题已经很长时间了,但我看到它仍然得到了一些意见或一些选票,所以我想当涉及到我的选择时,我会更新我的方法后台工作人员。
在我看来,目前在 Ruby 中运行后台作业的最佳方式是使用 Sidekiq。很多人都称赞 Sidekiq 是线程化的工作线程,而不是每个工作线程的进程,它使用的内存比我在 Sidekiq 之前使用的 Resque 之类的内存要少得多。这很好,但对我来说这不是杀手级功能。通过将 Sidetiq 与 Sidekiq 结合使用,作业调度变得如此简单,以至于我切换并从未回头看它,这是迄今为止我使用过的最简单的作业调度,并且让 Sidekiq 使用起来轻而易举。
【问题讨论】:
【参考方案1】:这里有一些 Ruby/Rails 解决方案,根据您的需要,其中一个或多个可能很合适:
http://xph.us/software/beanstalkd
http://rubyforge.org/forum/forum.php?forum_id=19781
http://backgroundrb.rubyforge.org
还有一个来自 Amazon 的托管解决方案,它将为 Ruby/Rails 和更大系统的其他组件之间的共享提供一个很好的队列:
http://aws.amazon.com/sqs
希望这会有所帮助!
【讨论】:
【参考方案2】:来自 github 的 Chris Wanstrath 最近在 SF Ruby 聚会上谈论他们的队列。他们尝试了 Starling、beantalk 和其他一些变体,然后才选择了 Shopify 的 delay_job。他们对背景的使用非常激进。
这是一个blog post from last year,讲述了他们转行 DJ 的故事。
我现在所处的位置我们几年前推出了自己的产品,但我正在从 DJ 那里汲取一些想法来改进处理。
【讨论】:
我现在搬到了延迟工作,这似乎是我正在做的最好的工作,易于设置和使用。推荐。 从那时起,他们搬到了 Resque (github.com/blog/542-introducing-resque)。 Chris 对于延迟工作仍有很多话要说,但 Resque 更好地满足了他们的需求。对我来说,延迟工作还是比较好。【参考方案3】:Rany Keddo 去年在 RailsConf Europe 上就 Starling + Workling 发表了useful presentation。他比较了当时可用的不同解决方案。
Twitter 离开 Starling + Workling 的最新举措可能对常规的 Rails 应用程序意义不大。他们有更多的规模问题,并且可能在他们的数据存储方面存在遗留问题,这些问题阻止他们超越当前的实施。
Beanstalkd 是一个不错的选择,因为它作为守护进程运行并且具有其他脚本语言的包装器(如果您将来碰巧改变方向或有用其他语言编写的不同组件)。
link 还对可用的各种导轨解决方案的优缺点进行了很好的比较。
【讨论】:
【参考方案4】:我使用background_job,它像delayed_job 一样是一个基于数据库的队列。
只要您进出的流量不太多,数据库就会生成一个 OK 队列。
我喜欢background_job(和delayed_job)的原因是它们不需要单独的进程。他们可以通过 cron 运行。对我来说,这至关重要,因为我的消息传递需求甚至比我微薄的系统管理员技能还要简单。
【讨论】:
【参考方案5】:如果您不期望任何繁重的负载,我会推荐 delayed-job 作为一个非常简单的解决方案。优点:易于设置、易于监控、代码简单、没有任何外部依赖项。以前我们使用 ActiveMessaging(带有 ActiveMQ 和 stomp),但它对我们的项目来说有点过头了,所以为了简单起见,我们改用了 delay_job。
无论如何,如果您需要非常成熟和快速的解决方案,ActiveMQ 是一个非常不错的选择。如果您不想花太多时间来维护您并不真正需要的全面消息队列解决方案,那么delayed_job 是一个不错的选择。这是一个good article,关于使用 ActiveMQ 的 Scribd 体验。
【讨论】:
我喜欢delayed_job!非常简单易用!【参考方案6】:您可能想要使用的消息服务器是 RabbitMQ。 Erlang 很酷,AMQP,优秀的 Ruby 库。
http://www.bestechvideos.com/2008/12/09/rabbitmq-an-open-source-messaging-broker-that-just-works
【讨论】:
【参考方案7】:作为更新——GitHub 已移至 Redis 上的 Resque,而不是延迟作业。但是,他们仍然建议对于较小的设置使用延迟作业:
https://github.com/resque/resque
【讨论】:
以上是关于Ruby on Rails 中的消息队列的主要内容,如果未能解决你的问题,请参考以下文章
在Michael Hartl的Ruby on Rails教程中获取错误消息:MicropostsController中的NoMethodError #create,如何避免收到此消息?
Ruby on Rails:运行 rake 命令时出现错误消息
ruby on rails flash 消息 - :alert :error :notice 和 :success?
如何在考拉,Ruby on Rails 中发送私人消息/访问 Facebook 聊天