处理RabbitMQ错误队列的最理想方式

8i9zcol2  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(158)

我的应用程序有一个.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.是否有可能给予特定的过期条件来自动删除错误队列?这是一个好主意吗?

k5hmc34c

k5hmc34c1#

您可以使用dead-letter-queues,这是rabbitMQ内置的机制,用于在refering the official documentation的情况下处理消息:
1.使用者使用basic.reject或basic.nack并将queue参数设置为false来否定地确认消息。
1.由于每个消息的TTL,消息过期;或
1.由于消息的队列超过了长度限制,因此将删除该消息

相关问题