【问题标题】:Azure Function Python - serviceBusTrigger - How to deadletter a messageAzure Function Python - serviceBusTrigger - 如何死信消息
【发布时间】:2021-08-02 17:54:22
【问题描述】:

我有一个简单的 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)"
  },

欢迎提出建议

【问题讨论】:

  • 您可以将最大传递计数设置为 1,并设置队列属性以在传递计数达到最大值时对邮件进行死信。您还需要将自动完成设置为 false,以便函数运行时不会自动删除消息。这种方法行得通吗?
  • @GauravMantri 感谢您的建议,但问题是如何“将队列上的属性设置为死信”
  • 我相信你可以通过 Azure Portal 做到这一点。
  • 我的意思是如何死信消息,而不是引发异常。
  • 您无需执行任何操作。服务总线会处理它。让我添加我的想法作为答案,您可以尝试一下。

标签: python azure-functions azureservicebus


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    默认情况下,如果在处理消息时没有异常,函数运行时会尝试自动完成消息。您不希望 Function 运行时执行此操作。为此,您需要将 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
    

    【讨论】:

    • 感谢您的回答,但仍然不清楚如何自动完成,您能否添加一段代码来解释?需要明确的是,查看 azure 文档我无法理解。我不确定这是否可能。看来Python实现缺少这部分。
    • 不幸的是,我不熟悉用于 Azure 服务总线的 Python SDK,但您可以使用一种名为 complete_message 的方法。详情请参阅:github.com/Azure/azure-sdk-for-python/blob/…。 HTH。
    • 我明白了。好吧,无论如何再次感谢您的帮助:)
    • 我发现这是不可能的。我刚刚回答了我自己的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 2018-03-23
    • 2019-10-22
    • 1970-01-01
    • 2021-05-06
    • 2022-01-25
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多