Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】『データ指向アプリケーションデザイン』:深遠なる分散データの新大陸への旅

 読破した分厚いオライリー本の感想記事です。本書ではCPUの速度がボトルネックになるようなものは演算指向アプリケーションと区別し、データの量や複雑さ、変化の速度が主題となるシステムを「データ指向」と位置づけて、特定技術に幅を狭めずに包括的に解説した本となっています。
 著者はイギリス、ケンブリッジ大学の分散システムの研究者 Martin Kleppmann氏。監訳者が斉藤太郎氏、訳者は玉川竜司氏。
 タイトルの『データ指向アプリケーションデザイン』の原題は Designing Data-Intensive Applications。よく使われる「オブジェクト指向」の原語は Object-Oriented ですが、本書の「指向」は Intensive で若干ニュアンスが違います。たまに見るデータ駆動、データドリブンなどともちょっと違いますね。
Intensive単体の意味は強い、激しい、徹底的、集中的など。アプリケーション設計の他の要素を軽んじたわけではなく、データとしての観点、データの構造や取り扱い方、データを扱う様々なテクノロジーに特に着目し、どこまでも奥深く深堀りした本という感じでしょうか。

www.oreilly.co.jp

第I部 データシステムの基礎

1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション

 最初は信頼性、スケールのしやすさ、メンテナンス性がデータシステムの3本柱だと定義し、基本部分をしっかり述べています。データ指向なアプリケーションの実際の例としてTwitterのホーム画面のデータ取得の仕組みが解説されていて面白いですね。
最初は伝統的なRDBの複数テーブルのJOINでSQL文を書いていたのですが負荷に苦しみ、途中から各ユーザごとにツイートタイムラインのキャッシュを持たせてそこに追加する仕組みに変えたところ上手くいった…という話は納得できるところです。
 スケールしやすさでは負荷やパフォーマンス、レイテンシやレスポンスタイムなど、曖昧になりがちな用語をしっかり定義から解説しています。3本柱の最後ののメンテナンス性の内容は運用性、単純さ、進化性(拡張性)と細分化して述べています。

2章 データモデルとクエリ言語

そして第2章はデータモデルの話。データ構造の例が履歴書で、まさかのビル・ゲイツ大先生の履歴書が登場します! 有名な技術ではMapReduceが出てきて、技術の変遷を振り返ることができます。
 後半に出てくるドキュメントデータベースは単純なデータ構造で、1レコード丸ごと取ってくれば解決するような状況で有用。大きなJSON構造の中の方を探っていったり他のデータとの組み合わせが重要な際は伝統的なリレーショナルデータベース(RDB)が向いていると論じています。この手の話の真理はだいたいそうなのですが、やはり使い分けなんですね。
 そして別種のデータでも繋がりで示していくことのできるグラフ型データモデルというのは、個人的には知らなかったので完全に新しい世界でした。Facebook保有している人と人との繋がりのソーシャルグラフはこんな感じの構造になっているそうです。

3章 ストレージと抽出

 データの中にインデックスを備えて検索しやすくする仕組みの話では、BツリーはRDBの世界ではお馴染みでしたがSSTableやLSMツリーというワードは初めて聞きました。世の中にはいろんなDBの仕組みがあるのだと改めて思い知らされます。
小ネタとしては、AWSのデータ分析に使うデータウェアハウス(DWH)のサービス、Amazon Redshiftの源流は2000年代のオンプレの別製品だったという話が出てきたりします。
 通常のトランザクション処理でなくDWHでよく使われる列指向ストレージの話やデータキューブなど、自分も漠然と理解していた所をしっかり本書では解説してくれていました。

4章 エンコーディングと進化

 本書での「エンコーディング」は文字コードや暗号化/復号化の話ではなく、メモリ上に存在するインメモリのデータを通信時にどう変換していくかの話です。何気なく使っているJSONXMLにもフォーマットを認識させるためのいろんなライブラリがあるのが分かります。
 後半はWeb開発ではおなじみRESTとRPC(リモートプロシージャコール)、メッセージパッシングなど。僕はエンプラ世界でもJavaによるWebアプリケーションが花開いた頃、まだRESTやAjaxが出てくる前にSOAPでの通信とかも仕事でやってきたのですが、様々な変遷の歴史があって現在があるのだなと改めて思います。

第II部 分散データ

 第I部でデータの基礎を解説したあとは、本書のメインとも言える分散データ、複数のマシン上に大量データを置いた世界へと広がっていきます。

5章 レプリケーション

 クラウド世界のDBでよく出てくるレプリカ、データベースを複製していく話。日本語で「リーダー」と書くと英語の読み手の reader の時と導き手の leader の時があってあってややこしいですね。本書では導く方の「リーダー」と従う方の「フォロワー」という区分けを使っています。AWSだとRDSやAuroraで「プライマリ」「リードレプリカ」と呼んでいるところです。
 分散データモデルでDBを書き込みもできるリーダー、読み込み専用の複数のフォロワーを用意する方式にけ、さらにリーダーはただひとつの「シングルリーダー」の場合と複数いる「マルチリーダー」の場合に分けてそれぞれの長所、問題について論じています。さらにリーダーを決めない「リーダーレス」というアプローチもあってややこしいです。
 AWSなどだと「結果整合性(Eventual Consistency)モデル」と呼ばれる考えの周辺ですが、深く見ていくと様々なユースケースがあって奥がとても深いです。複数に書き込み可能なリーダーレスレプリケーションの方式や衝突防止の考え方など、いろんな仕組みを持ったDBが世の中にはあるのだなと改めて気付かされます。
素人目には、一番ポピュラーらしいシングルリーダーレプリケーションの仕組みが無難なのかなと思いました。

6章 パーティショニング

 データベースを新しく作る際やOSを入れ直す際によく出てくるパーティショニング。こちらは1つのマシン上でデータを分割して持つ話。どんなキー範囲で分割するかのロジックの話などが出てきます。
キー - バリュー型DBで出てくるセカンダリインデックスの理論が出てきて、なるほどAWSのDynamoDBの用語「グローバルセカンダリインデックス」はここから繋がるのか…となります。

7章 トランザクション

 リレーショナルデータベースだと必ず出てくるトランザクション。本書では章の冒頭からトランザクションという捉えどころのない概念」と題し、歴史的経緯や過去のいろんなDBの発展から、けっこう定義が曖昧だったり用語や範囲で混乱があることも含めて深掘りしています。複数ユーザがデータをいじり、左から右にトランザクションが流れているユースケースの様子を表す図が複数出ててきて頭の整理になります。
 よく出てくるトランザクションの分離レベルについては本書では…

  • ダーティリードが発生する Read Uncommitted は特に触れず
  • よく使われる Read Commited
  • スナップショット分離(OracleSerializable、PostgresとMySQLはリピータブルリード)
  • もっとも厳しいレベルは本書では「直列化可能分離レベル」

という分類で解説しています。DB製品によって指しているものが若干違うあたりは理解が曖昧だったので目からウロコでした。
 ほか、個人的には大昔にPL/SQLなどやって懐かしいストアドプロシージャ(DB内にSQLベースのプログラムを書いてデータを扱う技術)が、本書ではその悪評をしっかり書いていて時代を感じたりしました。

8章 分散システムの問題

 Webシステム以外も踏まえてネットワーク的に起きる諸問題を論じています。データが分散しているのでネットワークの分断で不都合が起こる、ノード、そのマシンごとに現在時刻のクロックが違うと整合がとれない…など。
 互いに分断された場所にいて伝令を通じてしかやりとりできない将軍がn人おり、配下に裏切り者がいる。このシチュエーションで正しい合意を形成できるか…? という分散システム特有の「ビザンチン将軍問題」も解説されています。なんだかアカデミックでかっこいい。

ja.wikipedia.org

9章 一貫性と合意

 誰かが更新したそれが必ず保証されるもっとも厳しい線形化可能性、そしてそれは理想形なのでトレードオフした現実的な仕組みの話へ。
 分散システムでの処理の順番の話では、RDBの世界でも出てくる2相コミットの話など。2相コミットの概念を結婚式に喩えてるのが面白いです。

ja.wikipedia.org

第III部 導出データ

そしてIII部は理論から現実に返り、そして未来を語っていきます。

10章 バッチ処理

 UNIXツールやその概念が昔からどれだけ優れているかの話から始まり、Google 謹製の分散処理システムMapReduceUNIXの考え方がベースにあるという話など。
違う技術でも深堀りしていくと根本は似ている…というのはITの世界でけっこう出てきますね。

11章 ストリーム処理

 バッチの後は、終わりがなくずっとデータのやり取りが続くストリーム処理。プロデューサーとコンシューマー、メッセージブローカー、ファンアウトなど、クラウド系で聞く単語が出てきます。
具体的な技術ではApache KafkaやAWSならKinesis Data Streamsなど。意外なところでドメイン駆動デザインの名もこの章で出てきました。

12章 データシステムの将来

そして最後は、それぞれ利点欠点のあるさまざまな技術を組み合わせてデータを取り扱う未来への展望について語っています。これまではデータ指向の様々な話を中立的に包括的にしっかり述べていましたが、この章は作者さんの想いがこもっていてかなりエモいです。
 様々な技術を使ったアプローチの将来、正確性の追求、そして最後は「正しいことを行う」として、ビッグデータを扱う際の倫理性や責任、監視社会への懸念など技術以外の話も載っています。

「正しいことを行う」の原文は Do the right thing なのでしょうか。スパイク・リー監督の映画でもあり、2018年に Don’t be Evil から代わったGoogleの新しいモットーとしてもIT界隈で有名ですね。

ja.wikipedia.org

 より良い未来、人に思いやりと尊重を持って接せられる未来を目指し、子孫が誇れるようなことをしていこう、ソフトウェアとデータの力で未来を創っていこう...というスタンスで最後は結んであり、最後までビシッとかつエモく締めています。読み終わって冒頭に返っても、最初のページに書いてあるのは

本書は、善に向かって働くすべての人々に捧げます。

 とエモエモです。

まとめ:データの世界の深奥に触れられる本

 いやはや全体600ページ超え(650Pくらい?)の圧倒的なボリューム、データと分散データの世界がどれほど奥深いか、その片鱗に触れられる一冊でした。

 正直に申し上げると、ワタクシの不十分な知識では難しすぎて理解できないところもありました(苦笑)。
凄い本の予感がしたので最初はゆっくりじっくり精読していたのですが、そのペースだといつまで経っても終わらなさそうに見えてきて、途中から読む速度を上げて概要を読むようにしてなんとか読破しています…

 データを取り扱う仕組み、技術、製品、様々なものを包括的に説明し比較検討、歴史的な経緯もかなり分かります。データ関連のキーワードが出てきたらとりあえずこの本を探せばどこかに載ってるのでは? と思うぐらいの網羅度です。各章の最後にも参考文献の嵐、巻末の用語集と索引にもかなりのキーワードがずらりと並んでいます。本自体の物理的な圧と相まって、しゅ、しゅごーい(語 彙 力)…と圧倒されます。

 データ関連の専門用語はたくさん登場して正直難しいのですが、日本語で不自然なところはなく、各キーワードは最初に概念がしっかり説明されていて混乱は少ないです。いやはや学術書、教科書かくあるべきという感じですね。
冒頭に執筆に4年かかったとあり、こんな分厚い本を書くのもすごいし、翻訳するのもさぞかし大変だっただろうなと思います。著者のマーティン・クレップマンさんは以前はLinkedInなどに在籍、今はケンブリッジ大学の研究者ということで、本全体からアカデミックな雰囲気が漂っていますね。

  • (本書では冒頭でビッグデータバズワードと断じていますが)ビッグデータ機械学習周り、データサイエンティストとして深めたい方
  • ユーザ数などがこれから増えるかもしれなくてスケールさせる必要のあるサービスやアプリケーションについて、アーキテクチャやデータ構造の設計に関わる方
  • いずれかのクラウドプラットフォームを使っていたり知っている方、特にデータ処理に触れている方(AWSを中心に著名なサービス名も時々登場します)
  • データベースやトランザクションなどなど、雰囲気でやってきた感があってきちんと学び直したい方

などが読むと一部だけでも得られるものが多いと思います。一方、

という段階の方だと即効性を求めるなら他の本のほうがよいでしょう。後で何かの機会にじっくり読んでじわじわ効いてくるような本です。
 また初心者にもオススメしかねます。実際に測ったのですが本の厚さ3.5cm、電子版もなく、下手に手を出すと玉砕する確率は高いのではと愚考いたしまする。僕も机の横で長らく(?)積本になっていたのですが、コロナで全面テレワークになってこんな時こそ分厚い本を読もうと分散データ世界への旅に出ました。もし物理出社が続いていたら、さらに積本の状態が続いたかもしれません…(笑)

 オライリー本らしく各章の冒頭に格言があるのもかっこいいですね。
そして本書の独自仕様として、2章からは各章の冒頭にデータ指向の世界を喩えたファンタジー風の地図が毎回載っています。
最初は交易ルートからJSON岬を超えてXMLデータベースの廃墟を横に帆船で到着、各種RDBがある首都を超えるとリレーショナル帝国、NoSQL危険地域を避けるには高きグラフデータベース峰を超えて…と、各章ごとに旅が続きます。小島あり環礁あり、山や谷や森や砂漠、天空の城に火山と旅は続きます。
 謎に満ちた未踏の大地、広大なるデータ群島大陸への冒険の旅に乗り出した旅人や冒険者のような気分になれます。探求のジャーニーの傍らに地図を起き、読破を目指して読み進めるのもなにやら趣があります。(RPG脳乙!)

 という訳でイノシシ本の感想でした。なおカバーのイノシシはインドイノシシ。ヒンズー教ヴィシュヌ神の化身にして古代ギリシャでは勇敢な敗者の象徴。戦に赴くゲルマン戦士たちの鎧を飾り、我々アジア世界の十二支では決意と衝動を表す生き物だそうでございます。

リンク集

 勝手ならが感想記事を集めてみました。

関連書籍

よく一緒に出てくるオライリー本ですと『分散システムデザインパターン』があります。