SQS和RabbitMQ


83

我需要创建一个队列进行处理。队列本身的数量相对较少。每小时可能有大约1000次写入。每个任务的执行可能需要大约一分钟,并且几乎在将项目添加到队列后立即进行处理。

有什么理由让我想要实施RabbitMQ而不是像Amazon SQS这样的现成产品吗?为什么应用程序需要其自己的排队系统而不是诸如SQS之类的原因有哪些?


每小时1000次写入是可以的。如果您有时间和足够的知识,则可以自己运行RabbitMq实例,与Amazon SQS服务相比,它也可以节省金钱。对于SQS,它就在那里。这很方便,简单,并且编码起来相当快捷。
宝马

借助SQS,您可以获得Lambda触发器的可扩展性和可伸缩性。
多纳托

Answers:


95

首先,Amazon SQS是伪队列,这意味着可以保证每条消息(如果到达队列)的传递,但不能以通常在队列中发生的FIFO方式传递。

如果消息的顺序对您很重要,并且您希望队列以FIFO方式工作,那么Amazon SQS文档会在您的应用程序逻辑中声明要处理此问题,因为来自Amazon SQS的消息将不按顺序到达您。

与此相比,据我所知,您可以在RabbitMQ中实现工作队列。如果这样使您无需在应用程序级别实现队列消息排序,那么这将是更可取的选择。

以下是一些因素可以帮助您决定选择哪一个:

  1. 如上所述的队列消息序列。

  2. 您可以使用RabbitMQ设置自己的服务器,但对于Amazon SQS则不能,因此此处涉及成本。

  3. 设置您自己的服务器将需要对该主题有充分的了解,以便您不遗余力。Amazon SQS并非如此,因为它很快就可以开始使用。

  4. 您自己的RabbitMQ服务器意味着线下的维护成本,而Amazon SQS则不然。

更新:

  1. Amazon SQS现在支持FIFO队列。

5
您的意思是“ Amazon SQS在几乎所有主要平台上都具有广泛的可移植性,不确定RabbitMQ就是这种情况”。RabbitMQ在所有主要平台(Windows,Linux和Mac)上运行,并在所有主要语言(Java,.Net,PHP,Python,Ruby等)上运行
old_sound 2015年

6
@old_sound的不同之处在于,运行SQS只需为使用(发送和接收消息)付费,而运行RabbitMQ则具有隐含的成本(高于EC2的使用),以确保服务在运行,监控和修补,包括应用程序和基础操作系统。借助SQS,AWS可以处理所有“毫无区别的繁重工作”,因此您可以专注于自己的应用程序。
JaredHatfield

27
Amazon SQS现在支持FIFO
Rocketspacer

6
请更新帖子顶部,以显示它现在支持FIFO队列,当我读到它时,我几乎停止阅读
andy mccullough

11
-1这个答案的确需要引起注意。建议:完全消除FIFO约束,专注于IaaS(缩放,配置等)以及消息传递(例如轮询)方面的差异。
布雷特

68

我会选择SQS,而不是RabbitMQ,这就是为什么。

  1. SQS是一项托管服务。因此,您不必担心运行消息系统的操作方面的问题,包括管理,安全性,监视等。Amazon会为您做到这一点,并在出现问题时提供支持。
  2. SQS是弹性的,可以扩展到非常高的速率/体积(根据AWS不受限制;)
  3. SQS的可用性有很多9,并且得到了Amazon的支持,这是应用程序中无需担心的一件事。

但是,RabbitMQ可能会为放置和获取提供更快的响应时间,通常从我的测试中可以得到成千上万的TPS。为了使SQS提供这种吞吐量,您将不得不水平扩展多个实例。因此,如果您正在寻找5ms以下的看跌期权,可能会考虑使用RabbitMQ,因为我在1000秒TPS时进行SQS测试时已经看到接近20ms-30ms的放置时间,这略高于RabbitMQ。

我们只是将消息传递基础结构从ActiveMQ迁移到了SQS,再也没有比这更快乐了。我们发现它比在云中维护我们自己的ActiveMQ集群便宜。

希望这可以帮助!让我们知道怎么回事..


@ssekhar我们还计划将activemq迁移到SES。客户端上的更改有多大?我们使用的是Java和activemq的最新版本。
迪帕克·辛哈尔

我多年来一直在运行基于SQS的应用程序,平均放置延迟大约为每放置7毫秒-如果您获得20-30毫秒,那么无论是在测量还是在测试中,都出了什么问题。您是否在同一AWS区域/可用区中运行?你如何测量?
Krease

1
@DeepakSinghal-我确定您可能已经找到问题的答案。很抱歉,迟到了几年才在这里找到问题:)。从ActiveMQ到SQS-这是我们必须应对的一些挑战。1)SQS提供了一次至少一次的交付保证,而像JMS那样只有一次且只有一次,因此我们不得不解决重复交付的问题(我们的方法在这里显示-> angularthinking.blogspot.com)2)SQS使用了拉动模式vs.像在JMS中那样将客户端推入客户端,这使得使用更加容易。为了简化开发,我们在自己的服务器上实现了自己的侦听器和异步传递处理器。
ssekhar

21

实际上,我在合理的商业环境中都使用了这两种方法。

简短的答案是,除非有特殊情况,否则最好使用AWS SQS。(您可以跳到底部进行简单总结)

编码(关系):RabbitMQ和AWS SQS都有建立库和大量示例。

可见性超时(SQS):SQS通过RabbitMQ提供的一件事是更广泛的可见性超时概念。在RabbitMQ中,如果消费者在确认之前死亡,则会将消息放回到队列中。但是SQS具有更广泛的可见性超时概念,它与特定的呼叫者无关。因此,您可以启动一个工作单元,设置可见性并设置较大的超时时间(最多12小时),断开连接,让另一个工作人员完成并确认。在我的设计中,我们广泛利用了这一点,并消除了额外的服务/存储来管理潜在的较大的“进行中”负载。

死信处理(RabbitMQ-由“野兔”处理)SQS提供基本的死信处理,即所谓的“重新驱动策略”,该策略将邮件转储到死信队列(只是另一个队列)中。它是基本的,仅具有消息计数的概念。RabbitMQ具有“死信交换”功能,可提供过期消息时将消息推送到DLE的功能。但这有点像“如果您不看您的服务并且消息过期,那么它将落入DLE”的想法。对于RabbitMQ而言,这是一个微不足道的胜利,因为我发现这种说法很直观。为什么要监视队列而不是服务?(如果有的话,反之亦然)

管理(SQS):没有对SQS的管理。您只需为API调用付费。所有常见的麻烦,例如OS /应用程序安全补丁,扩展(添加更多节点),磁盘,都是由AWS团队处理的。它还符合FedRamp(供政府使用)。这确实是一个“设置并忘记”系统。RabbitMQ需要通常的OS /服务补丁,AMI,集群,安全性增强等功能。在极少数情况下,AMI可能会崩溃,或者有时需要移动,因此需要开箱即用的集群。SQS消除了所有这些麻烦。

成本(SQS):单个SQS API调用可以包括“最多10条消息/ 256k大小的批处理”,而“长轮询”可以大大降低成本。此外,还有诸如消息压缩之类的策略,可以在单个有效负载中发送数十条消息(有些声称有数百条或更多),以进一步降低成本。这是在我们考虑人们花在监视/修补/修复问题上的时间之前。SQS也非常适合“ poc项目”,好像它闲置一样,没有任何成本。

FIFO(TIE):2016年,AWS引入了FIFO支持,每百万个api调用需支付约0.01美元的额外费用(0.05美元对每百万个API总计0.04美元-扣除折扣)。您可以选择是否使用FIFO。对于非FIFO,我们很少看到重复的消息。

存储(SQS):AWS不收取存储费用,但您有14天的限制。在RabbitMQ上,您将不得不分配,扩展和管理需要峰值存储容量以及额外缓冲区的磁盘空间。只是更让人头疼。

指标(SQS):SQS提供了现成的指标。尽管可以将它们添加到AWS中,但要做的只是更多工作。

本地开发人员(领带):大多数现代商店都喜欢具有本地环境。现在有几个选项允许RabbitMQ和SQS的泊坞窗。

高吞吐量/非常大的消息(RabbitMQ-某种程度)当您按SQS> 1000请求/秒时,SQS的等待时间将增加。有几种解决方法。但是我发现这些情况极为罕见,因为大多数工作都可以划分为多个队列。但是对于需要100k / sec的这类情况,我认为Kafka更好。(我们在工作中也使用Kafka)很少有单个工作单元需要1000+请求/秒且低延迟。*有关此说明,请参见下文

简介:如果您打算加入AWS并愿意与SQS结婚,那么SQS毫无疑问。但是您应该继续阅读,因为有一些重要的事情要考虑。

RabbitMQ(和其他队列)的经典策略是创建针对某些工作类型优化的几种类型的队列。然后,对每个队列进行微调,并将类似的工作分组为少量(通常非常大)的队列。由于SQS没有管理开销,因此实际上最好为每个工作分配专用队列。这样,它既可以扩展规模,又可以消除队列饱和(使队列饱和并使其他工作人员淹没的工作),更好地查看工作(默认指标)等。

新策略使我的团队可以更好地了解工作的分配方式。“升级实例以增加负载”的日子已经一去不复返了。在过去,我们会看到一个巨大的无法解释的峰值,这会对其他服务造成副作用,或者只是猜测累积数量看起来恰到好处”。既然流量已经分离,我们实际上发现了许多以前没有注意到的问题,并且可以清楚地说明往哪里流了多少流量。尽管非常有可能实施指标和工具,但SQS提供了所有现成的功能。

在很多情况下,应认真考虑RabbitMQ

- Very large legacy code base that uses RabbitMQ with extensive tooling and knowledgeable support staff
- Messages that needs to be in the same work stream for > 14 days
- Very large messages that has very low latency requirements with it
- Cloud agnostic code base requirements. If you must run your code on other platforms (e.g. Azure/Google/bare metal), then SQS is not an option
- Large volume of data for a single pipeline that can't be broke up and other solutions (e.g. Kafka) are not viable. But at a super large volume, Kafka is a lot faster. While SQS will push large payloads to S3, you are now incurring additional cost.

3

如果您对成本敏感,那么Amazon SQS的价格可能会更高。我说的可能是因为您仍然需要在某个地方托管RabbitMQ服务器。SQS免费为您提供前100万个请求,然后每百万个请求收取0.4美元。通过启用长时间轮询(即将receive_message_wait_time设置为20s),可以降低SQS的成本。这并不意味着您的消息每20秒发送一次,而是意味着如果您的查询为空(每20秒),SQS不会向您收取“请求”。

如果您每小时使用1000个请求,那么您每月的需求为744000。免费套餐内免费,套餐外约0.74 * $ 0.4 = $ 0.2976。您可以通过启用等待时间来进一步减少这种情况。因此,在您的情况下,SQS可能实际上更便宜,因为大多数托管的最低起价为5美元以上(除非您拥有来自AWS的EC2免费套餐)。您应该选择最小的选项就可以了,因为RMQ建议仅在128mb内存左右开始。

如果您愿意,我发现SQS更加易于使用,RabbitMQ更具技术性。

更新:

实际上,我发现AWS Simple Notification Service更适合我需要的https://stackoverflow.com/a/13692720/5403449,主要是因为它基于推送,不轮询

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.