Apache Kafka入門
Kafka
Kafka の概要
- Kafka は大量のデータを「高スループット」かつ「リアルタイム」に扱うためのプロダクト
何ができるのか
- 複数サーバによるスケールアウトが可能
- 受け取ったデータをディスクに永続化可能
- 連携できるプロダクトが多く存在するため、プロダクト間あるいはシステム間をつなぐハブとして機能する
- メッセージの送達保証ができるため、データロストの心配がない
LinkedInが実現したかったこと
- 高スループットでリアルタイムに処理したい
- 任意のタイミングでデータを読み出したい
- 各種プロダクトやシステムとの接続を容易にしたい
- メッセージをロストしたくない
実現方法
背景(Kafka誕生前のプロダクト)
メッセージキュー
- メッセージをトランザクション管理する機構が備わっている一方で高スループットを出しにくい
- 既存のメッセージキューはスケールアウトを前提にしたアーキテクチャではなかった
- メッセージはすぐに処理し、長時間にわたって大量に蓄積する前提ではなかった
ログ収集
ETLツール
メッセージングモデル
- 基本的に以下の 3 要素で実現される
- Producer:メッセージの送信元
- Broker:メッセージの収集・配信役
- Consumer:メッセージの配信先
キューイングモデル
- Broker 内にキューを用意
- Producer からのメッセージがキューに溜め込まれる
- Consumer がメッセージを取り出す
- 1 つのキューに対して複数の Consumer が存在しうる
- Consumer の処理はスケールアウトできる
- Consumer が一度メッセージを受け取ってしまうと他の Consumer がそのメッセージを処理できない
Publish-Subscribeメッセージモデル
- Producer = Publisher
- Consumer = Subscriber
- Broker を介した受信・配信
- Publisher は Broker の中にある Topic と呼ばれるカテゴリ内にメッセージを登録する
- Subscriber は 複数存在する Topic のうち一つを選択してメッセージを受け取る
- 複数の Subscriber が同一の Topic を購読するとしていれば、複数の Subscriber は同一のメッセージを受け取る
- 異なる Topic からは異なるメッセージを受け取る
Kafka のモデル
- Pub/Sub モデルがベース
- Kafka はキューイングモデルと Pub/Sub モデルをあわせ持つモデルになっている
- Consumer Group という概念を導入 ※良さが分かっていないのでUPDATEする
- 複数の Consumer が同一の Topic から分散してメッセージを読み出す
- Consumer をスケールアウトできる構成
- Broker も複数サーバでスケールアウトする
データのディスクへの永続化
- Broker に送られたメッセージをディスクに永続化している
- ストレージシステムの一種
分かりやすいAPIの提供
送達保証
送達保証方式 | 説明 | 再送有無 | 重複の可能性有無 | 備考 |
---|---|---|---|---|
At Most Once | 1 回は送信を試みる | なし | あり | メッセージは重複しないがロストする可能性がある |
At Least Once | 少なくとも 1 回は送達する | なし | あり | ロストはしないが重複する可能性はある |
Exactly Once | 1 回だけ送達する | なし | なし | ロストもしないし、確実に1回メッセージを送達できる |
- Kafka はまずは At Least Once を目指した
At Least Once
- Ack と Offset Commit
- Ack は Broker がメッセージを受け取った後に Producer に対して受け取ったことを示す応答を返す
- Consumer が Broker からメッセージを受け取る際に Consumer がどこまでメッセージを受け取ったかを管理するためのオフセットがある
Exactly Once
Kafka のユースケース
データハブ
- 多数のシステム間でデータを流通させる
ログ収集
- BIツールによるレポーティングやAIによる分析のために、複数のサーバで生成されるログを収集し、蓄積先へつなぐ
Webアクティビティ分析
- 異常値検知や不正検知など、Web上のユーザのアクティビティをリアルタイムに分析する
IoT
- センサーなどのデータを受信して、デバイスに送信する
イベントソーシング
- データに対するイベントをイベントを逐次記録して、大量のイベント処理を柔軟に実現する
Kafka の特徴
- リアルタイム
- 同報配信
- 永続化
- 送達保証
順序保証
TODO