Azure WebJobs 和 ServiceBusTrigger

Posted

技术标签:

【中文标题】Azure WebJobs 和 ServiceBusTrigger【英文标题】:Azure WebJobs and ServiceBusTrigger 【发布时间】:2015-04-02 00:11:44 【问题描述】:

Azure WebJobs SDK 的 ServiceBusTrigger 的毒消息处理如何工作?我希望将出列次数超过“x”次的服务总线队列消息推送到不同的服务总线(或)存储队列

在线文档here 和here 以及来自here 的SDK Samples 没有关于ServiceBusTrigger 如何处理毒消息的示例。这项工作正在进行中吗?

我尝试使用 dequeueCount 参数实现自定义毒消息处理,但它看起来不支持 ServiceBusTriggers,因为我遇到了运行时异常 "Cannot bind parameter 'dequeueCount' when using this trigger."

public static void ProcessMessage([ServiceBusTrigger(topicName: "abc", subscriptionName: "abc.gdp")] NotificationMessage message,
            [Blob("rox/PayloadId", FileAccess.Read)] Stream blobInput, Int32 dequeueCount)
        
            throw new ArgumentNullException();
        

【问题讨论】:

【参考方案1】:

虽然您无法获取 ServiceBus 消息的 dequeueCount 属性,但您始终可以绑定到 BrokeredMessage 而不是 NotificationMessage 并从中获取属性。

【讨论】:

【参考方案2】:

看起来 WebJobs 目前在内部处理这个问题。

参考:How to use Azure Service Bus with the WebJobs SDK

具体部分:

ServicebusTrigger 的工作原理

SDK 在 PeekLock 模式下收到消息,并在 如果函数成功完成,则消息,或者如果函数完成,则调用 Abandon 功能失败。如果函数运行时间超过 PeekLock 超时时间, 锁会自动更新。

Service Bus 自己处理毒物队列,因此两者都不是 由 WebJobs SDK 控制,也不能在其中配置。

Additional Reference

无法在 Azure Functions 中控制或配置中毒消息处理。服务总线自己处理有害消息。

【讨论】:

我发现 ServiceBusTrigger 很……有趣。如果我在 WebJobs“仪表板”中检查函数调用的状态,它会显示状态“成功”,运行时间以毫秒为单位,用于尚未完成的调用。这是一个长时间运行的过程(> 10 分钟),但状态立即为“成功”。 ServiceBusTrigger 是否立即返回成功,然后处理消息?【参考方案3】:

为了补充 Brendan Green 的答案,WebJobs SDK 对处理失败的消息调用 Abandon,并且在最大重试次数后,这些消息被服务总线移动到死信队列。定义何时将消息移入死信队列的属性,例如最大传递计数、生存时间和 PeekLock 持续时间可以在 Service Bus -> Queue -> Properties 中更改。

你可以在这里找到更多关于SB死信队列的信息:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dead-letter-queues

【讨论】:

以上是关于Azure WebJobs 和 ServiceBusTrigger的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集“Microsoft.Azure.WebJobs.Host,版本=3.0.22.0

命名空间“Microsoft.Azure.WebJobs”中不存在 EventHubTriggerAttribute

如何扩展 Azure Webjobs

命名空间“Microsoft.Azure.WebJobs”中不存在类型或命名空间名称“TableAttribute”

在 azure 上发布网站时,webjobs 被删除

Azure webjobs - Unity - 如何将范围内的依赖项注入其他类