2009-07-16 6 views
8

Для ориентированного на сообщения промежуточного программного обеспечения, которое не поддерживает поддержку сообщений приоритета (таких как AMQP), что является лучшим способом реализации приоритетного потребления, когда очереди имеют только семантику FIFO ? Общим вариантом использования будет система, в которой потребители получают сообщения с более высоким приоритетом перед сообщениями с более низким приоритетом, когда в очереди (очередях) существует большое количество сообщений.В системе FIFO Qeueing наилучшим способом реализации приоритетных сообщений

+2

У вас есть несколько очередей? Если это так, я бы предложил иметь отдельную очередь для сообщений с высоким приоритетом, которая сначала запрашивается перед стандартной очередью, которая используется только в том случае, если очередь приоритетов пуста. Я не знаю, соответствует ли это вашему сценарию, но это была моя первая идея. – CodeFusionMobile

+0

Я согласен с CSharpWithJava. На данный момент я использую большое приложение для обмена сообщениями, и, думаю, из ваших вопросов вам нужно несколько очередей, поэтому вы можете отключить нижние сообщения pri в нижней очереди pri и сразу же прочитать высокий приоритет. –

ответ

10

Учитывая только поддержку FIFO для данной отдельной очереди, вам, разумеется, придется вводить либо несколько очередей, либо посредников, либо иметь более сложного потребителя.

Несколько очередей можно обрабатывать несколькими способами. Производитель и потребитель могут согласиться иметь две очереди между ними, одну для высокоприоритетных и одну для фоновых задач.

Если ваш производитель ограничен одной очередью, но у вас есть контроль над потребителем, подумайте о том, чтобы ввести маршрутизатор разветвления на пути. Таким образом, производитель-> Маршрутизатор - это одиночная очередь, и маршрутизатор затем имеет две очереди для потребителя.

Другим способом решения проблемы, который, вероятно, является менее идеальным, было бы то, чтобы ваш потребитель вращал поток на переднюю очередь, а затем отправлял работу внутри страны. Что-то вроде версии маршрутизатора выше, но внутри одного приложения. Это имеет недостаток в наличии нескольких сообщений в полете внутри вашего приложения, что может осложнить восстановление в случае сбоя.

Не забудьте подумать о голодающих событиях с очень низким приоритетом, какими бы они ни были, если некоторые из них должны быть обработаны, даже если происходят более высокоприоритетные события.

+1

Это более или менее точно, кто мы реализовали эту стратегию для проекта на работе. Несколько очередей для градуированной системы приоритетов. Мы не очень беспокоимся о голоде, потому что мы можем просто переиздавать важные сообщения с более низким приоритетом с более высоким приоритетом в таких случаях; избыточную работу обрабатывают, по большей части, идемпотентно, чтобы это разрешить. – quaternion