はじめに
Docker ComposeでKafkaを構築して、Kafkaがどんなものかをざっくり理解していきます。
Kafkaとは
Kafka(Apache Kafka)とは、イベントストリーミングプラットフォーム(ミドルウェア)になります。
イベントストリーミングとは、データ(イベント)を受け取り、格納し、処理して、次の宛先に送るようなことを言います。
下記のようなイベントストリーミングに必要な機能がKafkaには備わっています。
- ストリームデータの継続的なPublish(書き込み)とSubscribe(読み取り)
- ストリームデータの保持
- ストリームデータの処理
Kafkaは、メッセージングやログの集約、ストリーム処理などに使われます。
アーキテクチャと用語
Kafkaのアーキテクチャはざっくり下記のようになっています。
Kafkaで出てくる主な用語の意味は下記の通りです。
イベント
: Kafkaでのデータの単位(レコードやメッセージとも呼ばれる)Broker
: KafkaサーバーProducer
: イベントを書き込む(Publish)Consumer
: イベントを読み取って処理(Subscribe)Topic
: イベントを分類して格納(イベントをファイルと考えたときのフォルダのようなもの)Partiton
: Topicを分割したもの
Docker Composeで試す
Docker ComposeでKafkaを動かしてみて、Kafkaがどんなものか実際に体感してみたいと思います。
Kafkaを動かす
まずはDocker ComposeでKafkaを構築します。ここでは、Bitnamiのイメージを利用します。
docker-compose.yml
は下記の通りです。
version: "3"
services:
zookeeper:
image: docker.io/bitnami/zookeeper:3.8
ports:
- "2181:2181"
volumes:
- "zookeeper_data:/bitnami"
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: docker.io/bitnami/kafka:3.3
ports:
- "9092:9092"
volumes:
- "kafka_data:/bitnami"
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
起動します。
docker compose up -d
コンテナが起動したら、Kafkaのコンテナに接続しておきます。
docker exec -it kafka-kafka-1 /bin/bash
Topicの作成
まずはKafkaのコマンドラインツールでイベントが格納されるTopicを作成します。
kafka-topics.sh --create --topic sample-events --bootstrap-server localhost:9092
イベントの書き込み
次は、Producerのコマンドを使って、イベントを先ほど作成したTopicに書き込みます。
kafka-console-producer.sh --topic sample-events --bootstrap-server localhost:9092
入力した各行がイベントとして書き込まれます。
I have no name!@fe5e69f6b112:/$ kafka-console-producer.sh --topic sample-events --bootstrap-server localhost:9092
>hello
>world
>hoge
>foo
イベントの読み込み
書き込んだイベントをConsumerコマンドを使って読み込みます。
kafka-console-consumer.sh --topic sample-events --from-beginning --bootstrap-server localhost:9092
先ほど入力したイベントを確認することができます。
I have no name!@fe5e69f6b112:/$ kafka-console-consumer.sh --topic sample-events --from-beginning --bootstrap-server localhost:9092
hello
world
hoge
foo
別端末を起動し、Producerからイベントを書き込むとすぐにConsumer側に表示されるのが確認できます。