【書評】Apache Kafka 分散メッセージングシステムの構築と活用


先日発売された書籍Apache Kafka 分散メッセージングシステムの構築と活用を読みましたので、その感想をご紹介します。本書はかなり丁寧に書かれており、補足が充実しているので、他のメッセージバスの経験がない人でも読みやすいと思います。

第1部 導入Apache Kafka
1 Apache Kafkaの概要
2 Kafkaの基本
3 Kafkaのインストール
4 KafkaのJava APIを用いたアプリケーションの作成

第2部 実践Apache Kafka
5 Kafkaのユースケース
6 Kafkaを用いたデータパイプライン構築時の前提知識
7 KafkaとKafka Connectによるデータハブ
8 ストリーム処理の基本
9 Structured Streamingによるストリーム処理
10 Kafkaで構成するIoTデータハブ
11 さらにKafkaを使いこなすために

感想

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

本書ではKafkaが持つ特徴を上記の4つの項目として定義し、それぞれに関する理論的な背景や他のセービスとの連携のところを説明しているのが興味深かったです。Kafkaのバージョンが今年に入って0系から2.0系までアップデートが進んでおり、個人的にはキャッチアップができなかったところがありましたが、2.0系までカバーしている本書のおかげである程度新しい情報が把握できたと思います。
特に「Kafka」と「Apache SparkのStructured Streaming」との連携を行うところも充実に説明されているので、Exactly once semanticなど新しい手法でStreaming処理を行い人には良いレファレンスになると思います。だた、この部分はDataFrameではなくDatasetをベースに説明されていますが、DatasetだとEncoder使用によるSerialization処理で一部パフォーマンスの低下が発生する他、Datasetが利用できないPySparkユーザには役に立たないため、DataFrameで書かれた方がよかったのではないかと思います。

気になった箇所

  • 高いスループットを実現するため、KafkaではPublisher-Subscriber メッセージングモデルをベースにしつつ、複数のConsumerが分散で処理するためにConsumer Groupという概念を導入している(p18)

  • Ackの設定を1またはallにした場合の重要な点として、各レプリケーションが「書き込まれた」判断しAckを返すタイミングはMessageがメモリ(OSのバッファ)に書き込まれたタイミングとなります。ディスクにflushする(永続化する)タイミングは別のプロパティで制御されます。(p45)

  • イベントソーシング:データに対する一連のイベントを記録し、逐次CQRSの考え方と併用して大量のイベント処理を柔軟に実現する(p95)

まとめ

以前まで参考にしていたKafka: The Definitive Guideが O'Reillyの「The Definitive Guide」シリーズとしてはかなり低い評価だったため残念と思いましたが、本書は簡潔な日本語で書いており概念のおさらいに非常に役に立ちました。また様々な場面で使われている図もかなり分かりやすく描かれてましたのが良かったと思います。