技術メモ

技術メモ

ラフなメモ

Apache Kafka入門

Kafka

Kafka の概要

  • Kafka は大量のデータを「高スループット」かつ「リアルタイム」に扱うためのプロダクト

f:id:tutuz:20190316121128p:plain

何ができるのか

  • 複数サーバによるスケールアウトが可能
  • 受け取ったデータをディスクに永続化可能
  • 連携できるプロダクトが多く存在するため、プロダクト間あるいはシステム間をつなぐハブとして機能する
  • メッセージの送達保証ができるため、データロストの心配がない

LinkedInが実現したかったこと

  • スループットでリアルタイムに処理したい
  • 任意のタイミングでデータを読み出したい
  • 各種プロダクトやシステムとの接続を容易にしたい
  • メッセージをロストしたくない

実現方法

  • メッセージングモデルとスケールアウト型のアーキテクチャ
  • データのディスクへの永続化
  • 分かりやすいAPIの提供
  • 送達保証

背景(Kafka誕生前のプロダクト)

メッセージキュー

  • メッセージをトランザクション管理する機構が備わっている一方で高スループットを出しにくい
  • 既存のメッセージキューはスケールアウトを前提にしたアーキテクチャではなかった
  • メッセージはすぐに処理し、長時間にわたって大量に蓄積する前提ではなかった

ログ収集

  • Hadoop HDFS に蓄積し、MapReduce で処理することが主眼に置かれていた
    • 利用するアプリケーションが Hadoop に限られてしまう
    • broker が Push するアーキテクチャであって、Consumer が任意のタイミングでメッセージを受け取りにくい

ETLツール

  • ファイルに固めて、バッチ処理として転送するアーキテクチャが主流であった
  • メッセージ 1 件単位でリアルタイムに処理することが難しい

メッセージングモデル

  • 基本的に以下の 3 要素で実現される
    • Producer:メッセージの送信元
    • Broker:メッセージの収集・配信役
    • Consumer:メッセージの配信先

キューイングモデル

f:id:tutuz:20190316121023p:plain

  • Broker 内にキューを用意
  • Producer からのメッセージがキューに溜め込まれる
  • Consumer がメッセージを取り出す
  • 1 つのキューに対して複数の Consumer が存在しうる
    • Consumer の処理はスケールアウトできる
    • Consumer が一度メッセージを受け取ってしまうと他の Consumer がそのメッセージを処理できない

Publish-Subscribeメッセージモデル

f:id:tutuz:20190316122318p:plain

  • Producer = Publisher
  • Consumer = Subscriber
  • Broker を介した受信・配信
  • Publisher は Broker の中にある Topic と呼ばれるカテゴリ内にメッセージを登録する

f:id:tutuz:20190316122709p:plain

  • Subscriber は 複数存在する Topic のうち一つを選択してメッセージを受け取る
    • 複数の Subscriber が同一の Topic を購読するとしていれば、複数の Subscriber は同一のメッセージを受け取る
  • 異なる Topic からは異なるメッセージを受け取る

Kafka のモデル

  • Pub/Sub モデルがベース
  • Kafka はキューイングモデルと Pub/Sub モデルをあわせ持つモデルになっている
  • Consumer Group という概念を導入 ※良さが分かっていないのでUPDATEする
    • 複数の Consumer が同一の Topic から分散してメッセージを読み出す
    • Consumer をスケールアウトできる構成
  • Broker も複数サーバでスケールアウトする

データのディスクへの永続化

  • Broker に送られたメッセージをディスクに永続化している
  • ストレージシステムの一種

分かりやすいAPIの提供

  • Connect API を用意
    • Connect API を経由して各種外部システムと接続する
  • Kafka Connect

送達保証

送達保証方式 説明 再送有無 重複の可能性有無 備考
At Most Once 1 回は送信を試みる なし あり メッセージは重複しないがロストする可能性がある
At Least Once 少なくとも 1 回は送達する なし あり ロストはしないが重複する可能性はある
Exactly Once 1 回だけ送達する なし なし ロストもしないし、確実に1回メッセージを送達できる
  • Kafka はまずは At Least Once を目指した

At Least Once

f:id:tutuz:20190316125043p:plain

  • Ack と Offset Commit
    • Ack は Broker がメッセージを受け取った後に Producer に対して受け取ったことを示す応答を返す
    • Consumer が Broker からメッセージを受け取る際に Consumer がどこまでメッセージを受け取ったかを管理するためのオフセットがある

Exactly Once

Kafka のユースケース

データハブ

  • 多数のシステム間でデータを流通させる

ログ収集

  • BIツールによるレポーティングやAIによる分析のために、複数のサーバで生成されるログを収集し、蓄積先へつなぐ

Webアクティビティ分析

  • 異常値検知や不正検知など、Web上のユーザのアクティビティをリアルタイムに分析する

IoT

  • センサーなどのデータを受信して、デバイスに送信する

イベントソーシング

  • データに対するイベントをイベントを逐次記録して、大量のイベント処理を柔軟に実現する

Kafka の特徴

  • リアルタイム
  • 同報配信
  • 永続化
  • 送達保証
  • 順序保証

  • TODO

参考書籍