Azure存储队列中的隐藏信息

7
有时候,在Azure队列中会有一些消息未被Azure函数处理,也无法在StorageExplorer中看到。这些消息是没有任何可见性延迟创建的。
是否有任何方法可以知道这些消息包含什么内容,以及为什么我们的Azure函数没有处理它们? StorageExplorer 在图像中,您可以看到我们有一个在队列中的消息,但它在列表中不可见,并且已经存在几个小时了。

你有检查过毒消息和死信队列吗?https://learn.microsoft.com/en-us/azure/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to#poison - Aravind
2
你能否查看你的函数最近是否已经执行(并失败)?那个数字表示“过期”或“不可见”的消息。当“InvisibilityTimeout”到期时,“不可见”的消息应该重新出现在队列中。 - brettsam
1
我无法为您提供答案,但我可以说这是因为某些进程读取了该消息,因此它当前是不可见的,直到不可见超时到期或进程手动释放它。这种机制的目的是防止多个进程处理同一条消息。 - Ezekiel Victor
2个回答

2
Azure队列API目前没有检查不可见消息的方法。
有几种情况下消息会变为不可见:
  1. 使用Put Message request中的VisibilityTimeout添加消息。在此初始超时到期之前,该消息将处于不可见状态。
  2. 已检索(出队)消息。每当检索消息时,它都会在Get Messages request指定的VisibilityTimeout或默认的30秒内处于不可见状态。
  3. 消息已过期。默认情况下,消息在7天后过期,或在Put Message请求中指定MessageTTL后过期。请注意:这些消息过一段时间后会自动删除,但在那之前它们是不可见的消息。

用例

初始VisibilityTimeout

消息是使用初始的VisibilityTimeout创建的,以便消息可以现在创建,但稍后(在超时到期后)处理,无论创建者为延迟此处理而有何原因。

检索时的VisibilityTimeout

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

  1. 应用程序出队一个或多个消息,可选择指定下一个VisibilityTimeout。此超时时间应大于处理消息所需的时间。
  2. 应用程序处理消息。
  3. 应用程序删除消息。当处理失败时,消息将不会被删除。
  4. 处理失败的消息将在其VisibilityTimeout到期后立即重新显示,以便可以重新尝试。为防止无限重试,第2步应始于检查消息的DequeueCount:如果它大于所需的重试次数,则应将其删除,而不是处理。最好将这些消息复制到死信/毒消息队列(例如,原始队列名称加上一个-poison后缀的队列)。

消息生存时间(MessageTTL)

默认情况下,消息的生存时间为7天。如果应用程序处理无法处理添加的大量消息,则可能会出现积压。调整TTL将确定这种积压的处理方式。 或者应用程序可能会崩溃,导致积压一直增加,直到应用程序再次启动。


0

看起来消息已经过期了。以下步骤可以复现该问题,你可以测试一下。

添加一个短时间的 TTL 的消息

enter image description here

当消息过期后

enter image description here


这不应该发生,因为消息有7天的有效期。 - Antonio Salvati
在上述步骤中,指定7秒钟只是为了快速重现问题。 - Fei Han
1
我尝试了你的建议,它是正确的。我想知道过期的消息是否会一直保留为不可见的消息,还是在某个时候被删除。 - Mark Lagendijk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接