В настоящее время я столкнулся с проблемой, для которой, я уверен, существует официальное название, но я не знаю, что искать в Интернете. Я надеюсь, что если я опишу проблему и решение, которое я имею в виду, кто-нибудь сможет сказать мне имя шаблона проектирования (если он соответствует тому, что я собираюсь описать).
По сути, я хочу иметь очередь заданий: у меня есть несколько клиентов, которые создают задания (издатели), и несколько рабочих, которые обрабатывают эти задания (потребители). Теперь я хочу распределить задания, созданные издателями, различным потребителям, что в основном можно выполнить, используя практически любую очередь сообщений с балансировкой нагрузки по очереди, например используя RabbitMQ или даже MQTT 5.
Однако теперь все усложняется ... каждое задание относится к внешнему объекту, скажем, к пользователю. Я хочу, чтобы задания для одного пользователя обрабатывались по порядку, но для нескольких пользователей параллельно. У меня нет требования, чтобы задания для пользователя X всегда передавались работнику Y, поскольку они в любом случае должны обрабатываться последовательно.
Теперь я мог бы решить эту проблему с помощью RabbitMQ и его последовательного обмена хэшированием, но тогда у меня возникает гонка данных, когда новые рабочие входят в кластер, потому что RabbitMQ не поддерживает перемещение заданий, которые уже находятся в очереди.
MQTT 5 также не поддерживает это: здесь эта идея известна как «липкие общие подписки», но она не является официальной. Он может быть частью MQTT 6, а может и не быть. Кто знает.
Я также взглянул на NSQ, NATS и некоторых других брокеров. Большинство из них даже не поддерживают этот очень специфический сценарий, а те, которые действительно используют согласованное хеширование, имеют ранее упомянутую проблему гонок данных.
Теперь проблема исчезнет, если брокер не будет сортировать задания в очереди после их поступления, но если он будет отслеживать, обрабатывается ли уже задание для определенного пользователя: если это так, он должен отложить все другие задания на этого пользователя, но все задания для других пользователей все равно должны обрабатываться. Это, AFAICS, невозможно при использовании RabbitMQ et al.
Я почти уверен, что я не единственный человек, у которого есть вариант использования для этого. Я мог бы, например, Представьте, что пользователи загружают видео на видеоплатформу, и хотя загруженные видео обрабатываются параллельно, все видео, загруженные одним пользователем, обрабатываются последовательно.
Итак, короче: известно ли то, что я описываю под общим именем? Что-то вроде распределенной очереди заданий? Диспетчер задач с привязкой к задачам? Или что-нибудь еще? Я перепробовал множество терминов, но безуспешно. Это может означать, что для этого нет решения, но, как уже было сказано, трудно представить, что я единственный человек на планете с этой проблемой.
Есть идеи, что я мог бы искать? И: Есть ли какие-нибудь инструменты, которые это реализуют? Какие-нибудь протоколы?
PS: Простое использование предопределенного ключа маршрутизации не вариант, поскольку идентификаторы пользователей (которые я использовал здесь в качестве выдуманного примера) в основном являются UUID, поэтому их могут быть миллиарды, поэтому мне нужно что-то более динамичное. Следовательно, согласованное хеширование - это в основном правильный подход, но, как уже говорилось, распределение должно работать по частям, а не заранее, чтобы избежать гонок данных.