Azure Function Python - serviceBusTrigger - 如何对消息进行死信处理

Azure Function Python - serviceBusTrigger - How to deadletter a message

我有一个简单的 Python 函数,如果它不匹配少数约束,它应该将消息设为死信。实际上我提出了一个例外并且一切正常(我的意思是消息被死信),但我想了解是否有一种“干净”的方式来死信消息而不引发异常。

async def function_handler(message: func.ServiceBusMessage, starter: str):
    for msg in [message]:
        client = df.DurableOrchestrationClient(starter)
        message_body = msg.get_body().decode("utf-8")

        msg = json.loads(message_body)

        if 'valid' in msg:    
           instance_id = await client.start_new('orchestrator', None, json.dumps(message_body))
        else:
           raise Exception(f'not found valid {msg["id"]}')

这是 host.json 的一部分,这应该表明我正在使用 Azure Functions 的 2.0 版

  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[2.*, 3.0.0)"
  },

欢迎提出建议

A​​zure 服务总线队列有这个 Max Delivery Count 属性 您可以利用。考虑到您只想处理一条消息一次,然后在 Function 无法处理的情况下对该消息进行死信处理,您可以将最大传递计数设置为 1。这样,该消息将在第一次传递后自动变为死信。

默认情况下,如果在处理消息时没有异常,函数运行时会尝试自动完成消息。您不希望函数运行时执行此操作。为此,您需要做的是将 auto complete 设置为 false。但是,如果消息处理成功,您可能希望删除该消息,因此如果消息处理成功,您将需要手动调用自动完成。

类似于:

if 'valid' in msg:    
    instance_id = await client.start_new('orchestrator', None, json.dumps(message_body))
    //auto complete the message here...
else:
    //do nothing and the message will be dead-lettered

在撰写本文时,在 Python 中,无法 以死信方式交互发送消息。

我发现 autocomplete=false is only supported for C#

这基本上意味着使消息成为死信的唯一方法是引发异常,就像我在代码中所做的那样。

感谢@GauravMantri 为我指出了正确的方法(即看看如何使用自动完成配置参数)。