[英]Publish message using exchange and routing key using 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更喜歡使用交換結構來簡化消息路由(不需要維護哈希表)。
不要處理交換和路由鍵,只需定義命令和/或事件類型,發送或發布這些消息,讓消費者完成他們的工作。
以下代碼執行相同的工作,但有一個額外的扇出交換:
TestMessage(直接交換) - > TestMessage_Queue(扇出交換) - > TestMessage_Queue(隊列)
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.Send<TestMessage>(x => { x.UseRoutingKeyFormatter(context => "routingKey"); });
cfg.Message<TestMessage>(x => x.SetEntityName("TestMessage"));
cfg.Publish<TestMessage>(x => { x.ExchangeType = ExchangeType.Direct; });
cfg.ReceiveEndpoint(host, "TestMessage_Queue", e =>
{
e.BindMessageExchanges = false;
e.Consumer<UpdateCustomerConsumer>();
e.Bind("TestMessage", x =>
{
x.ExchangeType = ExchangeType.Direct;
x.RoutingKey = "routingKey";
});
});
});
bus.Start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.