2017-04-15 1 views
1

저는 메시지 브로커를 사용하는 초보자입니다.
우리는 여러 개의 서브 서비스가있는 발권 서비스를 가지고 있습니다. 수퍼바이저 서비스는 웹 API의 도움을 받아 요청을 받고 하위 서비스로 보냅니다.
모든 요청에는 명령 유형 (예 : 예약, 환불, 가용성 등)을 검색하는 데 사용되는 헤더가 있습니다. json을 사용하여 객체를 직렬화합니다.
이제 Supervisor 시스템과 같은 게시자로부터 MassTransit을 통해 다양한 메시지 유형 (다른 객체)을 보내는 방법, 소비자가 쉽게 사용할 수있는 방법?
일반적으로 MassTransit과 rabbitMQ에서 다양한 메시지 유형을 보낼 수 있습니까?
모든 소비자는 수신 된 메시지를 처리하기 위해 하나의 대기열 만 갖습니다.MassTransit 및 RabbitMQ로 다양한 명령 유형을 보내는 방법은 무엇입니까?

감사

업데이트

https://dotnetcodr.com/2016/08/02/messaging-with-rabbitmq-and-net-review-part-1-foundations-and-terminology/

내가이 게시물 MassTransit와 메시징에 시작에 맞게 읽고 다음에 다양한 메시지 유형을 사용하는 모든 예제를 참조하지 않았고 다른 리소스 :

여러 명령이 있으며 다양한 메시지 유형이 필요합니다. 그들과 함께 보내지 만 예에서 그러한 아래와 같은 메시지 유형을 사용 : 수신기

 private static void RunMassTransitReceiverWithRabbit() 
    { 
     IBusControl rabbitBusControl = Bus.Factory.CreateUsingRabbitMq(rabbit => 
     { 
      IRabbitMqHost rabbitMqHost = rabbit.Host(new Uri("rabbitmq://localhost:5672/Ticket"), settings => 
      { 
       settings.Password("Kalcho^Milano"); 
       settings.Username("ticketadmin"); 
      }); 

      rabbit.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.queues", conf => 
      { 
       conf.Consumer<RegisterCustomerConsumer>(); 
      }); 
     }); 

     rabbitBusControl.Start(); 
     Console.ReadKey(); 

     rabbitBusControl.Stop(); 
    } 

IRegisterCustomer

보낸 사람

private static void RunMassTransitPublisherWithRabbit() 
    { 
     string rabbitMqAddress = "rabbitmq://localhost:5672/Ticket"; 
     string rabbitMqQueue = "mycompany.domains.queues"; 
     Uri rabbitMqRootUri = new Uri(rabbitMqAddress); 

     IBusControl rabbitBusControl = Bus.Factory.CreateUsingRabbitMq(rabbit => 
     { 
      rabbit.Host(rabbitMqRootUri, settings => 
      { 
       settings.Password("Kalcho^Milano"); 
       settings.Username("ticketadmin"); 
      }); 
     }); 

     Task<ISendEndpoint> sendEndpointTask = rabbitBusControl.GetSendEndpoint(new Uri(string.Concat(rabbitMqAddress, "/", rabbitMqQueue))); 
     ISendEndpoint sendEndpoint = sendEndpointTask.Result; 

     Task sendTask = sendEndpoint.Send<IRegisterCustomer>(new 
     { 
      Address = "New Street", 
      Id = Guid.NewGuid(), 
      Preferred = true, 
      RegisteredUtc = DateTime.UtcNow, 
      Name = "Nice people LTD", 
      Type = 1, 
      DefaultDiscount = 0 
     }); 
     Console.ReadKey(); 
    } 

하는 인터페이스이며, 난 단지 얻을 수 있습니다 메시지 내용을 rabbit.ReceiveEndpoint에 입력하고 사용 가능한 개체로 변환하십시오.

이제 IReserveTicket, IRefundTicketIGetAvailability과 같은 다양한 메시지 유형을 사용하여 메시지를 보내고받는 방법은 무엇입니까?

다시 한번 감사

+1

문서를 읽었습니까? http://masstransit-project.com/MassTransit/usage/message-contracts.html –

+0

솔직히 말해서, 나는 당신의 문제를 이해하지 못합니다. 왜 당신은 당신이 메시지를 가지고 있고 그 메시지를 보내는 것처럼 많은 소비자를 만들 수 없습니까? 이슈가 뭐야? –

+0

나는 하나의 유형 이상의 메시지를 소비자에게 보낼 수 없다고 생각했기 때문에 시스템에있는 메시지의 모든 세부 사항을 포함하는 메시지로 디자인 된 복잡한 구조를 가지고 있으며 이는 잘못된 생각입니다. –

답변

2

당신이 당신의 엔드 포인트로 더 많은 소비자를 추가하는 경우,이

rabbit.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.queues", conf => 
{ 
    conf.Consumer<RegisterCustomerConsumer>(); 
    conf.Consumer<ReserveTicketConsumer>(); 
    conf.Consumer<RefundTicketConsumer>(); 
}); 

추천하고 그냥 작동합니다

await endpoint.Send<IReserveTicket>(new { TickedId = 123 }); 

같은 메시지를 보냅니다.

위의 솔루션은 부하가 크지 않은 것으로 가정합니다. 특히 한 가지 유형의 수백만 개의 메시지를 받고 다른 유형의 수백 가지가있을 수있는 경우에는 불균등 한로드가 발생합니다. 하나의 엔드 포인트에 모든 것을 갖는 것은 모든 소비자를위한 대기열이 하나뿐이므로 소비 불균형을 초래합니다. 이 경우, 필요한만큼의 엔드 포인트를 정의하지 못하며, 각 엔드 포인트마다 별도의 큐가 있어야합니다. 예를 들면 다음과 같습니다.

cfg.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.lowvolume", 
    c => 
    { 
     c.Consumer<RegisterCustomerConsumer>(); 
     c.Consumer<RefundTicketConsumer>(); 
    }); 
cfg.ReceiveEndpoint(rabbitMqHost, "mycompany.domains.highvolume", 
    c => c.Consumer<ReserveTicketConsumer>(); 

큐가 다르므로이 주소를 사용하여 끝점을 보내야합니다.

관련 문제