2017-02-22 8 views
2

私は1つのマスタートピックと複数の述語を持ち、それぞれに出力トピックが関連付けられています。私はすべてのトピックに述語が真である解決する各レコードを送信したい。私はLuwakを使ってレコードがどの述語を満たしているかをテストしています(このライブラリを使うには、述語のリストを持つ文書を評価し、どれが一致したかを伝えます。複数のトピックへのストリーミングメッセージ

私はこのためにKafka Streamsを使用しようとしていますが、KStream(KStream#ブランチはレコードを1つのトピックにルーティングするだけです)では適切なメソッドがないようです。次のように

1つの可能なアプローチは、次のとおりです。

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 1.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 

各レコードは各述語に1回送信されます。概念的にはブロードキャストですすべてのフィルタに適用されますが、レコードは物理的に複製されないため、メモリオーバーヘッドはありません。

関連する問題