公共交通和广播
MassTransit and Broadcasting
我正在尝试在多个应用程序之间启动一个消息传递系统运行。我有一个 RabbitMQ 运行 的实例,看起来没问题。我可以将多个 subscribers/publisher 连接到 RabbitMQ 实例,它们看起来没问题。然后我可以从一个发布者发布消息,但只有一个订阅者收到消息。
我认为这与我建立队列的方式有关。我看过关于 Rabbit 的教程,https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html,但我不知道如何将其转换为 Masstransit 库。
我这辈子都无法弄清自己做错了什么。
NuGets:
- MassTransit.Extensions.DependencyInjection 5.3.2
- MassTransit.RabbitMQ 5.3.2
有人可以帮忙吗?
// 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
)。
我正在尝试在多个应用程序之间启动一个消息传递系统运行。我有一个 RabbitMQ 运行 的实例,看起来没问题。我可以将多个 subscribers/publisher 连接到 RabbitMQ 实例,它们看起来没问题。然后我可以从一个发布者发布消息,但只有一个订阅者收到消息。
我认为这与我建立队列的方式有关。我看过关于 Rabbit 的教程,https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html,但我不知道如何将其转换为 Masstransit 库。
我这辈子都无法弄清自己做错了什么。
NuGets:
- MassTransit.Extensions.DependencyInjection 5.3.2
- MassTransit.RabbitMQ 5.3.2
有人可以帮忙吗?
// 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
)。