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 存储队列中的隐藏消息的主要内容,如果未能解决你的问题,请参考以下文章