使用 Amazon SQS 消息去重 ID - Amazon Simple Queue Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon SQS 消息去重 ID

消息重复数据删除 ID 是用于对已发送消息重复数据删除 ID 重复数据删除 ID 用于对已发送消息重复数据删除重复数据删除 ID 如果成功发送了具有特定消息重复数据删除 ID 的消息,则任何使用相同消息去重 ID 发送的消息都将被成功接受,但不会在 5 分钟重复数据删除间隔内传送。

注意

消息重复数据删除适用于整个队列,而不是单个消息组。

Amazon SQS 继续跟踪消息重复数据删除 ID,即使在收到消息删除消息重复数据删除 ID 之后也是如此。

提供消息重复数据删除 ID

在以下情况下,创建者应为每条消息提供消息去重 ID 值:

  • 使用相同的消息正文发送的消息,Amazon SQS 必须将其视为唯一消息。

  • 发送的消息内容相同,但消息属性不同,Amazon SQS 必须将其视为唯一的。

  • 发送的带有不同内容(例如,消息正文中包含的重试次数)的消息,Amazon SQS 必须将其视为重复内容。

为单一生产者/消费者系统启用重复数据删除

如果您有单一的创建者和单一的使用者并且消息都是唯一的 (因为消息正文中包含特定于应用程序的消息 ID),请遵循最佳实践:

  • 为队列启用基于内容的重复数据删除 (每条消息都具有唯一的正文)。创建者可忽略消息重复数据删除 ID。

  • 尽管使用者无需为每个请求提供接收请求尝试 ID,但最好提供,因为这样可以更快地执行失败-重试序列。

  • 您可以重试发送或接收请求,因为它们不会干扰 FIFO 队列中消息的排序。

针对中断恢复场景进行设计

FIFO 队列中的重复数据删除过程对时间很敏感。在设计应用程序时,请确保生产者和使用者都能在客户端或网络中断时恢复。

  • 生产者必须知道队列的重复数据删除间隔。Amazon SQS 的重复数据删除间隔为 5 分钟。在重复数据删除时间间隔过期后重试 SendMessage 请求可能会将重复的消息引入队列中。例如,车辆中的移动设备将发送其顺序很重要的消息。如果车辆在接收确认前一段时间失去手机网络连接,则在重新获得手机网络连接之前重试请求可能产生重复项。

  • 使用者必须具有可见性超时,以便将在可见性超时过期之前无法处理消息的风险降至最低。您可通过调用 ChangeMessageVisibility 操作延长处理消息时的可见性超时。但是,如果可见性超时过期,其他使用者可立即开始处理消息,从而导致多次处理消息。要避免这种情况,请配置死信队列

处理可见性超时

要获得最佳性能,请将可见性超时设置为大于 Amazon 开发工具包读取超时。这适用于在短轮询或长轮询中使用ReceiveMessage API 操作。