2015-07-05 2 views
0

У меня есть два типа узлов. A Server и a Client. Там будет 1 или более Server или Client в настоящее время работает.MassTransit RPC (RabbitMQ) тайм-аут с несколькими клиентами

Использование MassTransit и RabbitMQ, я получаю таймаут при попытке описанного шаблона RPC here.

Код для Server и Client прост, для тестирования.

Код для Server

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serviceBus = ServiceBusFactory.New(sbc => 
     { 
      sbc.UseRabbitMq(); 
      sbc.ReceiveFrom("rabbitmq://192.168.10.201/mybus_responder"); 

      sbc.Subscribe(x => 
      { 
       x.Handler<TestEvent>((ctx, @event) => 
       { 
        Console.WriteLine("Received message " + @event.Message); 
        ctx.Respond(new TestEventResponse { Response = "Processed message \"" + @event.Message + "\"" }); 
       }); 

       x.Handler<TestEvent2>((ctx, @event) => 
       { 
        Console.WriteLine("Received message " + @event.Message); 
        ctx.Respond(new TestEventResponse2 { Response = "Processed message \"" + @event.Message + "\"" }); 
       }); 
      }); 
     }); 

     Console.WriteLine("Listening for events..."); 
     Console.ReadLine(); 
    } 
} 

код для Client

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serviceBus = ServiceBusFactory.New(sbc => 
     { 
      sbc.UseRabbitMq(); 
      sbc.ReceiveFrom("rabbitmq://192.168.10.201/mybus"); 
     }); 

     Console.WriteLine("Ready to send events..."); 

     var eventType = false; 

     while (true) 
     { 
      eventType = !eventType; 

      var message = Path.GetFileNameWithoutExtension(Path.GetRandomFileName()); 

      Console.WriteLine("Sending message " + message); 

      if (eventType) 
      { 
       serviceBus.PublishRequest(new TestEvent {Message = message}, configurator => 
       { 
        configurator.Handle<TestEventResponse>(response => 
        { 
         Console.WriteLine(response.Response); 
        }); 
        configurator.SetTimeout(TimeSpan.FromSeconds(5)); 
       }); 
      } 
      else 
      { 
       serviceBus.PublishRequest(new TestEvent2 {Message = message}, configurator => 
       { 
        configurator.Handle<TestEventResponse2>(response => 
        { 
         Console.WriteLine(response.Response); 
        }); 
        configurator.SetTimeout(TimeSpan.FromSeconds(5)); 
       }); 
      } 
     } 
    } 
} 

Если я бегу ровно 1 каждого типа узла, команды/ответы, как ожидалось. Если у меня есть более 1 Server экземпляров, команды/ответы выполняются так, как ожидалось, распределение Client равномерно распределяется между каждым узлом `` `Server``.

Однако, если у меня есть несколько запущенных экземпляров Client, я получу тайм-ауты на стороне `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` `` ``.

Почему это? Мне нужна поддержка нескольких экземпляров `` `Client``, потому что это мой веб-уровень.

+0

Измените клиента на использование rabbitmq: //192.168.10.201/*? Tempor = true, и вы получите уникальную временную очередь для каждого клиента. –

ответ

2

Do, я считаю, это просто потому, что вы в конечном итоге обмениваете очередь между экземплярами, и они сожрали сообщения друг друга. Каждому клиенту и серверу нужна уникальная очередь для чтения.

+0

Я не знаю, как MassTransit заставляет вас управлять очередями. Я просто попробовал это в EasyNetQ, и он работал безупречно. Настройка была намного проще. Я решил не использовать MassTransit. Это хорошо для транспортно-агностических реализаций, но для меня это слишком упрямо. –

Смежные вопросы