gpt4 book ai didi

c# - 延迟消息并维护传递计数 Azure 服务总线

转载 作者:行者123 更新时间:2023-12-03 03:36:37 27 4
gpt4 key购买 nike

我们有一个场景,当我们从 Azure 服务总线队列中提取消息时,由于某种原因,如果其中一个下游出现故障,我们希望延迟消息并放回队列。我知道我们可以通过多种方式做到这一点(设置属性 ScheduledEnqueueTime 或使用 Schedule API),但无论哪种方式,我们都必须创建一条新消息并将其放回队列,这将丢失传递计数,并且还可能导致我们遇到的问题重复消息在哪里发送克隆和完成原始操作不是原子操作,其中之一会失败。

https://www.markheath.net/post/defer-processing-azure-service-bus-message

基于上面的文章,唯一的方法似乎是拥有我们的自定义属性,这仍然是唯一的方法,因为本文是在 2016 年写的。

最佳答案

安排回复新消息不会增加传递计数。正如你所说,发送消息和完成消息不是原子的,它可以在 transactions 的帮助下成为原子的。 ,从而确保属于给定操作组的所有操作要么共同成功,要么共同失败。

这是一个例子:

ServiceBusClient client = new ServiceBusClient("<connection-string>");
ServiceBusReceiver serviceBusReceiver = client.CreateReceiver("<queue>");
ServiceBusSender serviceBusSender = client.CreateSender("<queue>");

var message = await serviceBusReceiver.ReceiveMessageAsync();
// Your condition to handle the down stream
if (true)
{
using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
await serviceBusReceiver.CompleteMessageAsync(message);
var newMessage = new ServiceBusMessage(message);
newMessage.ScheduledEnqueueTime = new DateTimeOffset(DateTime.UtcNow.AddMinutes(1));
await serviceBusSender.SendMessageAsync(newMessage);
ts.Complete();
}
}

关于c# - 延迟消息并维护传递计数 Azure 服务总线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73128316/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com