4

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

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

此外,还有一个 Worker Role,它将从待处理的 Blob队列中汇集消息,并将 Blob 名称添加到一个内部阻塞集合中,该集合将由 Worker Role 触发的多个任务同时处理。

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

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

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

3 回答 3

3

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

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

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

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

于 2016-08-29T23:03:16.357 回答
1

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

根据文档

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

于 2019-03-14T05:34:33.740 回答
1

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

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

于 2016-08-29T22:32:04.630 回答