『データ指向アプリケーションデザイン ――信頼性、拡張性、保守性の高い分散システム設計の原理』を読みました。 データの扱いに焦点を当て、様々な技術とその特性が詳解されていて、とても良い書籍でした。
感想
現在の知識・経験でも読み通せる1~7章を中心に読み、8章意向は流し読みをしました。読んで良かった点と感じた点はこちらです。
- データにまつわる多くの具体的な技術名を列挙しているため、幅広い技術について知れる
- 多くの研究結果に裏付けされていて、信憑性が高い
- 書籍の構成が良く、章ごとの「まとめ」だけ読んでも要点をしっかり掴むことができる
一方で、使ったことのない技術(ストリーム処理)などは理解が難しく感じました。また、その他の技術も、深く利用したことがないものが多く、完全に理解したとは言い難い状況です。
主に技術選定を担うテックリード、アーキテクトのような方が読むのに適した本のように感じましたので、ある程度間隔を開け、再度本書を読み直す予定です。
学習メモ
しっかり読んだ、1章~7章までメモとなります。
1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
- ソフトウェアを3つ課題から考察している
- 信頼性: フォールトがあってもシステムが正しく動作できる性質のこと
- スケーラビリティ: 負荷が増大しても優れたパフォーマンスを保つための戦略のこと
- 運用性: ソフトウェアを開発、運用するエンジニアの作業効率に関する性質のこと
有益なアプリケーションは機能要件と非機能要件を満たすが、上記3課題は非機能要件に分類される
2章 データモデルとクエリ言語
- データの永続化方法をデータモデルと呼ぶ
- データモデルには3つのモデルがある
- ドキュメントデータベース: データが自己完結しドキュメント間の関係が存在しないようなケースに向く
- グラフデータベース: あらゆるデータ同士が関係するケースに向く
- リレーショナルデータベース: 1つのデータが自己完結する場合もあれば多のデータと関係するようなケースに向く
3章 ストレージと抽出
- データベースのストレージエンジンは2ついずれかの処理に最適化されている
4章 エンコーディングと進化
5章 レプリケーション
- レプリケーションとは、ネットワークで接続された複数のマシンに同じデータのコピーを保持しておくこと
- リーダーは、書き込みを担うノードであり、更新をフォロワーノードに通知する
6章 パーティショニング
- パーティショニングとは、大規模なデータセットを小さな部分集合に分割すること
- パーティショニングには、2つのアプローチがある
7章 トランザクション
- レースコンディション(レース条件)とは、並列動作するプロセスやスレッドが同一のリソースへ同時にアクセスしたとき、想定外外の処理結果が生じる問題のこと
- 並行性制御のための分離レベルと実装として3点がある
- read committed
- ダーティライトを避けるために、行レベルのロックが実装されている
- ダーティリードを避けるために、データベースはコミット済みの古い値と、トランザクションが設定した新しい値の両方を記憶している
- スナップショット分離(repeatable isolation)
- 読み取りタイミングの問題(スキュー)を避けるために、データベースにマルチべージョン並行性制御が実装され、複数のトランザクションから異なる次点のデータベースの状態が見えるようになっている
- 直列化可能(serializability)
- トランザクションの並行制御が、1つずつ順番に実行することを保証する分離レベルで、排他と共有の2相ロックが実装されている
- read committed