何时使用-延迟工作与RabbitMQ

时间:2018-12-28 10:19:33

标签: rabbitmq message-queue sidekiq delayed-job task-queue

有人可以给我清楚使用RabbitMQ(消息队列)而不是延迟作业(后台处理)的优点吗?

基本上我想知道何时使用后台处理和消息传递队列?

我的Web应用程序由3个组件组成,一个主服务器将处理所有用户请求,另外2个应用服务器将运行所有后台作业(例如es重新索引,es记录更新,发送电子邮件,客户)。

我看到一些文章说数据库作为队列(延迟的作业)非常糟糕,因为消费者将在数据库中轮询新作业并更新将锁定表的作业状态。然后,兔子MQ或其他消息传递队列如何存储来避免此问题。

对于延迟作业,还有其他替代方法,例如sidekiq,它将在redis而非MySQL上运行。最好使用sidekiq代替Rabbitmq?

和使用sidekiq相比延迟工作有什么优势吗?

3 个答案:

答案 0 :(得分:1)

您有2个工作人员和1个Web服务器:我想您的Web应用程序将一些延迟的工作分派给您的工作人员。因此,您需要一种存储与这些后台作业相关的数据的方法

为此,您既可以使用数据库(例如Redis,这就是sidekick所做的事情),也可以使用消息队列(例如RabbitMQ)。消息队列是专用系统,对于该用例非常有效(允许更高的吞吐量)。数据库将使您有更好的自省(因为您可以请求Jobs表查看您的当前状况),而排队系统将更高效,但也更像黑匣子,并且需要新技能。

如果没有性能问题,越简单越好,即使是简单的mysql数据库也足够。如果您需要功能更强大的系统或需要大量监视,还可以考虑使用专门的托管服务,例如zenaton(我是创始人),它将为您带来所有繁重的工作,包括计划安排或更复杂的服务编排后台工作。

答案 1 :(得分:0)

两者都执行相同的任务,即在后台执行作业,但处理方式有所不同。

对于延迟的作业,人们使用某种数据库进行存储,然后查询作业,然后对其进行处理。设置很简单,但是性能和可伸缩性都不好。

RabbitMQ 或其替代产品 Redis等较难设置,但它们的性能,灵活性和可扩展性非常好,我们正在谈论每秒5000个以上的作业您倾向于使用更少的代码。

答案 2 :(得分:0)

另一个选择是使用任务编排系统,例如Cadence Workflow。它支持延迟执行和排队,但是提供了更高级别的编程模型和无数队列或延迟执行框架的大量功能。

与使用队列进行任务处理相比,Cadence具有许多优势。

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。
  • 内置于分布式CRON

请参见介绍Cadence编程模型的the presentation