Могут ли потоки Kafka эффективно справляться с объединением потоков?

Я новичок в Kafka и хотел бы знать, возможно ли и разумно ли реализовать то, что я планирую.

Предположим, у нас есть два источника, s1 и s2, которые отправляют сообщения в темы t1 и t2 соответственно. Теперь мне бы хотелось иметь приемник, который слушает обе темы, и я бы хотел, чтобы он обрабатывал кортежи сообщений <m1, m2>, где m1.key == m2.key.

Если m1.key никогда не был найден в каком-либо сообщении s2, то приемник полностью игнорирует m1.key (никогда не обработает его).

Таким образом, сток будет работать только с ключами, с которыми работали s1 и s2.

Некоторым традиционным и, возможно, наивным решением было бы иметь какой-то кеш или хранилище и работать с элементом только тогда, когда оба сообщения находятся в кеше.

Я хотел бы знать, предлагает ли Кафка решение этой проблемы.


person yaseco    schedule 03.02.2019    source источник


Ответы (1)


Большинство современных механизмов обработки потоков, таких как Apache Flink, Kafka Streams или Spark Streaming может решить эту проблему за вас. Все трое прошли боевые испытания потребителей Kafka, созданных для подобных случаев.

Даже в этих рамках существует несколько различных способов достижения потокового соединения, как указано выше. Например, во Flink можно использовать Table API с синтаксисом, подобным SQL.

То, что я использовал в прошлом, немного похоже на пример из этот SO-ответ (вы можете просто заменить fromElements на источник Kafka).

При работе с потоками следует помнить о том, что у вас НЕТ каких-либо гарантий упорядочения при использовании данных из двух тем Kafka t1 и t2. Ваш код должен учитывать сообщения, поступающие в любом порядке.

Изменить - только что понял, что ваш вопрос, вероятно, был о том, как вы можете реализовать соединение с помощью потоков Kafka, а не потока данных из Kafka. В этом случае вы, вероятно, найдете соответствующую информацию здесь

person ariskk    schedule 03.02.2019