Azure 存储队列中的隐藏消息

Posted

技术标签:

【中文标题】Azure 存储队列中的隐藏消息【英文标题】:Hidden messages in Azure storage queue 【发布时间】:2017-09-29 16:30:26 【问题描述】:

有时 Azure 队列中的某些消息不由 Azure Functions 负责,并且在 StorageExplorer 中也不可见。 这些消息的创建没有任何可见性延迟。

有什么方法可以知道这些消息包含什么,以及为什么我们的 Azure Functions 不处理它们?

在图像中,您可以看到我们在队列中有一条消息,但它在列表中不可见,并且从几个小时开始就在那里。

【问题讨论】:

你检查过毒消息吗?死信队列docs.microsoft.com/en-us/azure/app-service-web/… 你能看看你的函数最近是否执行过(并且失败了)?该数字表示“过期”或“不可见”消息。当InvisibilityTimeout 过期时,“不可见”消息应重新出现在队列中。 我没有给你的答案,但我可以说这是因为某些进程读取了消息,因此它当前是不可见的,直到隐形超时到期或进程手动释放它。这种机制的目的是阻止多个进程处理同一条消息。 【参考方案1】:

消息似乎过期。以下步骤可以重现该问题,您可以对其进行测试。

添加带有短 TTL 的消息

消息过期后

【讨论】:

不应该这样,因为邮件有 7 天的有效期 在上述步骤中,指定 7 秒只是为了快速重现问题。 我试过你的建议,它是正确的。我想知道过期的消息是否会一直作为不可见消息保留在那里,或者它们是否会在某个时候被删除。【参考方案2】:

Azure Queue API 目前无法检查不可见的消息。

有几种情况下消息会变得不可见:

    在Put Message request 中添加了带有VisibilityTimeout 的消息。在此初始超时到期之前,该消息将不可见。 消息已被检索(出队)。每当检索到一条消息时,它将在Get Messages request 指定的VisibilityTimeout 持续时间内不可见,默认为30 秒。 消息已过期。默认情况下,消息在 7 天后过期,或者在 Put Message 请求中指定的 MessageTTL 之后过期。注意:一段时间后,这些消息会被自动删除,但在那之前它们是不可见的消息。

用例

初始可见性超时

使用初始 VisibilityTimeout 创建消息,以便可以现在创建消息,但稍后处理(在超时到期后),无论出于何种原因创建者想要延迟此处理。

检索时的可见性超时

处理队列消息的预期过程是:

    应用程序将一条或多条消息出列,可选择指定下一个VisibilityTimeout。此超时时间应大于处理消息所需的时间。 应用程序处理消息。 应用程序删除消息。当处理失败时,消息不会被删除。 处理失败的消息将在其VisibilityTimeout 到期后立即再次可见,以便可以重新尝试。为防止无休止的重试,第 2 步应首先检查消息的 DequeueCount:如果它大于所需的重试计数,则应将其删除,而不是处理。将此类消息复制到死信/毒队列(例如,具有原始队列名称加上 -poison 后缀的队列)是一种很好的做法。

消息TTL

默认情况下,消息的生存时间为 7 天。如果应用程序处理无法处理添加的消息量,则可能会积压。调整 TTL 将决定这种积压会发生什么。 或者,应用程序可能会崩溃,从而积压工作,直到应用程序再次启动。

【讨论】:

以上是关于Azure 存储队列中的隐藏消息的主要内容,如果未能解决你的问题,请参考以下文章

Azure 存储队列触发的 Azure 函数

天蓝色存储队列中的最大出队数

在 Azure 存储中使用队列

Azure 函数中绑定队列存储消息文本失败

如何使用 python 快速将消息发送到 Azure 队列存储?

我们可以使用 Azure 存储队列作为事件源吗?