2017-04-15 9 views
1

私はメッセージブローカーの初心者です。
私たちは複数のサブサービスを持つ発券サービスを持っています。スーパバイザサービスは、Web APIの助けを借りて要求を取得し、それらをサブサービスに送信します。
リクエストには、コマンドの種類(予約、払い戻し、空き状況など)を検出するためのヘッダーがあります。私たちはjsonを使ってオブジェクトを直列化します。
マストランスミットは、スーパバイザシステムなどのパブリッシャーからさまざまなメッセージタイプ(さまざまなオブジェクト)を、消費者が簡単に使用できるように送信する方法を教えてください。
一般的に、MassTransitとrabbitMQでさまざまなメッセージタイプを送信できますか?
すべてのコンシューマには、受信したメッセージを処理するキューが1つしかありません。私はこの記事はMassTransitとメッセージングで起動するに合わせ、これらの様々なメッセージタイプを使用して任意の例を見ていないと読んMassTransitとRabbitMQでさまざまなコマンドタイプを送信する方法は?

おかげ

更新

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

別のリソース:

私は複数のコマンドがあり、さまざまなメッセージタイプが必要です彼らと一緒に送るが、例にのみ、以下のようなメッセージ・タイプを使用する:レシーバ

 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

私はそれが消費者に送られる1種類以上のメッセージではないと考えました。したがって、システム内のメッセージのすべての詳細を含むメッセージで設計された複雑な構造を持ち、この考え方は間違っています。 –

答えて

2

あなたのエンドポイントへより多くの消費者を追加する場合は、この

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

のような、それがうまく動作します

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

のようなメッセージを送信します。

上記の解決策は、負荷が重くないことを前提としています.1つのタイプの数百万のメッセージが得られ、数百種類のその他のタイプがある場合は特に負荷が異なります。 1つのエンドポイントにそれらのすべてを置くと、すべての消費者に対して1つのキューしかないので、消費の不均衡が生じます。このような場合、必要な数のエンドポイントを定義することを止めるものはなく、それぞれに別々のキューが必要です。たとえば、次のように

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

ちょうどあなたが別のキューを持っているので、あなたはエンドポイントを送信得るためにこれらのアドレスを使用する必要があることを覚えておいてください。

関連する問題