我想實現一個解決方案,使用RabbitMQ來實現像分佈式RPC一樣的使用一個請求和一個響應隊列的大量處理器,我已經實現了這樣的解決方案與Apache Apollo和我本來希望能夠將其遷移到RabbitMQ。這裏的關鍵點:RabbitMQ:使用路由來實現消息選擇
- 每個服務器的連接請求隊列只
- 每個服務器流程,應該是他(報頭字段)
我在執行阿波羅請求關鍵點是使用選擇器(比如標題字段值的where子句),我認爲這是通過路由和路由密鑰在RabbitMQ中實現的,但是我一定是錯的,因爲我看到工作人員接收不應該是他們的消息。
爲了複製問題,我修改了路由示例(http://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html),我有兩個使用者,我可以從定義routingKey的不同參數開始,併爲一個使用者生成消息。我看到的行爲是消費的消費似乎是隨機的(第一次消費者'約翰'的消息由消費者處理'約翰',第二次消費者處理'瑪麗')
有沒有人有指示或代碼片段在RabbitMQ中使用選擇器?
下面我爲消費者代碼:
public static void Main(String[] args)
{
var factory = new ConnectionFactory { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
const String request = "request";
channel.ExchangeDeclare(request, "direct");
channel.QueueDeclare(request, true, false, false, null);
if (args.Length < 1)
{
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
Environment.ExitCode = 1;
return;
}
var myRoutingKey = args[0];
channel.QueueBind(request, request, myRoutingKey);
Console.WriteLine($" [*] Waiting for messages for {myRoutingKey}.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
var routingKey = ea.RoutingKey;
Console.WriteLine($" [x] Received '{routingKey}':'{message}'");
};
channel.BasicConsume(request, true, consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
和製片人:
public static void Main(String[] args)
{
var factory = new ConnectionFactory { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
const String request = "request";
channel.ExchangeDeclare(request, "direct");
channel.QueueDeclare(request, true, false, false, null);
var routingKey = args.Length > 0 ? args[0] : "John";
const String message = "Hi";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(request, routingKey, null, body);
Console.WriteLine($" [x] Sent '{routingKey}':'{message}'");
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
在此先感謝。
嗨阿敏,謝謝你的回答。我還發現,使用動態生成的隊列不會出現問題。無論如何,我只是在尋求一個只有一個請求和一個響應隊列的解決方案,這是因爲性能方面的問題,以及我之前與其他經紀人實施的解決方案之間的這種解決方案。認識到不同的模型後者不是問題,只需要重新設計,但我肯定需要驗證性能。 – Leon
此外,通過使用動態生成的隊列,我可以釋放生產者發送的所有消息,這些消息是在路由使用者未運行時生成的。我也試圖宣佈交易所持久,但它沒有幫助。 – Leon
動態生成的隊列本質上是臨時隊列,因爲你將失去我假設的隊列名稱?我不認爲動態隊列名稱將會成爲您使用一致名稱的解決方案(將它們視爲您的選擇器)。這樣做沒有性能問題。這就是RabbitMQ的設計目的。 –