使用MassTransit使用交换和路由密钥发布消息

我一直在看MassTransit几个星期了,我很好奇这些可能性。 但是,我似乎无法将这些概念完全正确。

预期的行为我想用路由密钥将消息发布到“直接”交换,路由密钥绑定到两个不同的队列以执行其他活动。

当我使用MassTransit尝试相同的逻辑以获得更好的可伸缩性时。 我发现MassTransit基于具有扇出类型的队列名称创建自己的交换。

通过交换和路由密钥发布消息的经典代码

using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange, "direct"); var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange, routingKey, null, body); Console.WriteLine(" [x] Sent {0}", message); } } 

有没有办法在MassTransit中使用routingkey配置直接或主题交换?

MassTransit不支持这种情况。 MassTransit将始终创建扇出队列。 如果您自己管理拓扑,则可以使用IEndpoint.Send直接将消息发送到您创建的交换。 在这种情况下,你会放弃很多MT提供的东西。

在这种情况下,我也不确定“更好的可扩展性”意味着什么。 扇出交换比直接交换(大多数情况下)更好,因为没有需要处理的路由逻辑。

也许如果您在MassTransit邮件列表中澄清了您的性能问题,我们可以在那里帮助您。

MassTransit在不使用主题交换的情况下处理发布和订阅,而是为正在发布的消息类型创建交换,并将这些交换绑定到使用者队列。

使用RabbitMQ的路由密钥方法效率较低,RabbitMQ更喜欢使用交换结构来简化消息路由(无需维护哈希表)。

不要处理交换和路由键,只需定义命令和/或事件类型,发送或发布这些消息,让消费者完成他们的工作。