C# 在azure函数中,如何将消息放入死信并在一段时间后进行处理

C# 在azure函数中,如何将消息放入死信并在一段时间后进行处理,c#,azure,azure-functions,azureservicebus,C#,Azure,Azure Functions,Azureservicebus,我有azure函数,当我们将新消息发送到服务总线主题时触发该函数。 在azure函数中,我通过调用客户api并检查其状态代码来检查客户api是否可用 如果状态代码为200,我需要处理该消息,否则将该消息放入死信中,并在客户api可用的一段时间后,再处理所有死信消息 public static class Function1 { [FunctionName("Function1")] public static void Run([ServiceBusTr

我有
azure函数,当我们将新消息发送到服务总线主题时触发该函数。

在azure函数中,我通过调用客户api并检查其状态代码来检查客户api是否可用

如果状态代码为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}");
        }
    }
我可以使用HTTPClient调用
客户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}");
        }
    }
但是,如何将消息放入死信,如何执行死信呢 客户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.

与其把它放在死信队列中,更好的方法是在一定的时间内完成

如果由于某个特定资源无法处理某个消息 处理该消息暂时不可用,但无法处理该消息 处理过程不应该被立即中止,这是一种说法 旁边几分钟的信息是要记住 SequenceNumber在几分钟内发布的计划邮件中, 并在计划的消息返回时重新检索延迟的消息 到了

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

关于延迟邮件:

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

如何安排具有延迟消息序列号的消息,以便在以后处理延迟消息:

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


通常,一旦成功处理消息,您需要从队列中删除该消息。如果消息未被删除,它将重新出现以进行处理。您现在可以多次配置队列,在消息最终进入case letter队列之前,应该尝试对其进行处理。在函数中,如果API不可用,则不应删除消息。您需要为此编写另一个函数。您需要解决另一个问题。我同意@ChetanRanpariya的观点,让我给你一个合适的解决方法。您将需要一个新函数来处理死信队列消息。这可能是一个计时器触发的函数,它将每隔一段时间启动,检查客户API是否正在运行,如果正在运行,则处理消息。或者停止代码复制-将消息放回服务总线队列,由原始函数处理。@Neo您不会立即这样做。计时器触发的函数将在原始函数执行后的某个时间运行,并检查API是否可用。如果它不是在线的,那就什么都不要做。如果它是在线的,那么将消息放在原始队列中,它将得到处理,因为您知道API是可用的。最坏的情况是,它会回到死信状态,稍后再试-但这个API多久会不可用?它可以是同一个函数而不是单独的函数吗?是的。在您的示例中,在run方法中,一旦检测到依赖服务关闭,您可以选择调用
DeferAsync
,还可以将a推送到队列中。延迟调用将导致消息保留在队列中,但不会推送到侦听器。当侦听器接收到计划消息时,它可以在该点检索延迟消息。上面我的答案中的第一个链接描述了这种模式。