docker image を使って Apache Kafka を実行してみるまで

#### 1. はじめに
Apache Kafka は スケーラビリティに優れる分散メッセージキューです。
メッセージキューとは、システム間のデータの受け渡しを仲介し、データを一時的に保持（キューイング）するミドルウェアのことです。

今回は、Apache kafka の Docker Image を使用し、ローカル環境で kafka を実行していきます。
使用する Apache kafka のバージョンは、2.6.0 です。

#### 2. 参考（実行環境）
#####　2-1. docker がインストールされている

```bash
$ docker -v
Docker version 19.03.6, build 369ce74a3c
```

#####　2-2. スペック

メモリはトータルで8GB搭載されているマシンを使用しましたが、4GB程度でも問題なく動作します。

```bash
$ cat /etc/issue
Ubuntu 18.04.2 LTS
```

```bash
$ cat /proc/meminfo | grep Mem
MemTotal:        8168284 kB
MemFree:         5540948 kB
MemAvailable:    7472660 kB
```

#### 3. コンテナのビルド・開始
Docker hub に kafka の Docker image は多く公開されています。
今回はこちらで用意した Docker image を使っています。

```bash
$ docker run --name my-kafka blueskyareahm/kafka:2.6.0
```

以下のように、Image がダウンロードされた後、コンテナが起動します。
※この画面はそのままにしておきます(Ctrl + C すると、コンテナが停止します）

```bash
Unable to find image 'blueskyareahm/kafka:2.6.0' locally
2.6.0: Pulling from blueskyareahm/kafka
75f829a71a1c: Already exists 
455e7974a143: Pull complete 
a439c4ff44d0: Pull complete 
b9eb8968940e: Pull complete 
e6979812c85a: Pull complete 
7812677cc867: Pull complete 
ceacbc38a4c6: Pull complete 
70319b3a888f: Pull complete 
3fb4c3130215: Pull complete 
68dc00f6ba7c: Pull complete 
Digest: sha256:802f5d87bfb51fd5af66853a345e0ed65de8acc2f3fd61c259def2d6c05f63d6
Status: Downloaded newer image for blueskyareahm/kafka:2.6.0
/usr/lib/python2.7/site-packages/supervisor-4.2.1-py2.7.egg/supervisor/options.py:474: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
2020-10-17 04:52:25,057 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
2020-10-17 04:52:25,068 INFO RPC interface 'supervisor' initialized
2020-10-17 04:52:25,069 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2020-10-17 04:52:25,069 INFO supervisord started with pid 1
2020-10-17 04:52:26,076 INFO spawned: 'zookeeper' with pid 9
2020-10-17 04:52:26,082 INFO spawned: 'kafka' with pid 10
2020-10-17 04:52:27,091 INFO success: zookeeper entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2020-10-17 04:52:27,091 INFO success: kafka entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
```

#### 4. Kafka Topic の作成
別のコンソールを開いて、以下のコマンドを実行します。
このコマンドでは、Kafka Topic を作成しています。（ここでは、名前を "topic1" としています)
Kafka は Topic を介してメッセージをやり取りします。

```bash
$ docker exec -it my-kafka /opt/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic1
```

以下のメッセージが表示されれば、OKです。

```bash
Created topic topic1.
```

#### 5. Kafka Producer の開始
以下のコマンドを実行します。
このコマンドでは、Kafka Producer を開始しています。
以下のようにインタラクティブにメッセージを受け付ける状態になります。

```bash
$ docker exec -it my-kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic1
>
```

#### 6. Kafka Consumer の開始
別のコンソールを開いて、以下のコマンドを実行します。
このコマンドでは、Kafka Consumer を開始しています。
実行しても、何も表示されませんが、メッセージを受け付ける状態になっています。

```bash
$ docker exec -it my-kafka /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic1

```

#### 7. Kafka Producer からメッセージを送信してみる
Kafka Producer 実行中のコンソールに戻り、何らかのメッセージを入力してみます。

Producer 側

```bash
$ docker exec -it my-kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic1
>Hello Kafka!
>
```

すると、Kafka Consumer 側に入力したものと同じメッセージが表示されます。
Consumer 側

```bash
$ docker exec -it my-kafka /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic1
Hello Kafka!
```