Azure Functions 的 service bus trigger 默认采用的是peeklock模式,该模式下,如果functions收到消息后,整个functions执行成功,则functions框架会在function成功后,将service bus的消息标定为 complete,如果functions执行时失败,则标定为 abandon, 如果functions的运行时间长于peeklock超时时间,如果functions还在执行,则会自动续订lock。
关于 message lock duration和 Max delivery count的信息,可以在代码执行时通过日志查看:
namespace Company.Function
{
public class ServiceBusTopicTrigger1
{
private readonly ILogger<ServiceBusTopicTrigger1> _logger;
public ServiceBusTopicTrigger1(ILogger<ServiceBusTopicTrigger1> log)
{
_logger = log;
}
[FunctionName("ServiceBusTopicTrigger1")]
public void Run([ServiceBusTrigger("topic-01", "sub-01", Connection = "demofunctions_SERVICEBUS")]string mySbMsg, Int32 deliveryCount)
{
_logger.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
_logger.LogInformation($"DeliveryCount={deliveryCount}");
Thread.Sleep(40000);
}
}
}
假定 message Lock duration设定为10,Max delivery Count设定为1:
如果Functions 收到一条消息,将消息锁定10秒,且Functions 需要50秒才可以执行完成,则如果Function还在执行,则锁会自动续订。
如果Functions收到一条消息,将消息锁定10秒,此时Functions异常退出了,则消息将在锁定期10秒后进入死信队列。
假定 message Lock duration设定为10,Max delivery Count设定为10:
如果Functions收到一条消息,将消息锁定10秒,此时Functions异常退出了,则消息将在锁定期10秒后会重新进入队列供订阅者消费,此时Functions如果再次运行,则可以收到 develivery count =2 的消息,则消息会被第二次执行消费。如果第二次消费Functions不出错,则消息从队列中移除,如果还出错,则消息会继续被放回队列,再执行第三次,直到 某次执行成功,则消息被消费掉。如果到第10次还是执行失败,则丢入死信队列。
Azure Functions中的 peeklock模式遵照如下规定(C#和Python语言修改位置不同,Python修改functions.json):
AutoComplete属性对peeklock的影响,参见官网:https://docs.microsoft.com/zh-cn/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=in-process%2Cextensionv5&pivots=programming-language-csharp&WT.mc_id=AZ-MVP-5003757#attributes