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