1. ホーム
  2. apache-kafka

[解決済み] カフカ コンシューマーAPIとストリームAPI

2022-05-12 08:49:22

質問

最近Kafkaの勉強を始めたのですが、こんな質問をしてしまいます。

  1. ConsumerとStreamの違いは何ですか?私としては、Kafkaからメッセージを消費するツール/アプリケーションがあれば、Kafkaの世界ではコンシューマとなります。

  2. StreamもKafkaからメッセージを消費したり、Kafkaにメッセージを生成したりするので、どう違うのでしょうか?また、Consumer APIを使って独自のコンシューマーアプリケーションを書くことができるので、なぜそれが必要なのでしょうか? アプリケーションを作成し、必要に応じて処理したり、コンシューマーアプリケーションからSparkに送信することができるからです。

私はこれについてGoogleをしましたが、これに対する良い回答は得られませんでした。この質問があまりにも些細なことであれば申し訳ありません。

どのように解決するのですか?

2021年1月に更新しました。 を書きました。 Kafkaの基礎について4部構成のブログシリーズを書きました。 を書いたので、このような質問のために読むことをお勧めします。特にこの質問については、以下をご覧ください。 処理の基礎に関するパート3 .

2018年4月更新 : 現在では ksqlDB ksqlDBはKafkaのStreams API上に構築されており、こちらもStreamsとTableをファーストクラスでサポートしています。

Consumer APIとStreams APIの違いは何ですか?

KafkaのStreamsライブラリ( https://kafka.apache.org/documentation/streams/ ) は、Kafka プロデューサーおよびコンシューマークライアントの上に構築されています。Kafka Streamsは、プレーンクライアントよりもかなり強力であり、また表現力も豊かです。

Kafka Streamsを使えば、実際のアプリケーションを最初から最後まで書くのは、プレーンなコンシューマよりずっとシンプルで迅速です。

Kafka Streams APIの機能の一部を紹介します。そのほとんどはコンシューマークライアントではサポートされていません(足りない機能を自分で実装する必要があり、実質的にKafka Streamsを再実装することになります)。

  • Kafka トランザクションによる exactly-once 処理セマンティクスをサポート ( EOSの意味するところ )
  • フォールト・トレラントをサポートする ステートフル (もちろんステートレスも) 処理をサポートし、ストリーミングを含む に参加する , 集計 そして ウィンドウ . つまり、アプリケーションの処理状態をすぐに管理することができます。
  • サポート内容 イベントタイム処理 に基づく処理だけでなく 処理時間 インジェスチョン時間 . また、シームレスに アウトオブオーダーデータ .
  • の両方に対するファーストクラスのサポートを持っています。 ストリームとテーブル 実際には、ほとんどのストリーム処理アプリケーションはそれぞれのユースケースを実装するためにストリームとテーブルの両方を必要とするので、ストリーム処理技術がこの 2 つの抽象化のいずれかを欠く場合 (たとえば、テーブルをサポートしない場合)、行き詰まるか、この機能を手動で自分で実装しなければなりません (頑張ってください...) 。
  • サポート 対話型クエリ (「クエリ可能な状態」とも呼ばれます) をサポートし、リクエスト/レスポンス API を介して最新の処理結果を他のアプリケーションやサービスに公開します。これは、リクエスト-レスポンスのみを行うことができ、ストリーミング側を行うことができない従来のアプリに特に有用です。
  • より表現力が豊か:(1)関数型プログラミングスタイルで出荷されます。 DSL のような操作で map , filter , reduce と同様に、(2) 命令文スタイル プロセッサAPI を使うことができ、(3) DSLとProcessor APIを組み合わせることもできます。
  • 独自の テストキット があります。

参照 http://docs.confluent.io/current/streams/introduction.html を参照してください。また、Kafka Streams API の詳細については、高レベルの入門書であり、低レベルの Kafka コンシューマークライアントとの違いを理解する助けになるはずです。

Kafka Streamsの他にも、ストリーミングデータベースを利用することができます。 ksqlDB ksqlDBは、ストレージ層(Kafka)と計算層(ksqlDB自身、ここでは機能のほとんどにKafka Streamsを使用)を分離しています。基本的にはKafka Streamsと同じ機能をサポートしていますが、JavaやScalaのコードではなく、ストリーミングSQL文を記述します。ksqlDBとはUI、CLI、REST APIでやりとりできる。RESTを使いたくない場合は、ネイティブのJavaクライアントもある。最後に、インフラを自己管理する必要がないことを望むのであれば。 ksqlDBはフルマネージドサービスとして利用可能です。 を Confluent Cloud で利用できます。

Kafka Streams API も Kafka から消費したり、Kafka にメッセージを生成したりするので、どのように違うのですか?

Kafka Streams APIは、Kafkaへのデータの読み込みと書き込みの両方を行うことができます。Kafkaトランザクションをサポートしているので、例えば、1つまたは複数のトピックから1つまたは複数のメッセージを読み、必要に応じて処理状態を更新し、1つまたは複数のトピックに1つまたは複数の出力メッセージを書き込むことができます-すべて1つの原子操作としてです。

というのは、Consumer APIを使って独自のコンシューマーアプリケーションを書き、必要に応じて処理したり、コンシューマーアプリケーションからSparkに送ったりすることができるからです。

Kafka Streams APIはKafkaコンシューマークライアント(およびプロデューサークライアント)そのものを使用します。しかし、Streams APIが提供するユニークな機能をすべて手動で実装する必要があります。 しかし、Streams APIが提供するユニークな機能をすべて手作業で実装する必要があります。 したがって、ユーザーがより強力なKafka Streamsライブラリではなく、プレーンなコンシューマークライアントを選択することはまれな状況です。