Skip to main content
 首页 » 编程设计

RedisMQ PriorityQueue 中的 Servicestack 内部优先级

2024年12月31日1098°冷暖

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

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

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

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

请您参考如下方法:

ServiceStack Redis MQ IMessageService执行您的权利,优先Q 只是另一个 FIFO 队列,当您发送带有 Priority > 0 的消息时会发生所有事情是它被发布到 优先Q 而不是标准询盘 消息通常发布到。

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

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