2013-01-23 3 views
5

Я хочу создать очередь приоритетов, которая имеет внутреннюю приоритизацию, чтобы сначала назначать более приоритетные сообщения, используя ServiceStack. Реализация ServiceStack RedisMQ обеспечивает Приоритет setter типа long на своем Интерфейс пользователя. Я ожидал бы, что сообщение, отправленное с более высоким значением в Приоритет, будет выведен первым из очереди. Мои тесты показывают, что сообщение с Приоритет> 0 ставится на Redis «Mq: MyDto.priorityq», а любое другое значение помещает сообщение в нормальное состояние в очереди «Mq: MyDto.inq».Внутренняя приоритизация служебных программ в RedisMQ PriorityQueue

Это пример кода, иллюстрирующий то, что я пытаюсь выполнить:

  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); 
     } 

Другими словами, я хочу highPrioMsg с Priority = 100 быть выскочил перед lowPrioMsg с Приоритет = 1. На практике, однако, это сообщение, похоже, следует за последовательным принципом FIFO.

Есть ли способ настроить ServiceStack RedisMQ на работу, как я ожидаю, с внутренней приоритезацией в PriorityQueue?

Или мой единственный выбор - либо использовать обычную очередь, либо приоритетную очередь? В этом случае почему длинный, используемый для Приоритет setter вместо логического?

ответ

2

В реализации ServiceStack Redis MQIMessageService ваше право в том, что PriorityQ это просто еще один буфер FIFO очереди, и все, что происходит, когда вы посылаете сообщение с Priority > 0, что это будет опубликовано в PriorityQ вместо стандартного InQ сообщения обычно публикуются.

Приоритет - это число, поэтому другие ServiceStack MQ Providers имеют возможность предоставлять различную реализацию, то есть такую, которая использует оценку приоритета. В настоящее время PriorityQ в Redis поддерживается стандартным списком повторных серверов, который не поддерживает приоритизацию элементов, поэтому мы можем рассмотреть возможность изменения реализации, чтобы использовать отсортированный набор, который позволяет сортировать.

Мы также намерены отправлять различные провайдеры хостов MQ для ServiceStack (например, RabbitMQ, ZeroMQ, ServiceBus и т. Д.), Где мы будем использовать оценку приоритета, в которой поддерживает базовый брокер MQ.

+0

Хорошо, хороший ответ. Благодаря! –

Смежные вопросы