公共交通和广播

MassTransit and Broadcasting

我正在尝试在多个应用程序之间启动一个消息传递系统运行。我有一个 RabbitMQ 运行 的实例,看起来没问题。我可以将多个 subscribers/publisher 连接到 RabbitMQ 实例,它们看起来没问题。然后我可以从一个发布者发布消息,但只有一个订阅者收到消息。

我认为这与我建立队列的方式有关。我看过关于 Rabbit 的教程,https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html,但我不知道如何将其转换为 Masstransit 库。

我这辈子都无法弄清自己做错了什么。

NuGets:

有人可以帮忙吗?

        // Register MassTransit
        services.AddMassTransit(mtCfg =>
        {
            mtCfg.AddConsumer<DomainMessageConsumer>();

            mtCfg.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(rbCfg =>
            {
                var host = rbCfg.Host(settings.RabbitMq.Host, settings.RabbitMq.VirtualHost, h =>
                {
                    h.Username(settings.RabbitMq.Username);
                    h.Password(settings.RabbitMq.Password);
                });

                rbCfg.ReceiveEndpoint(host, settings.RabbitMq.ConnectionName, ep =>
                {
                    ep.PrefetchCount = 16;
                    ep.UseMessageRetry(x => x.Interval(2, 100));

                    ep.ConfigureConsumer<DomainMessageConsumer>(provider);
                });
            }));
        });

您遇到的问题是因为您在所有消费者上使用相同的队列名称。如果你想向所有消费者广播,你应该让所有的队列名都是唯一的。在您的代码示例中,您应该为每个消费者设置唯一的 settings.RabbitMq.ConnectionName 变量。

检查下图并想象 Subscription B 是您设置的队列 settings.RabbitMq.ConnectionName。你会得到的是图片的左边部分,只有 Subscriber B1 收到(实际上是循环平衡,但这是跑题了)。如果你想广播,你可以创建单独的订阅(或者在你的例子中 settings.RabbitMq.ConnectionName)。