【问题标题】:I'm getting same multiple Sqs message before visibility timeout在可见性超时之前我收到了相同的多个 Sqs 消息
【发布时间】:2017-12-21 10:48:51
【问题描述】:

我将可见性超时设置为 12 小时,最长消息 3,延迟时间 15 分钟,我在自动再次收到相同消息后几分钟收到 sqs 消息。

为什么我收到多个 sqs 消息而没有超时? 可见性超时后,它会删除队列中的消息还是再次发送 sqs 消息?

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案1】:

    当在 Amazon SQS 队列上调用 ReceiveMessage() 时,最多将从队列中检索 10 条消息(可配置)。

    这些消息将被标记为 InvisibleIn-Flight。这意味着消息仍在队列中,但不会通过另一个ReceiveMessage() 调用返回。这些消息将在一段时间内保持不可见。默认时间段在队列上配置(“默认可见性超时”)或检索消息时(VisibilityTimeout)。

    当应用程序处理完消息后,它应该调用DeleteMessage(),传递消息中提供的MessageHandle。然后该消息将从队列中删除

    如果在删除消息之前不可见期到期,它将再次放入队列,应用程序可以再次检索它。因此,请务必将您的隐身超时设置为比应用程序通常处理消息所需的时间长。

    有可能一条消息从 Amazon SQS 中多次检索。这种情况很少见,但可能发生在有多个进程同时检索消息的情况下。因此,SQS 是“至少一次交付”。如果这是一个问题,您可以使用 FIFO 队列(尚未在每个区域都可用),这将保证每条消息仅传递一次,但 FIFO 队列存在吞吐量限制。

    所以,如果您不止一次收到一条消息:

    • 您应该检查您的隐身超时设置(默认设置和调用ReceiveMessage()时可以传递的值)
    • 考虑使用 FIFO 队列
    • 让您的应用程序在再次处理之前检查消息是否已被处理(例如,通过唯一 ID

    【讨论】:

    • 什么是隐形超时,我在 AWS 中没有看到这些选项,我还有一个问题是我如何一次又一次地收到相同的消息。在可见性超时之前
    • 我对 invisibility timeout 的引用与 visibility timeout 相同(抱歉措辞不一致)。它在控制台中显示为 Default Visibility Timeout,在代码中显示为 VisibilityTimeout。我的整个答案与您反复收到相同的消息有关,以及您可以尝试避免它的方法。
    • 感谢您的详细解释
    • SQS 的消息中是否有任何内容被认为在多次交付中是唯一的,因此可以用作该唯一 ID?消息ID?签名?或者你应该自己生成一个?
    • @jbernal 请提出一个新问题,而不是对旧问题发表评论。另请参阅Queue and Message Identifiers 上的收据句柄
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2017-05-09
    • 2016-02-06
    • 1970-01-01
    • 2019-05-01
    • 2019-11-07
    相关资源
    最近更新 更多