ServiceStack.Redisの理解を求めています:IRedisClient.PublishMessageとIMessageQueueClient.Publish

Aug 17 2020

とを分離するのに苦労していてIRedisClient.PublishMessageIMessageQueueClient.Publish何かを混ぜ合わせているに違いないことに気づきました。

ServiceStackには、次のようなpub / subブロードキャストをリッスンするオプションがあります。

    static IRedisSubscription _subscription;
    static IRedisClient redisClientSub;
    static int received = 0;
    static void ReadFromQueue()
    {
        redisClientSub = redisClientManager.GetClient();
        _subscription = redisClientSub.CreateSubscription();

        _subscription.OnMessage = (channel, msg) =>
        {
            try
            {
                received++;
            }
            catch (Exception ex)
            {
                    
            }
        };

        Task.Run(() => _subscription.SubscribeToChannels("Test"));
    }

素晴らしく、簡単に見えます。しかし、プロデューサーはどうですか?

利用可能なクラスを見ると、IRedisClient.PublishMessage(string toChannel, string message)またはを使用できると思いましたIMessageQueueClient.Publish(string queueName, IMessage message)

redisClient.PublishMessage("Test", json);
// or:     
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));

どちらの場合も、チャネル名は自分で指定します。これは私が見ている動作です:

  • 上記のサブスクライバーは、使用IRedisClient.PublishMessage(string toChannel, string message)した場合にのみメッセージを受信し、使用した場合は受信しません。IMessageQueueClient.Publish(string queueName, IMessage message)
  • を使用して公開する場合IRedisClient.PublishMessage、「テスト」チャネルにデータが入力されることを期待していましたが(Redisブラウザーで表示する場合)、そうではありません。キューの痕跡がまったく表示されません(サブスクリプションを開始しないが、プロデューサーがメッセージを追加するとします)
  • を使用して公開するIMessageQueueClient.Publish(string queueName, IMessage message)と、チャネル「テスト」が作成され、メッセージはそこに保持されますが、ポップ/フェッチおよび削除されることはありません。

両者の違いを理解したい。私はソースコードを見て、それについてできる限り読みましたが、に関するドキュメントは見つかりませんでしたIRedisClient.PublishMessage

回答

Ted Aug 17 2020 at 21:29

Mythzは、ServiceStackフォーラム(ここ)でこれに回答しました。

彼は書く:

これらのクライアントを同じ意味で使用しないでください。ServiceStackMQクライアントを使用してMQメッセージまたはメッセージMQメッセージラッパーのみを送信する必要があります。

redisサブスクリプションはRedisPub / Subサブスクリプションを作成するための低レベルAPIです。より便利な高レベルAPIは、マネージスレッドの背後にpub / subサブスクリプションをラップするマネージドPub / Subサーバーです。

いずれにせよ、MQサーバーはMQクライアントからのメッセージを処理するようにのみ設計されています。独自のメッセージング実装を実装する場合は、MQクライアントやMQメッセージクラスではなく、独自のメッセージとRedisクライアントを使用してください。

そして

IRedisClient(&ServiceStack.Redis)APIはRedisサーバー用ではありません。PublishMessageAPIはredisPUBLISHコマンドを送信します。IRedisSubscriptionはRedisPub / Subサブスクリプションを作成します。RedisPub/ Subの動作については、Redisのドキュメントを参照してください。ServiceStack.RedisライブラリとそのすべてのAPIはRedisサーバー専用であり、ServiceStack.Messaging MQAPIは含まれていません。

したがって、カスタムRedis Pub / Subサブスクリプションの実装にはServiceStack.Redisを使用するだけです。つまり、ServiceStackMQ専用のServiceStack.MessagingAPIは使用しないでください。