5

我正在使用 Amazon SQS 队列向外部系统发送通知。

如果使用 SQS' 时 HTTP 请求失败SendMessage,我不知道消息是否已排队。我的默认策略是重试将消息发布到队列,但存在两次发布消息的风险,根据用例,这可能是不可接受的。

如果消息正文(或某种消息元数据,例如我们可以提供的唯一 ID)上存在重复项,是否有办法让 SQS 拒绝该消息,以便我们可以重试直到消息被接受,并且有信心如果第一个请求已经排队,但响应丢失,不会有重复?

4

2 回答 2

7

不,SQS 中没有这样的机制。更进一步,一条消息也有可能被传递两次或更多次(至少一次传递语义)。因此,即使存在这样的机制,您也无法保证消息不会被多次传递。

请参阅:http ://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/DistributedQueues.html

对于一次性交付,发送端和接收端都需要某种形式的事务(并且 HTTP 不是事务协议)。

于 2013-09-09T10:48:57.740 回答
4

AFAIK,现在 SQS 确实支持所要求的内容!

请参阅题为“新功能”的帖子Amazon SQS 推出具有 Exactly-Once 处理和更低价格的标准队列的 FIFO 队列

根据SQS 常见问题解答

FIFO 队列提供一次性处理,这意味着每条消息都被传递一次并保持可用,直到消费者处理并删除它。不会将重复项引入队列中。

还有一篇AWS 博客文章对这个主题有更深入的了解:

这些队列旨在保证消息仅按发送顺序处理一次,并且没有重复。

……

Exactly-once 处理适用于单消费者和多消费者场景。如果您在多消费者环境中使用 FIFO 队列,您可以将队列配置为仅在当前消息已被删除或可见性超时到期后才使消息对其他消费者可见。在这种情况下,最多有一个消费者会主动处理消息;其他消费者将一直等到第一个消费者完成或失败。

当 SQS 之外的网络问题阻止消息发送者了解操作的状态并导致发送者重试调用时,有时会出现重复消息。FIFO 队列使用多种策略来检测和消除重复消息。除了基于内容的重复数据删除之外,您还可以在为 FIFO 队列调用 SendMessage 时包含 MessageDeduplicationId。ID 最长可达 128 个字符,如果存在,其优先级高于基于内容的重复数据删除。

于 2018-02-28T18:50:26.977 回答