Yuki Watanabe's Blog

Yuki Watanabe's Blog

エンジニアリングと子育てについて

『データ指向アプリケーションデザイン』を読みました

『データ指向アプリケーションデザイン ――信頼性、拡張性、保守性の高い分散システム設計の原理』を読みました。 データの扱いに焦点を当て、様々な技術とその特性が詳解されていて、とても良い書籍でした。

感想

現在の知識・経験でも読み通せる1~7章を中心に読み、8章意向は流し読みをしました。読んで良かった点と感じた点はこちらです。

  • データにまつわる多くの具体的な技術名を列挙しているため、幅広い技術について知れる
  • 多くの研究結果に裏付けされていて、信憑性が高い
  • 書籍の構成が良く、章ごとの「まとめ」だけ読んでも要点をしっかり掴むことができる

一方で、使ったことのない技術(ストリーム処理)などは理解が難しく感じました。また、その他の技術も、深く利用したことがないものが多く、完全に理解したとは言い難い状況です。

主に技術選定を担うテックリード、アーキテクトのような方が読むのに適した本のように感じましたので、ある程度間隔を開け、再度本書を読み直す予定です。

学習メモ

しっかり読んだ、1章~7章までメモとなります。

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

  • ソフトウェアを3つ課題から考察している
    • 信頼性: フォールトがあってもシステムが正しく動作できる性質のこと
    • スケーラビリティ: 負荷が増大しても優れたパフォーマンスを保つための戦略のこと
    • 運用性: ソフトウェアを開発、運用するエンジニアの作業効率に関する性質のこと

有益なアプリケーションは機能要件と非機能要件を満たすが、上記3課題は非機能要件に分類される

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

  • データの永続化方法をデータモデルと呼ぶ
  • データモデルには3つのモデルがある
    • ドキュメントデータベース: データが自己完結しドキュメント間の関係が存在しないようなケースに向く
    • グラフデータベース: あらゆるデータ同士が関係するケースに向く
    • リレーショナルデータベース: 1つのデータが自己完結する場合もあれば多のデータと関係するようなケースに向く

3章  ストレージと抽出

  • データベースのストレージエンジンは2ついずれかの処理に最適化されている
    • オンライントランザクション処理(OLTP): ユーザーからのオンラインリクエストに受け付けるためのシステムであり、少数のレコードを扱う。そのため、行指向ストレージが向く。
    • データ分析システム: ビジネスサイドが扱うシステムで、テーブルのフルスキャンが求められる。扱うカラムは少ないため、列指向ストレージが向く。

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

  • メモリ上のデータ構造をネットワーク上やディスク上のバイト列に変換することをエンコーディング(シリアライゼーション、マーシャリング)と呼ぶ
  • エンコーディングフォーマットに関する特性は2つある
    • JSONXMLなどのテキストフォーマットは、どのように利用されるかに依存している
    • Protocol Buffersなどのスキーマを持つバイナリフォーマットは効率的なエンコーディングが可能だが、デーコードしなければ人に読むことができない

5章  レプリケーション

  • レプリケーションとは、ネットワークで接続された複数のマシンに同じデータのコピーを保持しておくこと
  • リーダーは、書き込みを担うノードであり、更新をフォロワーノードに通知する

6章  パーティショニング

  • パーティショニングとは、大規模なデータセットを小さな部分集合に分割すること
  • パーティショニングには、2つのアプローチがある
    • キーの範囲によるパーティショニングは、キーはソートされているため、範囲に対するクエリが効率的に処理できる一方、ホットスポットが発生するリスクがる
    • ハッシュ値によるパーティショニングは、負荷分散を均等にできる一方、範囲に対するクエリは非効率となる

7章  トランザクション

  • レースコンディション(レース条件)とは、並列動作するプロセスやスレッドが同一のリソースへ同時にアクセスしたとき、想定外外の処理結果が生じる問題のこと
  • 並行性制御のための分離レベルと実装として3点がある
    • read committed
      • ダーティライトを避けるために、行レベルのロックが実装されている
      • ダーティリードを避けるために、データベースはコミット済みの古い値と、トランザクションが設定した新しい値の両方を記憶している
    • スナップショット分離(repeatable isolation)
      • 読み取りタイミングの問題(スキュー)を避けるために、データベースにマルチべージョン並行性制御が実装され、複数のトランザクションから異なる次点のデータベースの状態が見えるようになっている
    • 直列化可能(serializability)
      • トランザクションの並行制御が、1つずつ順番に実行することを保証する分離レベルで、排他と共有の2相ロックが実装されている