gpt4 book ai didi

c#-4.0 - C# Masstransit 如何在队列不可用或关闭时处理异常

转载 作者:行者123 更新时间:2023-12-01 11:23:43 25 4
gpt4 key购买 nike

我正在使用带有 RabbitMQ 的 Masstransit 来使用来自队列的消息。谁能告诉我当队列关闭或无法获取消息时如何处理异常?以下是我的设置:

    var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri(configManager.RabbitMqUrl), h =>
{
h.Username(configManager.RabbitMqUserName);
h.Password(configManager.RabbitMqPassword);
});

cfg.ReceiveEndpoint(host, RabbitMqConstants.Change, e =>
{
e.UseRetry(Retry.Immediate(configManager.ProcessorRetryNumber));
e.Handler<ChangeDetected>(context =>
{
var task = Task.Run(() => consumer.Consume(context));
return task;
});
});
});

谢谢

最佳答案

在我们内部的 RabbitMQ 消息传递实现中,我们已经通过两种方式接近/解决了这个问题的发布端(当想要发布时代理不可用):

[1] 我们使用 Polly异步编排有限数量的发布重试(尝试之间有延迟)。这克服了与代理的连接丢失是一个小网络故障的情况。

[2] 如果所有重试发布失败,我们使用“消息医院”的概念:我们将有关发布失败消息的足够详细信息存储到替代源(数据库;额外故障转移到本地文件存储),例如如果需要,我们可以稍后重新发布失败的消息。 “存储转发”的变体(我们可以批量重新发布,但我们也允许人工干预来选择是否重新发布)。

一切都取决于“永不丢失消息”对您的重要性。 RabbitMQ 代理的一些冗余(如 Chris Patterson 建议的集群或联合)也是一个明显的步骤。如果您失去/想要对一个/一些经纪人进行维护,集群/联合会为您提供保护。如果由于某种原因消息发布者看不到任何 RabbitMQ 代理(例如发布者附近的网络故障),上面的弹性策略 [1]、[2] 会为您提供保护。

关于c#-4.0 - C# Masstransit 如何在队列不可用或关闭时处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508535/

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