MassTransit Round-Robin余额会一直将消息发送到同一队列,即使它很忙

问题描述 投票:0回答:1

我正在尝试为我的应用程序使用RabbitMQ设置MassTransit。

我正在使用CastleWindsor DI和.Net Framework 4.7。

我在Program.cs中注册消费者和公交车的方式是:

container.AddMassTransit(x =>
{
    x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(configurationProvider.RabbitHostName);

        x.AddConsumer<FactAddedFirstHandler>();
        x.AddConsumer<FactAddedSecondHandler>();

        cfg.ReceiveEndpoint("addedFactQueue", ec =>
        {    
            cfg.ConfigureEndpoints(container);
        });
    }));

});

IBusControl busControl = container.Kernel.Resolve<IBusControl>();
busControl.StartAsync();

处理程序的示例是:

internal class FactAddedFirstHandler : IConsumer<FactAddedEvent>
{

    public async Task Consume(ConsumeContext<FactAddedEvent> context)
    {
        //Do stuff
    }
}

让我们将此主要运行的应用程序简称为Application。我想要实现的是2种不同的东西:

1)每当(从另一个服务)抛出FactAddedEvent时,Application会将消息传递给两个使用者:FactAddedFirstHandler和FactAddedSecondHandler。

这是正确的,因为如果我理解正确,MassTransit会创建一个交换并将该消息传递给所有订阅该消息的使用者。

2)如果我运行2个Application实例(我们称它们为Application1Application2),则将应用Round-Robin。意味着RabbitMQ将消息平衡到Application空闲状态。

此情况部分正确。这意味着,如果我同时都已启动并且正在尝试发送FactAddedEvent,则一次由[[Application1接收事件,而一次由Application2接收事件。另外,例如,如果我将Application2调低,则所有消息都将由Application1接收。到目前为止,一切正常。

问题:

我自愿阻止时出现的问题,例如Application1。假设我发送FactAddedEvent,它被Application1接收,但是在处理程序的使用方法中,我设置了一个断点,然后在此处等待。因此,我在这里自愿阻止Application1。现在,我期望的是,由于Application1被阻止,因此RabbitMQ将把我抛出的所有下一个事件传递给仅Application2。取而代之的是,它是:RabbitMQ一旦将其发送到Application1,就将其发送到Application2,无论如何。因此,即使Application2可以自由工作,在Application1中也会堆积一堆消息。我做错了什么?在此先感谢

我正在尝试为我的应用程序使用RabbitMQ设置MassTransit。我正在使用CastleWindsor DI和.Net Framework 4.7。我在Program.cs中注册消费者和公交车的方式是:container ....

.net rabbitmq castle-windsor masstransit
1个回答
0
投票
RabbitMQ通道具有PrefetchCount,这是代理在暂停等待那些消息被确认之前,代理将发送给使用者的未确认消息的数量。默认情况下,MassTransit将此设置为16,或CPU内核数x 2,以较大者为准。此设置适用于每个接收端点。
© www.soinside.com 2019 - 2024. All rights reserved.