У нас есть сообщения, которые зависят. скажем, у нас есть 4 сообщения M1, M2, M1_update1 (должны обрабатываться только после обработки M1), M3 (должны обрабатываться только после обработки M1, M2).
В этом примере только M1 и M2 могут обрабатываться параллельно, остальные должны быть последовательными. Я знаю, что сообщения в одном разделе темы Kafka обрабатываются последовательно. Но как я узнаю, что M1, M2 обработаны и сейчас самое время отправить сообщения M1_update1 и M3 в тему? Подходит ли Kafka для такого варианта использования? Любые идеи приветствуются!
Однако ... это решение требует больших вычислительных ресурсов, и мы пока не знаем, как его масштабировать.




Kafka используется как система обмена сообщениями pub-sub, которая отличается высокой масштабируемостью и отказоустойчивостью.
Я считаю, что использование одной кафки, когда ваши сообщения взаимозависимы, может быть плохим выбором. Обработка, которая вам нужна, основана на условиях, вероятно, вам понадобится механизм маршрутизации, такой как верблюд или слюни, для достижения конечного результата.
Используя тот же ключ раздела, я все еще могу упорядочить сообщения M1, M1_update1. Однако я все еще не уверен, как придумать ключ для M3 (например, составной ключ m1_m2?), Чтобы он перешел в правильный раздел и, естественно, обрабатывал его последовательно. Можем ли мы добиться этого с помощью нескольких тем Kafka и каким-то образом добавить логику последовательности между потребителями разных тем? Я новичок в Kafka, поэтому пытаюсь понять возможности Fyi, в настоящее время мы выполняем эту логику в java в памяти, используя графы зависимостей (используя некоторые синхронизированные коллекции и т. д.) И можем обрабатывать сообщения в нескольких потоках.
Вы в основном описываете очередь сообщений, которая гарантирует упорядочение. Kafka, по замыслу, гарантирует упорядочение нет, за исключением упомянутого вами случая, когда тема имеет один раздел. Однако в этом случае вы не в полной мере пользуетесь способностью Kafka максимизировать пропускную способность за счет распараллеливания данных в разделах.
Поскольку сообщения зависят друг от друга, для этого потребуется логический уровень, который сам ядро Kafka не предоставляет. Если я правильно понимаю, и обработка происходит после того, как сообщение потребляется от Kafka, вам понадобится какое-то уведомление на стороне потребителя, которое будет получать и обрабатывать M1 и M2 и каким-то образом уведомлять производителя на другой стороне, теперь все в порядке. отправить M1_update и M3. Это определенно выходит за рамки того, что предоставляет ядро Kafka. Вы все еще можете использовать Kafka для создания чего-то вроде этого, но, вероятно, есть другие решения, которые подойдут вам лучше.
Это интересный вопрос. У нас есть аналогичный вариант использования, когда сообщения разбиваются на две семантические группы. Внутри группы порядок не имеет значения, но между группами существуют зависимости порядка в зависимости от фактических сообщений. Я думаю, что то, как мы разделим сообщения на две группы, может быть плохим дизайнерским решением с вычислительной точки зрения, касающейся масштабируемости. Мы пытаемся найти лучшее представление о нашей проблеме, чтобы мы могли использовать потоки для масштабируемости. Это означает, что производитель должен решить, какие сообщения требуют строгого упорядочивания, и эти сообщения должны быть отправлены в один и тот же раздел.