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