6

MassTransitを使用して、あるプロセスからそのイベントを処理する他のすべてのプロセスにイベントを発行することを考えています。私の環境では、そのイベントに登録されている複数のプロセスが同じボックスで実行されている可能性があります。

MassTransit のサンプル コードに基づいて、マルチキャストを処理しようとしない非常に単純な概念実証を次に示します (プロセスも多くのマシンに分散されます)。以下の「メッセージ」を「イベント」と見なし、このプロセスのすべてのインスタンスでそのメッセージを取得する必要があるとします。

using System;
using MassTransit;

namespace BasicPubSub
{
    public class Message
    {
        public String Text { get; set; }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            //initialize the bus
            var bus = ServiceBusFactory.New(sbc =>
            {
                sbc.UseMsmq();

                //cause the DTC and MSMQ to get installed/fixed if needed.
                sbc.VerifyMsDtcConfiguration();
                sbc.VerifyMsmqConfiguration();

                //sbc.UseMulticastSubscriptionClient();//Doesn't behave for a private queue.
                sbc.ReceiveFrom("msmq://localhost/test_queue");

                //Listen for interesting events.
                sbc.Subscribe(subs =>
                {
                    subs.Handler<Message>(msg => Console.WriteLine(msg.Text));
                });
            });

            //stay open until the user types "exit"
            var message = "";
            do
            {
                message = Console.ReadLine();
                //broadcast the message
                bus.Publish(new Message { Text = message });
            } while (message != "exit");
        }
    }
}

この C# アプリの複数のインスタンスを実行すると、メッセージを受信するインスタンスは 1 つだけですが、メッセージを受信するにはすべてのインスタンスが必要です。この動作は、キューの従来の概念と一致しているため、問題ありません。

私が知りたいのは、MSMQ/MassTransit を使用してすべてのサブスクライバーが受信するメッセージをパブリッシュできるかどうかです。これは、単一のサブスクライバーがデキューし、他のサブスクライバーが受信しないのとは対照的です。多分私はハンマーを使おうとしていて、絵筆が必要ですか?

ここで明確にするために、私はさまざまな種類のメッセージに対して 1 つのキューを共有することを考えているのではなく、MT と MSMQ を使用して、特定の種類のメッセージに対して「ピアツーピア」pub-sub をセットアップしようとしています。

4

1 に答える 1

1

ハンマーや絵筆についてはわかりませんが、正しい方向に向かっていると思います。

まず、バスの各インスタンスには、読み取るための独自のキューが必要です。この同じプログラムの複数のバージョンを実行している場合は、それらが異なるキューから読み取られていることを確認してください。同じキューから読み取ろうとすると、Bad Stuff(TM) が発生します。

さらに質問がある場合は、メーリング リストに参加してください。https://groups.google.com/forum/#!forum/masstransit-discuss .

パブリッシュする場合、すべてのコンシューマーは、サブスクライブ後にメッセージを受信する必要があります。起動時にサブスクリプション データがすべてのプロセスに渡されるまでに 1 ~ 2 秒かかる場合があります。

また、RabbitMQ も参照することをお勧めします。DTC が絶対に必要でない限り、RabbitMQ ははるかに堅牢なメッセージング プラットフォームです。

于 2012-08-09T15:43:55.327 に答える