2017-02-22 18 views
2

У меня есть одна основная тема и несколько предикатов, каждая из которых имеет связанный с ней тему вывода. Я хочу отправить каждую запись во ВСЕ темы, чей предикат разрешает true. Я использую Luwak для проверки того, что предикаты записи удовлетворяют (чтобы использовать эту библиотеку, вы оцениваете документ со списком предикатов, и он сообщает вам, какие из них совпадают - то есть я назову его только один раз, чтобы получить список удовлетворенных предикатов).Потоковая передача сообщений по нескольким темам

Я пытаюсь использовать потоки Kafka для этого, но, похоже, для KStream не существует соответствующего метода (ветка KStream # только переносит запись на одну тему).

Один из возможных подходов заключается в следующем:

Stream from master 
Map the values into a format with the original content and the list of matching predicates 
Stream to an intermediate with-matches topic 

For each predicate/output topic 
    Stream from intermediate with-matches topic 
    Filter "does list of matches predicates contain predicate ID" 
    Map the values to just the original content 
    Stream to corresponding output topic 

Такая промежуточная тема кажется «неуклюжим», хотя. Любые лучшие предложения?

Я использую:

  • Кафка v0.10.1.1
  • Luwak v1.4.0

ответ

5

Вы можете просто применить несколько фильтров параллельно к тому же KStream например:

KStream stream = ... 

stream.filter(new MyPredicate1()).to("output-topic-1"); 
stream.filter(new MyPredicate2()).to("output-topic-2"); 
stream.filter(new MyPredicate3()).to("output-topic-3"); 
// ... as as many as you need 

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

 Смежные вопросы

  • Нет связанных вопросов^_^