【问题标题】:How to check if an Azure storage queue has messages如何检查 Azure 存储队列是否有消息
【发布时间】:2016-08-29 22:10:43
【问题描述】:

我正在尝试同时使用一个 WebJob 和一个 Worker Role。

WebJob 将有一个 BlobTrigger,每次将 Blob 添加到容器时,都会将一条新消息添加到 Azure 存储队列(称为 待处理 Blob)。

此外,还有一个 Worker Role,它将汇集来自 待处理 blob 队列的消息,并将 blob 名称添加到内部阻塞集合中,该集合将由由工人角色。

我认为在这个解决方案中我会考虑可伸缩性,因为会有很多 blob 到达容器,所以我不希望 CPU 消耗达到峰值。

在开发解决方案时我想到了一些问题:

  • 有没有办法检查 Azure 存储队列里面是否有消息?
  • 如果我调用 GetMessage 方法并且队列没有任何消息,执行将被阻止,直到有新消息到达?
  • 有没有办法手动删除 Blob 收据?

【问题讨论】:

  • 不知道你的意思,关于删除 blob 收据。
  • 为什么使用工作者角色而不是 webjob 来托管排队过程?
  • 当您使用 BlobTrigger 时,Azure 使用什么来确定触发器是否处理了 Blob 是 Blob 收据。这是某种标志,表明该 blob 不是新的并且尚未更新。
  • @DavidMakogon 我想也许我应该重新表述我的问题并添加一些关于要解决的问题的上下文信息。或许,您可以看一下:stackoverflow.com/questions/39227680/… 谢谢!

标签: azure azure-blob-storage azure-webjobs azure-worker-roles azure-storage-queues


【解决方案1】:

有没有办法检查 Azure 存储队列是否有消息 里面?

队列有一个 ApproximateMessageCount 属性,您可以检查队列深度(注意:这不是 100% 准确,因为在检查时可能会添加/删除消息)。

如果我调用 GetMessage 方法并且队列没有任何 消息执行将被阻止,直到有新消息到达?

GetMessage() 是非阻塞的。如果没有消息,则呼叫返回。注意:由于您计划创建自己的阅读器作为工作角色,因此在处理空队列时要小心:如果您将自己置于一个紧密的循环中并继续爆破队列,您将冒着耗尽队列的风险2000 事务/秒限制(您可能会看到过多的网络流量和 CPU 利用率)。如何实施退避策略取决于您自己,但您需要合并某种类型的退避。

【讨论】:

    【解决方案2】:

    如果您使用 Azure Functions 来处理您的队列消息,可能会更好。只有当队列中出现新消息时才会触发。

    https://azure.microsoft.com/en-us/documentation/articles/functions-bindings-storage/

    【讨论】:

    • 请注意,在内部,这本身使用带有回退策略的轮询。
    【解决方案3】:

    CloudQueue类中的FetchAttributes方法可以用来获取Queue的不同属性。 count 属性就是这些属性之一。

    根据documentation

    ApproximateMessageCount 属性返回 FetchAttributes 方法检索到的最后一个值,而不调用队列服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2018-11-23
      • 2023-04-08
      • 1970-01-01
      • 2018-08-26
      • 2014-01-28
      • 1970-01-01
      相关资源
      最近更新 更多