В системе FIFO Qeueing, как лучше всего реализовать приоритетный обмен сообщениями - PullRequest
9 голосов
/ 16 июля 2009

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

1 Ответ

10 голосов
/ 24 декабря 2009

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

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

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

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

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

...