正确的处理Rabbitmq的方法在使用持久队列的masstransit中失败



我使用rabbitmq-masstransit来使用请求/响应机制交换消息,一切都很好。一个应用程序使用持久队列,另一个使用临时队列。但当创建rabbitmq-磁盘警报时,rabbitmq被标记为不健康,并自动重新启动它,然后在重新启动rabbitmq容器并标记为健康(释放磁盘空间(后,具有持久队列的应用程序无法重新连接。在我使用了临时队列而不是持久队列之后,问题就消失了,因为应用程序每次重新连接时都会重新创建队列,但当rabbitmq容器出现故障或被终止时,所有消息都会消失。应用程序在等待响应时被阻止。

问题:

如何确保应用程序在每次rabbitmq失败时重新连接,并在rabbitmq恢复正常后保持数据的存在和重新使用。这是我为持久队列配置的masstransit。

services.AddHealthChecks();
//---> config Masstransit to consume messages 
services.AddMassTransit(x =>
{
x.AddConsumer<RequestsConsumer>(con=> {
con.UseMessageRetry(x => x.Intervals(500, 1500, 2000, 2500)); 
}).Endpoint(e=> 
{
e.PrefetchCount = 32;
}
);
x.UsingRabbitMq((context, config) =>
{
config.Host(new Uri(Configuration.GetSection("RabbitMqConfig:RabbitMqAdress").Value), h =>
{
Action<IRabbitMqHostConfigurator> configure = h =>
{
h.Heartbeat(TimeSpan.FromSeconds(120));
};
h.Username(Configuration.GetSection("RabbitMqConfig:RabbitMqUser").Value);
h.Password(Configuration.GetSection("RabbitMqConfig:RabbitMqSecret").Value);

});


config.ConfigureEndpoints(context,new KebabCaseEndpointNameFormatter("prefix-queue-name",false));
});

services.AddMassTransitHostedService();
});

容器中的数据丢失是由于您没有在Kubernetes或Docker中映射持久卷。如果将队列数据存储在容器本身中,则当回收该容器时,所有队列数据都将丢失。

我建议研究如何为RabbitMQ数据库和队列存储配置持久卷,以便回收容器不会丢失队列数据。

哦,这与MassTransit无关。

最新更新