2017-04-15 129 views
1

我是使用消息代理的初學者。
我們有一個有多種子服務的票務服務。主管服務通過Web API獲取請求並將其發送到子服務。
任何請求都有一個標題,用於檢測命令類型(如保留,退款,可用性等)。我們使用json來序列化對象。
現在,如何通過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 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(); 
    } 

接收機

 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是一個接口,我只能得到郵件內容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>(); 

只要記住,既然你有不同的隊列,你需要使用這些地址發送獲取端點。