首页 > 解决方案 > 如何将消息放入死信并在天蓝色函数中经过一段时间后处理它

问题描述

我有azure function which trigger when we ave new message into service bus topic.

在 azure 函数中,我checked the customer api is available or not通过调用它并检查它的status code.

如果状态码为 200,我需要处理消息,否则将此消息放入死信,并在客户 api 可用的一段时间后处理所有死信消息。

 public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([ServiceBusTrigger("customer-order", "customer-order", Connection = "")]string mySbMsg, ILogger log)
        {
            // 1.call customer api to check it is available or not 
            // 2.if it is up and running then process the message else put message into dead-letter 
            // and after some interval when customer ai is available process dead-letter messages

            log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
        }
    }

我也可以customer api使用 HTTPClient 调用并处理消息。

但是如何将消息放入死信以及如何在客户 api 可用时在一段时间后执行死信?

提议的流程将是

在 azure 函数应用程序中,如果有新消息,它将触发。

主题开始步骤 - 检查 api 是否可用,如果 api 可用则关闭

如果 api 关闭则处理当前消息然后不处理

在这里留言我们有两个选择

1a.put current message into dead letter  

1b.put current message back into main but if we do this then again function app will trigger as its new message trigger based and start step will continue.

标签: c#azureazure-functionsazureservicebus

解决方案


与其将其放入死信队列,更好的方法是将消息延迟一段时间。

如果由于用于处理该消息的特定资源暂时不可用而无法处理消息,但不应立即暂停消息处理,则将该消息搁置几分钟的一种方法是记住调度消息中的序列号几分钟后发布,并在预定消息到达时重新检索延迟消息。

有关如何在 Azure 函数 v2 中执行延迟的示例,请参阅此答案。请注意,输入绑定使用消息类型Message,并且还使用注入的MessageReceiver. 这些都是能够调用DeferAsync的。服务总线触发器的模板代码将消息类型设置为字符串,因此您必须按照该答案中的说明更改签名。

关于延迟消息:

延迟消息与所有其他活动消息一起保留在主队列中(与存在于子队列中的死信消息不同),但无法再使用常规 Receive/ReceiveAsync 函数接收它们。要检索延迟消息,其所有者负责在延迟消息时记住序列号。任何知道延迟消息序列号的接收者稍后都可以使用 Receive(sequenceNumber) 显式接收消息。

如何调度具有延迟消息序列号的消息,以便稍后可以处理延迟消息:

您可以通过在通过常规发送路径发送消息时设置 ScheduledEnqueueTimeUtc 属性来调度消息,或者使用 ScheduleMessageAsync API 显式调度消息


推荐阅读