我的应用程序有一个.net核心微服务处理通知,它已部署在Kubernetes.在那里NotificationRequestConsumer如下,(请注意,这只是一个代码片段,以阐述我的问题)
public class NotificationRequestConsumer : IConsumer<INotificationRequest>
{
public NotificationRequestConsumer()
{
}
public Task Consume(ConsumeContext<INotificationRequest> context)
{
// notification request logic goes here
return Task.CompletedTask;
}
}
在启动时如何配置主传输。
public static IServiceCollection AddMassTransitConnection(this IServiceCollection services, IConfiguration configuration)
{
services.AddMassTransit(x =>
{
x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(c =>
{
c.Host(configuration["RabbitMQ:HostUrl"]);
c.ConfigureEndpoints(context);
}));
x.AddConsumer<NotificationRequestConsumer>(c => c.UseMessageRetry(r => r.Interval(1,500)));
});
services.AddMassTransitHostedService();
return services;
}
根据上面的代码,我已经设置了几毫秒的间隔,如果在警报处理过程中发生任何错误,我将重试。如果有问题,我将使用fault consumer将相关请求的数据存储在DB中,以供将来使用(将来手动发送相关通知)。
public class NotificationRequestFaultConsumer : IConsumer<Fault<INotificationRequest>>
{
public Task Consume(ConsumeContext<Fault<INotificationRequest>> context)
{
//For future use, I store the relevant data here
return Task.CompletedTask;
}
}
即使我这样做了,相关的异常也会被添加到RabbitMQ错误队列中。
我关注如下:
1.错误队列的持续增长是否会导致群集崩溃?
1.只记录到ELK Stack而不抛出异常并且不将它们添加到RabbitMQ错误队列中,这是一种好的方法吗?
1.是否有可能给予特定的过期条件来自动删除错误队列?这是一个好主意吗?
1条答案
按热度按时间k5hmc34c1#
您可以使用
dead-letter-queues
,这是rabbitMQ内置的机制,用于在refering the official documentation的情况下处理消息:1.使用者使用basic.reject或basic.nack并将queue参数设置为false来否定地确认消息。
1.由于每个消息的TTL,消息过期;或
1.由于消息的队列超过了长度限制,因此将删除该消息