RedisMQ PriorityQueue中的Servicestack内部优先级

时间:2013-01-23 17:58:30

标签: servicestack

我想创建一个具有内部优先级的优先级队列,以便首先使用ServiceStack弹出更高优先级的消息。 ServiceStack RedisMQ实现在其 IMessage 接口上提供类型的优先级设置器。我希望在 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);
         }

换句话说,我希望在 lowPrioMsg 之前弹出 highPrioMsg Priority = 100 Priority = 1 < / em>的。然而,在实践中,这些消息似乎遵循顺序FIFO原则。

有没有办法可以配置ServiceStack RedisMQ,因为我期望在PriorityQueue中使用内部优先级?

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

1 个答案:

答案 0 :(得分:2)

ServiceStack Redis MQ IMessageService实施中,您的权利是 PriorityQ 只是另一个FIFO队列,当您发送带有Priority > 0的消息时会发生这一切是它发布到 PriorityQ 而不是标准 InQ 消息通常发布到。

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

我们还打算为ServiceStack运送不同的MQ主机提供程序(例如RabbitMQ,ZeroMQ,ServiceBus等),我们将利用底层MQ代理支持的优先级得分。