Open5

Apache Kafka に入門してみる

0kate0kate

背景

Apache Kafka(以下、Kafka)を勉強する機会を得たので、公式ドキュメントをベースに入門してみる。
5分程度で概要が説明できるようにしたい。

0kate0kate

イベントストリーミング

Kafka について勉強する前に、イベントストリーミング について知っておく必要がある。

イベントストリーミングとは?

公式ドキュメントにはこう書かれている。

Event streaming is the digital equivalent of the human body's central nervous system.

人体の神経系(デジタル版)に相当するらしい 🤖
もう少し技術的な話も書かれている。

Technically speaking, event streaming is the practice of capturing data in real-time from event sources like databases, sensors, mobile devices, cloud services, and software applications in the form of streams of events; storing these event streams durably for later retrieval; manipulating, processing, and reacting to the event streams in real-time as well as retrospectively; and routing the event streams to different destination technologies as needed.

その他にも諸々沢山書かれているが、個人的に最も重要な2つのコンセプトを上げるとすれば、疎結合かつリアルタイム性を持ってシステム間でデータのやり取りができるところだと感じた。

  • 疎結合
    • システムを構成するあらゆる要素間の依存はイベントという対象に集約されるため、互いの特性に依存する必要がない
    • これによって、あらゆる要素間の連携が柔軟かつ単純にできるようになる
  • リアルタイム性
    • 疎結合で非同期的な通信でありながらも、即時性の高い通信が可能
    • これによって、システムを疎結合にする恩恵を十分に受けつつ、システム間の結合度を下げることで起き得る、データ変更に対する反応速度の遅れを最小限にすることができる

何に使えるのか?

https://kafka.apache.org/documentation/#intro_usage

  • To process payments and financial transactions in real-time, such as in stock exchanges, banks, and insurances.
  • To track and monitor cars, trucks, fleets, and shipments in real-time, such as in logistics and the automotive industry.
  • To continuously capture and analyze sensor data from IoT devices or other equipment, such as in factories and wind parks.
  • To collect and immediately react to customer interactions and orders, such as in retail, the hotel and travel industry, and mobile applications.
  • To monitor patients in hospital care and predict changes in condition to ensure timely treatment in emergencies.
  • To connect, store, and make available data produced by different divisions of a company.
  • To serve as the foundation for data platforms, event-driven architectures, and microservices.

ユースケースは様々。

  • 証券取引所などにおけるリアルタイムでの取引
  • IoTセンサーからの連続的なデータの受信と分析
  • マイクロサービスアーキテクチャーにおけるデータ連携の基盤
  • ...

Kafka とは、このイベントストリーミングを実現するためのソフトウェアの一つといえる。

0kate0kate

Kafka の構成要素

Kafka は主に、Kafka ServersKafka Clients という2つの要素からなる分散システムとして構成される。
これらは TCP 上に定義されたプロトコルに準拠して通信する。

Kafka Servers

Servers: Kafka is run as a cluster of one or more servers that can span multiple datacenters or cloud regions.

個人的には Kafka Cluster と理解している。
一つ以上の Servers がクラスターを構成し、これらのサーバーは複数のデータセンターをまたいで配置することもできる。
それぞれの Kafka Server は、Broker と呼ばれる。
後述の Kafka Clients からイベントを受け取り、配信する。

Kafka Clients

Clients: They allow you to write distributed applications and microservices that read, write, and process streams of events in parallel, at scale, and in a fault-tolerant manner even in the case of network problems or machine failures.

Kafka に対して、イベントを読み書きするクライアントアプリケーション。

Kafka Streams

clients are available for Java and Scala including the higher-level Kafka Streams library, for Go, Python, C/C++, and many other programming languages as well as REST APIs.

Kafka Clients を実装するにあたって、Java, Scala については Kafka Streams というクライアントライブラリが公式から提供されている。
このライブラリによって、高度に抽象化された API で Kafka のクライアントプリケーションを実装することができる。
Go や Python, C/C++ などのその他言語についても、REST API が提供されているので、この API を利用することで Kafka Cluster に対して情報を読み書きすることができる。

Kafka Streams とこの REST API の違いとしては、Kafka Streams が TCP レベルのレイヤーで通信するように設計されているのに対し、REST API については HTTP ベースのインターフェースであること。
Broker に対するポーリングやイベントのシリアライズのオーバーヘッドが少ないのが一つ違いとしては大きいイメージ。
また、Kafka Streams ではストリーミング処理の DSL が提供されており、これによって Broker との通信に必要な具体的な手続き処理について意識することなく Kafka アプリケーションを実装することができる。

まとめると

  • Kafka とは、イベントストリーミングを実現するソフトウェアの一つ
  • Kafka を利用したシステムは、1台以上のBrokerと呼ばれるサーバーから成るKafka Clusterと、そのクラスターにアクセスするKafka Clientで構成される
  • この Kafka Client を実装するためのライブラリとして、Java, Scala 向けに公式から提供されているライブラリが Kafka Streams
  • Kafka Streams は TCP 上での通信によってリアルタイムにイベントを送受信し、受信したイベントを処理するデータパイプラインを構築するための DSL を提供してくれる
0kate0kate

主要な概念

Kafka における主要な概念は下記の通り。

Events

An event records the fact that "something happened" in the world or in your business.

Events は、システム上で “何が起きたか” を表現するデータ。
Kafka に対するデータの読み書きは、この Events を読み書きすることに相当する。

Events の構造

Conceptually, an event has a key, value, timestamp, and optional metadata headers.

Events は、key, value, timestamp から構成される。
任意でメタデータを持たせることもできる。

以下はイベントの例。

key value timestamp
"Alice" "Made a payment of $200 to Bob" "Jun. 25, 2020 at 2:06 p.m."

各項目が文字列なので、value に JSON を持たせたりなどいろいろできそう。

Producers

Producers are those client applications that publish (write) events to Kafka

Producers は、Kafka に対して Events を書き込む Kafka Clients。

Consumers

consumers are those that subscribe to (read and process) these events.

Consumers は、Kafka から Events を読み取り処理する Kafka Clients。

Topics

Events are organized and durably stored in topics. Very simplified, a topic is similar to a folder in a filesystem, and the events are the files in that folder.

Topics は、Kafka に書き込まれた Events がグルーピングされ永続化される単位。
複数の Events が意味のある単位で Topics にまとめられる。
ファイルシステムにおける、ディレクトリ・ファイルの関係に似ている。

Topics are partitioned, meaning a topic is spread over a number of "buckets" located on different Kafka brokers. This distributed placement of your data is very important for scalability because it allows client applications to both read and write the data from/to many brokers at the same time.

一つの Topic は、内部的には幾つかの "buckets" という単位で分割されており、異なる Kafka brokers が割り当てられている。
これにより、複数の Kafka Clients が同じ Topic に対して同時刻に読み書きしても、十分な処理速度で応答することを可能になっている。

0kate0kate

トポロジー

Kafka Streams でクライアントアプリケーションを実装するにあたって、トポロジーというものを理解する必要がある。

トポロジーとは、Kafka Streams アプリケーション上において、「何のイベント受信して、どのような処理を行い、どのように出力するのか」といったイベントの処理フローに相当する概念。
Kafka Streams アプリケーションを実装するということは、このトポロジーを設計・実装することといえる。
Kafka Streams は、このトポロジーを表現するための DSL を提供してくれる。

トポロジーを表現するにあたって主に2つの要素が登場する。

  • ストリームプロセッサー
    • トポロジーをネットワーク状のグラフとみなしたとすると、その各ノードに相当する概念
    • トポロジーを構成する一つ一つの処理ステップを表現する
  • ストリーム
    • 同じくトポロジーをネットワーク状のグラフとみなしたとすると、エッジに相当する概念
    • ストリームプロセッサー間の入出力として、継続的にデータがやり取りされる通り道のようなイメージ

Record stream と Changelog stream

このストリームも大きく分けて2種類に大別される。
Kafka では、ストリーム内を流れるデータの変更を状態として保持することもできるようになっており、この状態を持つか持たないかといった異なる特性を持つストリームが存在する。

Record stream

それ単体で意味のある情報として完結するデータを表現するストリーム。
SQL における INSERT に相当するイメージ。
クレジットカードの取引や何かしらの操作ログなど、それ自体が何かしらの意味のある情報の単位として表現されるもの。

Changelog stream

ある任意のデータに対する更新を表現するストリーム。
SQL における UPDATE に相当するイメージ。

KStream と KTable

Kafka Streams では、これらの各ストリームを実装した DSL を提供してくれる。
Record stream と Changelog ストリームは、それぞれ KStream, KTable として提供される。