Samza および Kafka Streams では、データ ストリーム処理は、処理ステップ (Samza では「ジョブ」、Kafka Streams では「プロセッサ」と呼ばれる) のシーケンス/グラフ (Samza では「データフロー グラフ」、Kafka Streams では「トポロジ」と呼ばれる) で実行されます。この質問の残りの部分では、これら 2 つの用語をワークフローとワーカーと呼びます。
非常に単純なワークフローがあるとします。これは、センサー測定値を消費し、50 未満のすべての値をフィルター処理するワーカー A と、残りの測定値を受け取り、80 を超えるすべての値をフィルター処理するワーカー B で構成されます。
入力 (Kakfa トピック X) --> (ワーカー A) --> (ワーカー B) --> 出力 (Kafka トピック Y)
分かっていたら
- http://samza.apache.org/learn/documentation/0.11/introduction/concepts.htmlおよび
- http://docs.confluent.io/3.1.1/streams/architecture.html#parallelism-model
正しくは、Samza と Kafka ストリームの両方がトピック パーティショニングの概念を使用してワークフロー/ワーカーを複製し、スケーラビリティのために処理を並列化します。
しかし:
Samza は、各ワーカー (つまり、ジョブ) を個別に複数のタスク (入力ストリームのパーティションごとに 1 つ) に複製します。つまり、タスクはワークフローのワーカーのレプリカです。
Kafka Streams は、ワークフロー全体 (つまり、トポロジ) を一度に複数のタスク (入力ストリームのパーティションごとに 1 つ) に複製します。つまり、タスクはワークフロー全体のレプリカです。
これは私の質問に私をもたらします:
パーティションが 1 つだけあると仮定します。Samza では可能ですが、Kafka Streams では 2 つの異なるマシンにワーカー (A) と (B) をデプロイすることはできないというのは正しいですか? (つまり、複数のパーティションがあるかどうかに関係なく、Kafka Streams で単一のタスク (つまり、トポロジ レプリカ) を 2 つのマシンに分割することは不可能ですか?)
(同じタスク内の) Kafka Streams トポロジ内の 2 つの後続のプロセッサはどのように通信しますか? (Samza では、後続の 2 つのワーカー (つまり、ジョブ) 間のすべての通信が Kafka トピックで行われることを知っていますが、Kafka トピックとして公開する必要があるストリームをコードで明示的に Kafka ストリームで「マーク」する必要があるため、これはできません。ここに当てはまります。)
Samza がすべての中間ストリームを Kafka トピックとして自動的に公開する (したがって、潜在的なクライアントが利用できるようにする) のは正しいですか? 一方、Kafka Streams
addSink
は、(低レベル API およびto
/またはthrough
DSLで) 明示的にマークされた中間および最終ストリームのみを公開します。 )?
(Samza は Kafka 以外のメッセージ キューも使用できるという事実を認識していますが、これは私の質問にはあまり関係ありません。)