我想创建一个具有内部优先级的优先级队列,以便首先使用 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 代理支持的情况下使用优先级分数。