英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
消息组
FIFO 队列按顺序投递每个消息组:组中有消息在传输中时,它的下一条消息等待,其他组照常进行。
以文字阅读本图
- FIFO 队列 orders.fifo: alice; 1 传输中; 2 等待; 3 等待; bob; 1 已投递; 2 排队中; 3 排队中; carol; 1 已投递; 2 排队中
- FIFO 队列 orders.fifo → 消费者:一次 ReceiveMessage 取得 bob 1 和 carol 1,alice 等待: 接收
- 五分钟内重复的 MessageDeduplicationId 被接受,但不投递
每次向 FIFO 队列发送都要指定一个 MessageGroupId。同一组的消息按发送顺序投递。组中有一条消息在传输中时,队列不会交出该组的其他消息。这条消息被删除,或者它的可见性超时到期之后,该组才继续。不同的组互不等待,因此组就是并行工作的单位。
每次发送还带有一个 MessageDeduplicationId。五分钟内重复某个 id 的发送会被接受,但不会投递。启用基于内容的重复数据删除时,队列用正文的 SHA-256 哈希生成这个 id,发送时指定的 id 优先。
本 crate 从最具体的指定处选择一次发布的组:先看调用的 SqsPublishOptions,再看消息的 PARTITION_KEY_HEADER,再看策略固定的组,最后是 default。它总是发送一个重复数据删除 id:调用指定的那个,或者在本进程内唯一的一个。因此,同一正文发送两次就是两条消息,除非服务为两次发送指定同一个 id。为标准队列设置组或重复数据删除 id 会被拒绝,返回 SqsError::NotFifo。投递时,组出现在 PARTITION_KEY_HEADER 中,工作分区按它划分各个工作者。
SNS FIFO 主题只投递到 FIFO 队列,消息在途中保留它的组,主题一页用图说明了这一点。