标准 SQS 与每条消息都具有唯一 groupId 的 FIFO SQS 的吞吐量比较。

4

我不太关心事件的顺序,但我希望消息只被处理一次。监听SQS消息的Lambda函数将其存储在DynamoDB中,因此吞吐量非常重要,因为我有多个微服务(作为生产者)向此SQS写入消息,这些消息将由单个微服务读取。

关于确保消息只被处理一次,FIFO队列支持此功能,但据说吞吐量不佳。

如果每条消息具有唯一的groupId,FIFO队列的吞吐量是否与标准队列相同?

如果不是,那么我的下一个选择可能是在将消息存储到DynamoDB时使用“attribute_not_exists”。

哪个选项应该更好?


你预计每秒会有多少条消息?FIFO 可以处理 3000 条/秒。 - Marcin
1
我认为在目标地点(在您的情况下是DynamoDB)实现去重逻辑是更好的选择,从成本、性能和可靠性方面考虑。 - Mike Dinescu
3个回答

6

每秒消息数

FIFO队列

  • 批处理+高吞吐量模式下可达30,000条消息
  • 非批处理+高吞吐量模式下可达3,000条消息
  • 批处理模式下可达3,000条消息
  • 非批处理模式下可达300条消息

标准队列

  • 接近无限制

https://aws.amazon.com/sqs/faqs/

为了确保精确一次性处理,您需要使用具有去重IDFIFO队列

如果您的吞吐量要求在上述限制范围以下,则使用FIFO队列即可。

如果不是,将DynamoDB用作您的原始计划也是另一种选择。但是,您必须自己管理许多事情,例如删除消息,在消息被读取但尚未完全处理时进行更新等。


3

FIFO SQS队列与普通SQS队列相比具有不同的速率限制,无论是否使用消息组ID。

SQS标准队列支持每个API操作(SendMessage、ReceiveMessage或DeleteMessage)每秒几乎无限数量的API调用。

FIFO SQS支持每个API方法300 TPS。

请查看配额文档here

此外,AWS推出了一项新功能,用于更高吞吐量的FIFO SQS队列,可能会引起您的兴趣。

通过每个API调用最多批处理10条消息,您可以使用FIFO队列处理3,000条消息每秒。

关于确保您不会处理相同的消息两次-您是否查看过FIFO去重ID?我不确定这是否完全符合您的要求,但听起来与您的要求非常相似。


0

SQS的交付保证是至少一次。您的应用程序必须设计成处理重复消息。

我强烈建议您以这种方式构建您的应用程序。

如果您必须精确处理某种类型的数据一次,您需要一个强一致性系统。考虑使用dynamodb和条件更新


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接