Kafka ラボ:ブラウザーでトピック、プロデューサー、コンシューマー、パーティション、オフセットを学ぶ

このラボでは、生徒それぞれが自分の Apache Kafka を使えます。ZooKeeper を使わない KRaft モードのブローカー1台と、その横に Kafka UI があります。3つのパーティションを持つトピックを作り、メッセージを送り、先頭から読み直し、各パーティションが自分のオフセットを数える様子を、何もインストールせずに確かめます。

2つの公開イメージで作ってあり、攻撃用のラボではないので、脆弱な部分はありません。意図的に小さく、ヒープ 256 MB のブローカー1台で、負荷をかけるためではなく学ぶためのものです。ラボのコピーにはインターネットへの出口も、ほかの生徒への経路もありません。

生徒が学ぶこと

トピックとは何かを学びます。プロデューサーが末尾に追加し、コンシューマーが好きな位置から読める、名前の付いたログです。トピックがパーティションに分かれること、各パーティションが自分の順序を保ち、オフセットを0から数えること、先頭から読み直すと読み手がまだ見ていないメッセージが返ること(新しいコンシューマーが追いつく方法)を確かめます。イベント駆動アーキテクチャ、メッセージングとキュー、データパイプライン、分散システムの単元に向いています。正確な表現は、お使いの認定機関の単元でご確認ください。

ブラウザーで動かす

ラボのサービスは2つで、ブローカーの kafka と、開くページであり、ラボのターミナルが入力を送る先でもある kafka-ui です。ターミナルには curl があり、Kafka のコマンドラインツールはないので、コマンドはページ自身が呼び出す Kafka UI の Web API に送ります。ラボを止めるとブローカーは何も残さないので、起動し直したラボは空の Kafka です。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。Apache Kafka: topics, producers and consumersを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページのラボバーに「Kafka UI」というリンクが1つあります。開いてクラスター lab を選び、「Add a Topic」で3パーティションのトピックを作ります。「Produce Message」で選んだパーティションにメッセージを送れ、「Overview」には各パーティションの First Offset と Next Offset が並びます。ラボの横のターミナルで curl http://kafka-ui:8080/api/clusters を実行すると、同じページの API にクラスターを尋ねます。

何を提出させるか

メッセージを送る前後のトピックのパーティションとオフセットのスクリーンショットと、先頭から読み直したメッセージのスクリーンショット。理解を確かめるため、なぜ各パーティションが0から数え始めるのか、メッセージのオフセットがトピック全体での位置ではないのはなぜか、ブローカーが複数ならば何が変わるかを、1、2文で書いてもらいます。さらに進めるなら、パーティション数の違う2つ目のトピックを求めます。

自動では採点されません。ラボの限界も授業で伝える価値があります。ブローカーが1台なので複製するものがなく、複製とリーダー選出は説明するだけで、見せることはできません。

このラボの基本レッスン

Kafka Basics は、このラボで進める小さなレッスンで、各手順に説明と、生徒のターミナルにコマンドを入力する「実行」ボタンが付いています。クラスターを確認し、3パーティションのトピックを作り、2つのパーティションに3件のメッセージを送り、送る前後の各パーティションのオフセットを見て、先頭からすべて読み直します。

無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、自分のモジュールにコピーしてください。

GitHub のコード

compose ファイルは2つの公開イメージを、それぞれバージョンに固定し、手を加えずに実行します。Apache Kafka と Kafka UI(どちらも Apache-2.0)で、どちらも私たちは配布していません。ブローカーには、環境設定でラボのネットワーク上の自分の名前を伝えてあり、トピックは勝手には作られないので、トピックがあるのは生徒が作ったからです。リポジトリのテストは、プラットフォームと同じ制限の下で、生徒としてラボを通します。

課題として出す

課題には、どのトピックを作るかと、何を提出するかを書いておきます。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-kafka とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

よくある質問

生徒は Kafka のコマンドラインツールを使えますか?
ラボのターミナルからは使えません。curl はありますが Kafka のスクリプトはなく、ターミナルから別のサービスの中でコマンドを実行することもできないためです。代わりに Kafka UI とその Web API で学びます。同じトピック、パーティション、オフセットが見られます。
ラボを止めてもメッセージは残りますか?
いいえ。ブローカーのデータは保存されないので、ラボを止めて起動し直すと空の Kafka になります。止める前にスクリーンショットを撮るよう伝えてください。
Kafka ラボは自動で採点されますか?
いいえ。自動では採点されません。パーティションとオフセット、および先頭から読み直したメッセージのスクリーンショットと、なぜ各パーティションが0から数えるのかを書いた1文を提出してもらってください。