世界を動かす技術を、日本語で。

なぜApache Kafkaは作られたのか?

概要

  • Apache Kafka は、もともと LinkedInのデータ統合問題 を解決するために開発された分散型メッセージングシステム。
  • 旧システムの 非効率性・拡張性不足 が、Kafka誕生の直接的な動機。
  • スキーマ管理・リアルタイム性・高い耐障害性 が主要な設計要件。
  • Kafkaは データの可用性・統合性・自動化 を実現し、組織全体のデータ活用を加速。
  • スキーマ設計と所有権移譲 が最終的な成功の鍵。

Kafka誕生の背景とLinkedInの課題

  • 2012年当時のLinkedIn は、サイトアクティビティデータの統合に苦戦
    • データ利用例:不正検知、求人マッチング、ML学習、基本的なWeb機能、DWHへの取り込み
  • 既存インフラは 堅牢性に欠け、手動作業が多発
    • バッチ処理によるDWH連携パイプライン
    • Zenossを用いたリアルタイム監視パイプライン
  • 共通課題
    • 手作業・保守負担の大きさ
    • データカバレッジ不足とバックログの増大
    • システム間の統合性欠如、複数データの統合困難

旧システムの根本的な問題点

  • スキーマ解析 :数百のXMLスキーマ、Hadoop等下流システムとの非互換
  • 脆弱性 :パイプライン障害がWeb機能に直結
  • スキーマ進化の困難さ :下流影響を考慮した変更が困難、チーム間連携不足
  • リアルタイム性の欠如 :指標取得に数時間のラグ
  • データ分断 :運用指標とアクティビティデータの統合不可
  • 分析の制限 :長期間の運用指標分析不可
  • 単一宛先問題 :用途拡大に追従できないデータ配送

LinkedInの新システム要件

  • 堅牢なパイプライン :標準APIによる信頼性
  • スケーラビリティ :水平拡張可能な構成
  • スキーマ管理 :後方互換性のある契約
  • 高いファンアウト :多宛先へのデータ配送
  • リアルタイム性 :秒単位の低遅延
  • プラグ&プレイ統合 :新規ソース/シンクの容易な追加
  • 所有権の移譲 :データ作成チームへの責任移管
  • 読者・書き手の分離 :データバックログ耐性

Kafkaによる解決とその特徴

  • 分散設計・レプリケーション・耐障害性 による堅牢化
  • パーティションによるスケーラビリティ、コモディティハードウェアでの拡張
  • ロックフリーなログ構造 で高スケール読込を実現
  • ディスクバッファリング により読者遅延の影響排除
  • リアルタイム性 の大幅向上(初期10秒→現在は数秒以下)

スキーマ管理とデータ統合の進化

  • XMLからApache Avroへ移行 :データサイズ7分の1、さらに3倍圧縮
  • スキーマレジストリの先駆け開発 :全バージョンの履歴管理とID付与
  • 後方互換性モデル :プログラム的なスキーマ変更チェック、BREAK防止
  • 単一スキーマ戦略 :上流・下流間で統一、手動変換作業の排除
  • スキーマオンライト :Kafka着信時にクリーン化、全用途への即時利用可能化
  • コードレビュー必須化 :スキーマ変更時の全関係者承認、ドキュメント化促進

所有権移譲と組織的変革

  • パイプラインチームからデータ作成チームへ責任移管
  • 下流システムとの合意形成 :全チーム共同でスキーマ策定
  • スキーマ管理体制の明確化 :組織全体のデータ品質向上

結論

  • Kafka + スキーマ管理 は、 大規模データ統合とリアルタイム処理 のための最適解
  • データ統合・スキーマ設計・所有権移譲 の重要性
  • LinkedIn事例が示す、 組織横断的なデータ活用基盤構築の成功モデル

Hackerたちの意見

企業向けじゃないところでKafkaを使った失敗をしたことがあるけど、etcdの問題に似てるよね。サービスを提供するのに必要な時間より、etcdを動かすのにもっと時間がかかる感じ。

以前、クライアントのためにKafkaクラスターのセットアップや運用を手伝ってたんだけど、彼らがKafkaを必要とする理由がいつも最初の質問だったんだ。結局、誰からもいい答えはもらえなかった。Kafkaが役立つことは間違いないけど、適切な状況での話ね。でも、その状況は「キューが必要」っていうのじゃない。キューが必要なら、RabbitMQとかZMQ、Redis、SQS、名前付きパイプ、Kafka以外の何でも使えばいい。Kafkaができないわけじゃないけど、余計な手間をかけてるだけだよ。

分散システムを運用してるなら… それは簡単じゃないよ。特にAWSではね。AWSは本当に両刃の剣だよ。分散システムをすぐにセットアップするためのチュートリアルはたくさんあるけど、ノードの信頼性は全然ないし、ネットワークもあまり信頼できない。コストも安定しないし、管理も大変。長い目で見ると頭痛の種が増えるよ。

https://s2.dev で作ってるもの、気に入るかもね :)

Kafkaは、少なくとも名前は的を射てるよね。

スタートアップの創業者だけど、試してみたら、なんか膨れすぎてる感じがした(Javaだし!)。官僚的で、必要以上に複雑だと思う。90%のユースケースにはRedisのキューとかZMQで十分だと思う。超パフォーマンスが求められるハイパースケールなアプリケーション(例えば、リアルタイムトレーディングや大規模なストリーミングプラットフォーム)でこそKafkaが必要になるんじゃないかな。

Redpanda試したことある?

もしこの手のRedisキュー(https://redis.io/glossary/redis-queue/)を使ってるなら、PUSH/POPとファンアウトの違いで、Kafkaが作られた問題とは全然別の問題に取り組んでることになるよ。記事にも書いてあるけど、ファンアウトは重要な設計特性だよね。今は「Redis Streams」もあるけど、当時はなかったし、耐久性やクラスターの話もあまり良くないと思う。だから、ある程度までは使えるかもしれないけど、将来的にシステムがどうなるかによっては一般的には適してないかも。RedPandaみたいにJavaなしでKafkaを使えるものもあるけど、もしパーティショニングを気にせずに単一ノードで動かせるなら、できるだけそうした方がいいよ。複数のパーティションを追加すると、順序を考えるのが難しくなってくるし、メッセージキーみたいなもので対処できるけど、制限があってホットスポットやスケーリングのボトルネックにつながることもある。PUSH/POPベースのシステムも、少なくとも一度は保証してくれないし(Redisには「pop+push」みたいな、単一のコンシューマーが管理する別のリストに移動する機能があるけど、スケールアウトするのが難しくなりそうだよね…)。

なんか膨れすぎてる感じがした(Javaだし!) それって具体的にJavaのどこが膨れすぎてると感じたの?Javaの言語やランタイムが特に膨れすぎてるとは思わないから、Javaソフトウェア周りでよく見かけるプラクティスや原則のことを指してるのかな?

必要とされるのに「ハイパースケール」である必要はないよ。ハイパースケールの定義がかなり違うなら別だけど。数千台のサーバーからのアクセスログがあれば、どんな単一インスタンスのサービスでも限界を超えるし、Kafkaはそのワークロードにはすごく合ってる。

おそらく、超パフォーマンスが求められるハイパースケールのアプリケーション(例えば、リアルタイムトレーディングや大規模ストリーミングプラットフォーム)でこそKafkaが活躍するんだろうね。Javaの人たちは、仕事の安定のために新しいことを学びたくないから、Kafkaを使ってるけど、今はもっと速くて互換性のある代替品があるのに。Redpandaを使う方が、Kafkaを使い続けてリソースを食い潰しながら文句を言うよりいいよね。AWSに何十万も取られてるのに。

Kafkaにイベントを発行すると、それが「外に出る」形になって、失われないことが保証されるし、データウェアハウスを含む興味のある消費者が自分のペースで処理できるようになる(保持期間は通常72時間くらいだけど)。私たちにとって、Kafkaのトピックやスキーマは、gRPCのIDLと同じくらいAPIの一部なんだ。Redisや0MQのようなものは、同じサービスのインスタンス間の内部調整にはもっと適していると思うし、特定のコンシューマを意識したプロデューサーには特にね。

Hacker Newsで議論の続きを見る