Я обновил вопрос, чтобы ответить на комментарии @Deadpool и @Nicolas:
В настоящее время мы используем RabbitMQ.У нас многоэтапный процесс (Step1, Step2, Step3).
Step1 : опубликовать 100 сообщений в очереди с помощью группового ключа "batch1" (например, 100 JSON Products для запросов HTTP API, чтобы товары были вставлены / обновлены в онлайн-магазине).Рабочие должны обрабатывать пакет 1 параллельно ( Очередь рабочих ), например, 4 рабочих и 25 сообщений.Основная цель - параллельное выполнение «batch1» по соображениям производительности.
Step2 : должен начать работать, только если все 100 сообщений шага 1 были использованы / обработаны (например, все продукты были вставлены / обновлены).
Это означает, что либо step2 необходимо дождаться, пока все 100 сообщений "batch1" не будут использованы / обработаны n работниками
например
if (isNoMessageLeft(step1){
// do step2 work
}
или step1 должны подождать, прежде чем перейти к шагу 2.
Например,
if (isNoMessageLeft(step1){
// continue to step2
}
Шаг 2 может потребоваться для работы с результатами Шаг 1 , но, возможно, нет.Просто важно, чтобы Step1 , Step2 и Step3 были обработаны, если предшественник был закончен.Это немного сравнимо с концепцией Read-your-own-write в базах данных.
Мы еще не нашли способ сделать такую группировку сообщений только в RabbitMQ.Мы могли бы отслеживать прогресс в дополнительной базе данных (каждый потребитель обновляет таблицу счетчиков или около того), но мы бы по возможности ее избегали.В идеале очередь позволяет что-то вроде этого.
В настоящий момент шаги 1-3 полностью последовательны (один поток в приложении Java), но мы хотели бы улучшить использование подхода Worker Queue, чтобы использовать кластер из нескольких рабочих для определенных задач.
Как можно приблизиться к чему-то подобному?(в идеале с RabbitMQ) или с другим продуктом очереди, например
Возможно ли это с Apache Kafka?