6

我想创建一个具有内部优先级的优先级队列,以便首先使用 ServiceStack 弹出优先级更高的消息。ServiceStack RedisMQ 实现在其IMessage接口上提供了long类型的Priority setter 。我希望在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 =1的lowPrioMsg之前弹出具有Priority=100的highPrioMsg。然而,在实践中,这些消息似乎遵循顺序 FIFO 原则。

有没有一种方法可以配置 ServiceStack RedisMQ 以在 PriorityQueue 中使用内部优先级按预期工作?

或者我唯一的选择是使用普通队列还是优先队列?在那种情况下,为什么优先级设置器使用long而不是布尔值?

4

1 回答 1

3

ServiceStack Redis MQ IMessageService实现中,您的权利是PriorityQ只是另一个 FIFO 队列,当您发送带有 a 的消息时发生的所有事情Priority > 0就是它被发布到PriorityQ而不是标准的InQ消息通常被发布到。

优先级是一个数字,因此其他 ServiceStack MQ 提供者能够提供不同的实现,即利用优先级分数的实现。目前 Redis 中的 PriorityQ 由不支持元素优先级的标准 redis-server 列表支持,最终我们可能会考虑更改实现以使用允许排序的排序集。

我们还打算为 ServiceStack 提供不同的 MQ 主机提供程序(例如 RabbitMQ、ZeroMQ、ServiceBus 等),我们将在底层 MQ 代理支持的情况下使用优先级分数。

于 2013-01-23T20:32:12.760 回答