本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
FIFOAmazon 中的队列配送逻辑 SQS
以下概念阐明了 Amazon SQS FIFO 队列如何处理消息的发送和接收,尤其是在处理消息顺序和消息组时IDs。
发送消息
Amazon SQS FIFO 队列使用唯一的重复数据删除IDs和消息组IDs保留消息顺序。本主题重点介绍了消息组IDs对保持组内严格排序的重要性,并重点介绍了确保在多个生产者之间可靠且有序地交付消息的最佳实践。
-
订单保存
-
当多条消息连续发送到具有唯一消息重复数据删除功能的FIFO队列时IDs,Amazon 会SQS存储这些消息并确认其传输。然后按照传输的确切顺序接收和处理这些消息。
-
-
消息组 ID
-
在FIFO队列中,根据消息组 ID 对消息进行排序。如果多个创建者或线程使用相同的消息组 ID 发送消息,Amazon 会SQS确保按照消息到达顺序存储和处理这些消息。
-
最佳实践:为了保证多个生产者之间的严格消息顺序,请为来自每个生产者的所有消息分配一个唯一的消息组 ID。
-
-
按组排序
-
FIFO队列逻辑以每个消息组 ID 为基础应用:
-
每个消息组 ID 代表一组不同的、有序的消息。
-
在消息组 ID 中,所有消息都按严格的顺序发送和接收。
-
具有不同消息组的消息IDs可能会到达或处理顺序混乱。
-
-
要求-您必须将消息组 ID 与每条消息相关联。如果发送的消息没有群组 ID,则操作将失败。
-
单组方案-如果您要求按严格顺序处理所有消息,请为每封邮件使用相同的消息组 ID。
-
接收消息
Amazon SQS FIFO 队列处理消息检索,包括批处理、FIFO订单保证和请求特定消息组的限制IDs。本主题介绍了 Amazon 如何在保持严格的排序和可见性规则的IDs同时SQS检索消息组内和跨消息组的消息。
-
批量检索
-
当接收来自具有多个消息组的FIFO队列的消息时IDs,AmazonSQS:
-
尝试在一次呼叫中返回尽可能多的具有相同消息组 ID 的消息。
-
允许其他使用者IDs同时处理来自不同消息组的消息。
-
-
重要澄清
-
您可以一次性收到来自同一个消息组 ID 的多条消息(使用
MaxNumberOfMessages
参数一次调用最多可接收 10 条消息)。 -
但是,在以下之前,您无法在后续请求中收到来自同一消息组 ID 的其他消息:
-
当前收到的消息已删除,或者
-
它们再次变为可见(例如,在可见性超时到期之后)。
-
-
-
-
FIFO订单保障
-
批量检索的邮件在群组中保留其FIFO顺序。
-
如果同一个消息组 ID 的可用消息少于 10 条,Amazon SQS 可能会在同一批次IDs中包含来自其他消息组的消息,但每个组都保持FIFO顺序。
-
-
消费者限制
-
您不能明确请求接收来自特定消息组 ID 的消息。
-
多次重试
生产者和消费者可以安全地重试 Amazon SQS FIFO 队列中失败的操作,而不会中断消息顺序或引入重复消息。本主题重点介绍重复数据删除IDs和可见性超时如何确保重试期间的消息完整性。
-
制作人重试
-
如果
SendMessage
操作失败,创建者可以重试使用相同的消息重复数据删除 ID 多次发送消息。 -
只要在重复数据删除间隔到期之前,生产者至少收到一次确认,就会重试:
-
不要引入重复的消息。
-
请勿扰乱留言顺序。
-
-
-
消费者重试
-
如果
ReceiveMessage
操作失败,使用者可以根据需要使用相同的接收请求尝试 ID 重试多次。 -
只要消费者在可见性超时到期之前收到至少一个确认,就会重试:
-
请勿扰乱留言顺序。
-
-
关于FIFO行为的其他注意事项
了解如何处理可见性超时、启用多个消息组的并行处理以及确保在单组IDs场景中进行严格的顺序处理。
-
处理可见性超时
-
当消息被检索但未被删除时,该消息将保持不可见状态,直到可见性超时到期。
-
在第一条消息被删除或再次可见之前,不会返回来自同一消息组 ID 的其他消息。
-
-
并发和并行处理
-
FIFO队列允许并行处理不同消息组间的消息IDs。
-
为了最大限度地提高并发性,请设计具有多个消息组的系统,IDs以实现独立的工作流程。
-
-
单组场景
-
要严格按顺序处理FIFO队列中的所有消息,请对队列中的所有消息使用单个消息组 ID。
-
便于理解的示例
以下是演示 Amazon SQS 中FIFO队列行为的实际场景。
-
场景 1:单个群组 ID
-
生产者使用相同的消息组 ID 组 A 发送五条消息
-
消费者FIFO按顺序接收这些消息。在消费者删除这些消息或可见性超时到期之前,不会收到来自组 A 的其他消息。
-
-
场景 2:多个群组 IDs
-
生产者向组 A 发送五条消息,向组 B 发送 5 条消息。
-
消费者 1 处理来自组 A 的消息,而消费者 2 处理组 B 的消息。这允许并行处理,并在每个组内保持严格的顺序。
-
-
场景 3:批量检索
-
生产者向A组发送了七条消息,向B组发送了三条消息。
-
一个消费者最多可以检索 10 条消息。如果队列允许,它可能会返回:
-
来自 A 组的七封邮件和来自 B 组的三封邮件(如果一个群组中可用的消息较少,则更少)。
-
-