我需要创建一个用于处理的队列。 队列本身是相对低流量的。 每小时可能会有大约1000个写入操作。 每个任务的执行可能需要大约一分钟时间,并且几乎在项添加到队列时立即处理。
是否有任何原因,使我希望使用RabbitMQ而不是像Amazon SQS这样的现成解决方案? 为什么应用程序需要自己的队列系统而不是类似SQS的东西的原因是什么?
我需要创建一个用于处理的队列。 队列本身是相对低流量的。 每小时可能会有大约1000个写入操作。 每个任务的执行可能需要大约一分钟时间,并且几乎在项添加到队列时立即处理。
是否有任何原因,使我希望使用RabbitMQ而不是像Amazon SQS这样的现成解决方案? 为什么应用程序需要自己的队列系统而不是类似SQS的东西的原因是什么?
以下是一些因素,可以帮助您决定选择哪一个:
RabbitMQ默认采用FIFO。 Amazon SQS队列可以选择设置为FIFO。
您可以使用RabbitMQ设置自己的服务器,但在Amazon SQS的情况下则不行,这里涉及到成本问题。
设置自己的服务器将需要良好的主题知识,以便您不会疏漏任何角落。而Amazon SQS则很容易开始使用,无需具备此方面的知识。
拥有自己的RabbitMQ服务器意味着未来将有维护成本,而这在Amazon SQS中并非如此。
我更喜欢SQS而非RabbitMQ,原因如下:
然而,根据我的测试结果,RabbitMQ可能会提供更快的put和get响应时间,通常在每秒10万个TPS左右。要使SQS提供这种吞吐量,您需要通过多个实例进行水平扩展。因此,如果您正在寻找低于5ms的put时间,则RabbitMQ可能是要考虑的选项,因为我在1000个TPS的SQS测试中看到了接近20ms-30ms的put时间,略高于RabbitMQ。
我们刚刚将我们的消息基础架构从ActiveMQ转移到了SQS,我们感到非常满意。我们发现它比在云中维护自己的ActiveMQ集群要便宜。
我曾经在商业环境中都使用过,并取得了相当的成功。
简短的回答是,除非有特定的角落案例,否则最好选择AWS SQS。(您可以直接跳到底部查看简单摘要)
编码(平局): RabbitMQ和AWS SQS都有成熟的库和大量的示例。
可见性超时(SQS): SQS比RabbitMQ提供更广泛的可见性超时概念。在RabbitMQ中,如果消费者在ack之前死亡,则将消息放回队列。但是SQS具有更广泛的可见性超时概念,不与特定的调用方绑定。因此,您可以启动一个工作单元,设置具有较长超时时间(最多12小时)的可见性,断开连接,让另一个工作人员完成并确认它。在我的设计中,我们广泛利用这一点,并消除了管理可能大型“正在进行中”有效载荷的额外服务/存储。
死信处理(RabbitMQ-由'hare'提供) SQS在所谓的“重新驱动策略”中提供基本的死信处理,将消息转储到Dead Letter Queue(只是另一个队列)。它很基本,只有消息计数的概念。RabbitMQ具有Dead Letter Exchanges,当它们过期时,提供将消息推入DLE的功能。但是这有点无关紧要,因为“如果您没有监视您的服务和消息过期,那么它将落入DLE”。对于RabbitMQ来说,这是一个微小的胜利,因为我发现这种论点反直觉。为什么你要监视你的队列而不是你的服务?(如果有什么区别,那就是另一回事)
管理(SQS): 没有SQS的管理。您只需支付API调用费用。所有通常的头痛,如OS /应用程序安全补丁、扩展(添加更多节点)、磁盘都由AWS团队处理。它还符合FedRamp(用于政府使用)。这真是一个“设置并忘记”的系统。而RabbitMQ需要通常的OS /服务补丁、AMIs、集群、安全硬化等。虽然这很罕见,但AMIs可能会崩溃,或者有时需要移动它们,因此需要开箱即用的集群。SQS消除了所有这些问题。
成本(SQS): 单个SQS API调用可以包括“批处理最多10条消息/ 256k大小”和“长轮询”,可以大大降低成本。此外,还有像消息压缩这样的策略,可以将数十个(有些声称数百个或更多)消息发送到单个有效载荷中,以进一步降低成本。这还没有考虑人们花费在监视/修补/解决问题上的时间。如果它处于空闲状态,则SQS也非常适合“poc项目”,因为没有成本。
FIFO(平局): 2016年,AWS引入了FIFO支持,额外收取每百万次API调用约0.10美元的费用(FIFO队列为0.50美元,标准(非FIFO)队列为0.40美元,均不含折扣)。您可以选择使用FIFO或不使用。对于非FIFO,我们很少看到重复的消息。
存储(SQS): AWS不会收取存储费用,但您有14天的限制。在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.