c# - 如何将消息放入死信并在天蓝色函数中经过一段时间后处理它
问题描述
我有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.
解决方案
如果由于用于处理该消息的特定资源暂时不可用而无法处理消息,但不应立即暂停消息处理,则将该消息搁置几分钟的一种方法是记住调度消息中的序列号几分钟后发布,并在预定消息到达时重新检索延迟消息。
有关如何在 Azure 函数 v2 中执行延迟的示例,请参阅此答案。请注意,输入绑定使用消息类型Message
,并且还使用注入的MessageReceiver
. 这些都是能够调用DeferAsync
的。服务总线触发器的模板代码将消息类型设置为字符串,因此您必须按照该答案中的说明更改签名。
关于延迟消息:
延迟消息与所有其他活动消息一起保留在主队列中(与存在于子队列中的死信消息不同),但无法再使用常规 Receive/ReceiveAsync 函数接收它们。要检索延迟消息,其所有者负责在延迟消息时记住序列号。任何知道延迟消息序列号的接收者稍后都可以使用 Receive(sequenceNumber) 显式接收消息。
如何调度具有延迟消息序列号的消息,以便稍后可以处理延迟消息:
您可以通过在通过常规发送路径发送消息时设置 ScheduledEnqueueTimeUtc 属性来调度消息,或者使用 ScheduleMessageAsync API 显式调度消息
推荐阅读
- angular - 在子组件属性中更改 @Input() 会阻止父组件的进一步更新
- jquery - selectize.js 多下拉输入位置
- python - 在 python 中处理大型请求响应(JSON 对象数组)
- r - 如何对每组数据框应用函数
- admob - 删除后如何添加admob付款方式?
- arrays - 将 JSON 转换为 Twig 循环数组
- javascript - rel="preload" 如何影响 window.onload?
- php - 如何从现代事件日历插件中获取元数据
- xml - 在 Android Studio 中从图库中将图像片段加载和存储到 SQLite 数据库
- esp8266 - 如何在 ESP8266 或 ESP32 上停止 /main.py