6

ServiceStackを使用して、優先順位の高いメッセージが最初にポップされるように、内部優先順位を持つ優先キューを作成したいと思います。ServiceStack RedisMQ実装は、IMessageインターフェイスでlong型の優先セッター提供します。Priorityプロパティの値が高いメッセージが最初にキューからポップされると予想されます。私のテストでは、Priority> 0のメッセージはRedis「Mq:MyDto.priorityq」に配置され、他の値はメッセージを通常のキュー「Mq:MyDto.inq」に配置することが示されています。

これは、私が達成しようとしていることを示すサンプルコードです。

         using (var producer = MsgFactory.CreateMessageProducer())
         {
            var lowPrioMsg = new Message<MyDto>(lowPrioDto);
            lowPrioMsg = (long)1;
            producer.Publish<MyDto>(lowPrioMsg);

            var highPrioMsg = new Message<MyDto>(highPrioDto);
            highPrioMsg.Priority = (long)100;
            producer.Publish<MyDto>(highPrioMsg);
         }

つまり、Priority = 100のhighPrioMsgを、Priority=1のlowPrioMsgの前にポップする必要があります。ただし、実際には、これらのメッセージはシーケンシャルFIFOの原則に従っているようです。

PriorityQueueの内部優先順位付けで期待どおりに機能するようにServiceStackRedisMQを構成する方法はありますか?

または、通常のキューまたは優先キューのいずれかを使用する唯一の選択肢ですか?その場合、ブール値の代わりに優先度セッターに長い間使用されるのはなぜですか?

4

1 に答える 1

3

ServiceStack Redis MQ IMessageServiceの実装では、PriorityQ単なる別のFIFOキューであり、メッセージを送信するときに発生するのは、通常のInQメッセージではなくPriorityQPriority > 0に公開されることだけです。

優先度は数値であるため、他のServiceStack MQプロバイダーは、別の実装、つまり優先度スコアを利用する実装を提供できます。現在、RedisのPriorityQは、要素の優先順位付けをサポートしていない標準のredis-serverリストに支えられています。最終的には、並べ替えを許可する並べ替えられたセットを使用するように実装を変更することを検討できます。

また、ServiceStack用にさまざまなMQホストプロバイダー(RabbitMQ、ZeroMQ、ServiceBusなど)を出荷する予定です。ここでは、基盤となるMQブローカーがサポートする優先度スコアを利用します。

于 2013-01-23T20:32:12.760 に答える