Подходит ли Kafka для сообщений с зависимостями?

У нас есть сообщения, которые зависят. скажем, у нас есть 4 сообщения M1, M2, M1_update1 (должны обрабатываться только после обработки M1), M3 (должны обрабатываться только после обработки M1, M2).

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

Это интересный вопрос. У нас есть аналогичный вариант использования, когда сообщения разбиваются на две семантические группы. Внутри группы порядок не имеет значения, но между группами существуют зависимости порядка в зависимости от фактических сообщений. Я думаю, что то, как мы разделим сообщения на две группы, может быть плохим дизайнерским решением с вычислительной точки зрения, касающейся масштабируемости. Мы пытаемся найти лучшее представление о нашей проблеме, чтобы мы могли использовать потоки для масштабируемости. Это означает, что производитель должен решить, какие сообщения требуют строгого упорядочивания, и эти сообщения должны быть отправлены в один и тот же раздел.

Stuck 20.05.2019 13:56

Однако ... это решение требует больших вычислительных ресурсов, и мы пока не знаем, как его масштабировать.

Stuck 20.05.2019 13:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
584
2

Ответы 2

Kafka используется как система обмена сообщениями pub-sub, которая отличается высокой масштабируемостью и отказоустойчивостью.

Я считаю, что использование одной кафки, когда ваши сообщения взаимозависимы, может быть плохим выбором. Обработка, которая вам нужна, основана на условиях, вероятно, вам понадобится механизм маршрутизации, такой как верблюд или слюни, для достижения конечного результата.

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

jyohas 16.10.2018 22:43

Вы в основном описываете очередь сообщений, которая гарантирует упорядочение. Kafka, по замыслу, гарантирует упорядочение нет, за исключением упомянутого вами случая, когда тема имеет один раздел. Однако в этом случае вы не в полной мере пользуетесь способностью Kafka максимизировать пропускную способность за счет распараллеливания данных в разделах.

Поскольку сообщения зависят друг от друга, для этого потребуется логический уровень, который сам ядро ​​Kafka не предоставляет. Если я правильно понимаю, и обработка происходит после того, как сообщение потребляется от Kafka, вам понадобится какое-то уведомление на стороне потребителя, которое будет получать и обрабатывать M1 и M2 и каким-то образом уведомлять производителя на другой стороне, теперь все в порядке. отправить M1_update и M3. Это определенно выходит за рамки того, что предоставляет ядро ​​Kafka. Вы все еще можете использовать Kafka для создания чего-то вроде этого, но, вероятно, есть другие решения, которые подойдут вам лучше.

Другие вопросы по теме