amazon-web-services - 如何扩展 SQS FIFO 队列多个侦听器
问题描述
我有三个 SQS FIFO 队列,每个队列在 EC2 实例中都有一个数据投影侦听器守护程序作为 docker pod(SQL Server、PostgreSQL、Elastic Search 等)
所有队列都具有与以下相同的设置(稍后设置的死信队列)。
Queue Type: FIFO
Messages Delayed: 0
Content-Based Deduplication: Enabled
Default Visibility Timeout: 30 seconds
Message Retention Period: 14 days
Maximum Message Size: 256 KB
这是我正在使用 DynamoDB Stream => Lambda SQS 路由器 => SQS FIFO 队列设计的事件溯源架构的一部分(由于 SNS 不支持将 FIFO 队列作为订阅者)
Content-Based Deduplication
已启用以避免队列中出现重复消息,因为任何队列的 Lambda 路由器中总是可能出现错误。
现在,我还MessageGroupId
为每条消息设置了 AggregateId 以对它们进行分组,但并不真正了解消费者端如何使用它;
我目前每个 SQS 队列只有一个消费者,但如果我想扩展消费者怎么办。是确保多个消费者不会处理来自同一个 MessageGroupId 的消息的应用程序问题;- 这是不可接受的,因为使用 FIFO 队列是由于系统中事件的顺序保留!
解决方案
如果从 FIFO Amazon SQS 队列接收到一条消息并且它仍然不可见(“正在运行”),那么 SQS 将不会提供具有相同MessageGroupId
.
因此,同一队列上的多个消费者将接收到不同的消息,并且将保留MessageGroupId
给定的消息顺序。MessageGroupId
这里重要的是MessageGroupId
在您希望保留顺序的地方使用不同的,但不要MessageGroupId
对每条消息都使用相同的。
推荐阅读
- python - 在 Pandas 中创建时间范围
- java - 如何删除和添加项目到数组?
- nativescript-vue - Nativescript-vue GridLayout 行对齐
- odoo - 用户在 Odoo 10 中按下按钮后打开多个 ID 的树视图
- sql - 如何在 SQL 中对具有特定条件的多行求和
- r - bdscale::scale_x_bd - 如何删除 x 轴标签作为这个函数的结果
- mysql - MySQL - 如果第一个外键为空,如何处理使用第二个外键的情况?
- java - Android Studio:用于从坐标获取最近位置的 SQLite 数据库查询
- java - 如何在春季匹配logback.xml中的环境变量
- python - 如何删除数据框中的行