一般的なクライアントサーバモデルにおいて、クライアントがサーバにデータを取りに行くことを「Pull」、サーバがクライアントへデータを送り出すことを「Push」といいます。
メッセージシステムにおいては、「サーバ=Producer」「クライアント=Consumer」と呼ばれます。
Apache Kafkaは、Pull型(Publish-Subscribeモデル)を採用しています。
・データ転送量などを意識する必要がない
・自らスループット調整できる
・バッチ処理にも対応できる
・複数サーバが生成するログを1箇所にまとめておく処理が可能 など
Apache Kafkaは、大量のメッセージを高速処理できます。
「カーネルメモリキャッシュを最大限使用する」「ページキャッシュからネットワークのsocketへ効率よくデータを受け渡す」などの仕組みにより高速処理を実現しています。
LinkedInのベンチマークでは、「1秒間で200万メッセージ処理」を達成しています。低スペックのハードウェアでも、数ミリ秒の遅延で「1秒間で数十万メッセージ処理」が可能です。
Apache Kafkaは、分散環境運用コーディネーションエンジン「Apache ZooKeeper」を動かして、複数のKafkaサーバを連携させてクラスタ化します。クラスタ化により耐障害性/高可用性を実現します。
以下の仕組みによりデータ損失を防ぎます。
・データストリームを分散レプリケートフォールトトレラントクラスタに安全に保管
・メッセージはディスクにファイルとして保存 など
Apache Kafkaは、Kafkaクラスタをダウンタイムなしで、柔軟かつ透過的に拡張できます。
Kafkaは、1つ以上のサーバ上でクラスタとして実行されます。
Kafkaクラスタは「トピック」と呼ばれるカテゴリにストリームレコードを格納します。
各「ストリームレコード」は、「キー」+「値」+「タイムスタンプ」で構成されます。
Apache Kafkaは、「Producer→Broker→Consumer」の、3つのコンポーネントで構成されます。
「Producer」は、メッセージデータ発生元で、メッセージの配信を行います。
「Broker」は、クラスタを構成するKafkaのコアで、「Producer」と「Consumer」の間で、メッセージの受け渡しをするキューとして機能します。
「Consumer」は、メッセージデータ配信先で、メッセージの購読を行います。
Kafkaには4つのコアAPIがあります。
Producer APIは、アプリケーションが1つ以上のKafkaトピックにストリームレコードを公開する機能を提供します。
Producer APIは、ロードバランスを取るために「ラウンドロビン方式」または「セマンティックパーティション関数」に従ってトピック内のどのパーティションに割り当てるのかについて選択します。
Consumer APIは、アプリケーションが1つ以上のトピックをサブスクライブし、トピックに格納されているストリームレコードを処理する機能を提供します。
Consumerインスタンスは「別々のプロセス」または「別々のマシン」に配置できます。
すべてのConsumerインスタンスが同じコンシューマグループに属する場合、ストリームレコードはConsumerインスタンスに対して実質的に負荷分散されます。
すべてのConsumerインスタンスが異なるConsumerグループに属する場合は、各ストリームレコードはすべてのConsumerインスタンスにブロードキャストされます。
上記の、Producer APIとConsumer APIを使用すれば、単純なストリーム処理を直接実行できます。しかし、変換処理が必要となる複雑なケースの場合、Streams APIを使用することで対応できます。
Streams APIは、入力トピックから連続的なストリームレコードを取り出し、この入力に対して「集約」「結合」「変換」などの処理を行い、トピックを出力するための連続したストリームレコードを生成する機能を提供します。
例えば、小売りアプリケーションの場合では、「販売」および「出荷」の入力ストリームを受け取り、これらのデータに対して並べ替えや価格調整された出力ストリームを生成できます。
Connector APIは、既存アプリケーション/データシステムに対して、Kafkaトピックを接続する機能を提供します。
Apache Kafkaでは、メッセージング保証を提供しています。
Producerによって特定のトピックパーティションに送信されたメッセージは、送信された順序で追加されます。
Consumerインスタンスは、ログに格納されている順序でレコードを表示します。
トピック内の並列性により、Kafkaは、Consumerプロセスのプール全体での発注保証と負荷分散の両方を提供できます。
これは、トピック内のパーティションをConsumerグループ内のConsumerに割り当てることによって実現され、各パーティションはグループ内のConsumerによって消費されます。これにより、Consumerがそのパーティションの唯一の読者であることを保証し、データを順番に消費します。
Kafkaに書き込まれたデータはディスクに書き込まれ、耐障害性のために複製されます。
そのため、Apache Kafkaは、「高性能」「低レイテンシ」「コミットログストレージ」「レプリケーション」「伝播専用」などの特徴を持つ「分散型ストレージシステム」と捉えることもできます。
可視化ツール「Trifecta」を利用すると、「Kafkaトピック」や「Kafkaメッセージ」などについて可視化できます。
Apache Kafkaでは、クライアント/サーバ間通信は、シンプルで高性能な言語に依存しないTCPプロトコルで行われます。
Kafkaは多くの言語に対応する開発用ライブラリを用意されています。
Kafka開発チームは、11月1日、 分散ストリーミングプラットフォーム「Apache Kafka 1.0.0」を発表した。 【「Apache Kafka」とは】 https://www.ossnews.jp/oss_info/Apache_Kafka 【1.0.0のポイント】 ・企業での利用に向けた拡張性と信頼性の強化 ・性能改善 ・JBODサポート改善 ・安定性強化
OSS×Cloud ACCESS RANKING