RabbitMQ를 사용하여 하나의 요청과 하나의 응답 큐를 사용하여 분산 RPC와 같은 솔루션을 구현하려고합니다. 이미 많은 솔루션을 구현했습니다. Apache Apollo와 함께 RabbitMQ로 마이그레이션 할 수 있기를 원했을 것입니다. 여기서 중요한 포인트는RabbitMQ : 메시지 선택을 위해 라우팅 사용
- 각 서버는 요청 큐에 연결 아폴로 내 구현에서 (헤더 필드)
을 그를 위해 있어야하는
문제를 재현하기 위해 라우팅 샘플 (http://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html)을 수정 했으므로 routingKey를 정의하는 여러 매개 변수와 소비자 중 하나에 대한 메시지를 생성 한 생산자로 시작할 수있는 두 명의 소비자가 있습니다. 내가 보는 행동은 메시지의 소비가 무작위로 보인다는 것입니다 ('John'은 소비자가 처음 'John'을, 소비자가 'Mary'를 두 번째로 처리 함)
아무도 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();
}
감사합니다.
안녕하세요 Amin, 답변 주셔서 감사합니다. 동적으로 생성 된 대기열을 사용하면 문제가 발생하지 않는다는 것도 발견했습니다. 어쨌든 성능에 대한 우려 때문에 그리고 다른 브로커와 함께 구현 한 다른 솔루션이 그 종류 였기 때문에 요청과 응답 대기열로만 솔루션을 찾고있었습니다. 후자는 문제가 아니며 약간의 재 설계가 필요하지만 다른 모델을 인식 한 후에는 반드시 성능을 검증해야합니다. – Leon
또한 동적으로 생성 된 대기열을 사용하면 라우팅 소비자가 실행되지 않는 동안 생성 된 모든 메시지가 손실됩니다. 나는 또한 교환기를 내구성으로 선언하려했지만 도움이되지 않습니다. – Leon
동적으로 생성 된 큐는 본질적으로 내가 생각한 큐의 이름을 잃어 버리기 때문에 임시 큐가 될 것입니까? 동적 큐 이름이 일관성있는 이름을 사용하는 솔루션 일 수 있다고 생각하지 않습니다. 이러한 이름을 실제로 선택자로 생각하십시오. 이런 식으로하는 것은 성과가 없습니다. 이것은 RabbitMQ가 설계된 것입니다. –