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