Вы можете посмотреть на реализацию очереди приоритетов (которая не была реализована, когда этот вопрос был задан изначально): https://www.rabbitmq.com/priority.html
Если это не работает для вас, вы можете попробовать другие способы взлома, чтобы добиться того, чего вы хотите (что должно работать с более старыми версиями RabbitMQ):
Вы можете иметь 100 очередей, привязанных к обмену темами, и установить для ключа маршрутизации хэш идентификатора пользователя% 100, т.е. каждая задача будет иметь ключ от 1 до 100, а задачи для одного и того же пользователя будут иметь один и тот же ключ , Каждая очередь связана с уникальным шаблоном от 1 до 100. Теперь у вас есть парк работников, которые начинают со случайного номера очереди, а затем увеличивают этот номер очереди после каждого задания, снова% 100, чтобы вернуться к очереди 1 после очереди 100.
Теперь ваш рабочий парк может обрабатывать до 100 уникальных пользователей параллельно, или все работники могут сосредоточиться на одном пользователе, если нет никакой другой работы. Если работникам необходимо циклически проходить все 100 очередей между каждым заданием, в сценарии, когда только один пользователь имеет много заданий в одной очереди, вы, естественно, будете испытывать некоторые издержки между каждым заданием. Меньшее количество очередей - один из способов справиться с этим. Вы также можете попросить каждого работника удерживать соединение с каждой из очередей и использовать до одного неподтвержденного сообщения от каждой. Затем рабочий может циклически просматривать ожидающие сообщения в памяти гораздо быстрее, при условии, что время ожидания неподтвержденного сообщения установлено достаточно высоким.
В качестве альтернативы вы можете создать две биржи, каждая со связанной очередью. Вся работа направляется на первый обмен и очередь, которые потребляет пул рабочих. Если единица работы занимает слишком много времени, работник может отменить ее и отправить во вторую очередь. Рабочие обрабатывают вторую очередь только тогда, когда в первой очереди ничего нет. Возможно, вы также захотите, чтобы несколько работников с противоположным приоритетом очереди гарантировали, что долго выполняющиеся задачи будут по-прежнему обрабатываться, когда поступает бесконечный поток коротких задач, так что пакет пользователя всегда будет обрабатываться в конце концов. Это не будет по-настоящему распределять ваш рабочий парк по всем задачам, но остановит долго выполняющиеся задачи от одного пользователя, не позволяющего вашим работникам выполнять краткосрочные задачи для того же пользователя или другого. Также предполагается, что вы можете отменить задание и запустить его позже без проблем. Это также означает, что из-за тайм-аута будут потрачены впустую ресурсы и их нужно будет запускать с низким приоритетом. Если вы не можете заранее определить быстрые и медленные задачи
Первое предложение со 100 очередями также может иметь проблему, если для одного пользователя существует 100 медленных задач, а затем другой пользователь публикует пакет задач. Эти задачи не будут рассмотрены, пока одна из медленных задач не будет завершена. Если это окажется законной проблемой, вы потенциально можете объединить два решения.