26

Samza および Kafka Streams では、データ ストリーム処理は、処理ステップ (Samza では「ジョブ」、Kafka Streams では「プロセッサ」と呼ばれる) のシーケンス/グラフ (Samza では「データフロー グラフ」、Kafka Streams では「トポロジ」と呼ばれる) で実行されます。この質問の残りの部分では、これら 2 つの用語をワークフローワーカーと呼びます。

非常に単純なワークフローがあるとします。これは、センサー測定値を消費し、50 未満のすべての値をフィルター処理するワーカー A と、残りの測定値を受け取り、80 を超えるすべての値をフィルター処理するワーカー B で構成されます。

入力 (Kakfa トピック X) --> (ワーカー A) --> (ワーカー B) --> 出力 (Kafka トピック Y)

分かっていたら

正しくは、Samza と Kafka ストリームの両方がトピック パーティショニングの概念を使用してワークフロー/ワーカーを複製し、スケーラビリティのために処理を並列化します。

しかし:

  • Samza は、各ワーカー (つまり、ジョブ) を個別に複数のタスク (入力ストリームのパーティションごとに 1 つ) に複製します。つまり、タスクはワークフローのワーカーのレプリカです。

  • Kafka Streams は、ワークフロー全体 (つまり、トポロジ) を一度に複数のタスク (入力ストリームのパーティションごとに 1 つ) に複製します。つまり、タスクはワークフロー全体のレプリカです。

これは私の質問に私をもたらします:

  1. パーティションが 1 つだけあると仮定します。Samza では可能ですが、Kafka Streams では 2 つの異なるマシンにワーカー (A) と (B) をデプロイすることはできないというのは正しいですか? (つまり、複数のパーティションがあるかどうかに関係なく、Kafka Streams で単一のタスク (つまり、トポロジ レプリカ) を 2 つのマシンに分割することは不可能ですか?)

  2. (同じタスク内の) Kafka Streams トポロジ内の 2 つの後続のプロセッサはどのように通信しますか? (Samza では、後続の 2 つのワーカー (つまり、ジョブ) 間のすべての通信が Kafka トピックで行われることを知っていますが、Kafka トピックとして公開する必要があるストリームをコードで明示的に Kafka ストリームで「マーク」する必要があるため、これはできません。ここに当てはまります。)

  3. Samza がすべての中間ストリームを Kafka トピックとして自動的に公開する (したがって、潜在的なクライアントが利用できるようにする) のは正しいですか? 一方、Kafka StreamsaddSinkは、(低レベル API およびto/またはthroughDSLで) 明示的にマークされた中間および最終ストリームのみを公開します。 )?

(Samza は Kafka 以外のメッセージ キューも使用できるという事実を認識していますが、これは私の質問にはあまり関係ありません。)

4

1 に答える 1