データ指向アプリケーションデザイン
はじめに
2010年代の技術の発展によりアプリケーションの特性が変わってきた
CPUのサイクルがボトルネックだった演算指向のアプリケーション
データの量や複雑さ、変化の速度が主な課題となるデータ指向のアプリケーション
データ指向アプリケーションに対応する技術が多く生まれた
NoSQL、メッセージキュー、キャッシュ、検索インデックス、バッチおよびストリーム処理のためのフレームワーク
データシステムのアーキテクチャ、データシステムが組み合わさってデータ指向アプリケーションになっていく様子を主に見ていく
第I部
分散システムでも単一システムでも重要な概念を説明する
https://gyazo.com/fa0f8d037405070217d8efe327e3ce9e
1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
データシステムという包括的概念
データベース、キュー、キャッシュは異なる分類のツールに見える
旧来の分類には当てはまらず、境界が曖昧になっている
Redisはデータストアでありながらメッセージキューとしても使われる
Apache Kafkaはメッセージキューでありながらデータベースのような耐久性を保証する
データ処理やストレージへの要求が多様化し、単一のツールではすべてを処理できない
現代におけるアプリケーション開発はデータシステムの設計
汎用的な小さなコンポーネント群から特定の目的のためのデータシステムを作り出す行為
APIによって内部は隠蔽される
ソフトウェアシステムの重要な課題
信頼性
障害があったとしても正しく動作し続けること
フォールトトレラント、レジリエントである
スケーラビリティ
データ・トラフィック・複雑さの成長に対して無理なく対応可能である
一次元のラベルでなく、ある側面からみた時の問いかけが重要
メンテナンス性
システムに関わる人々の生産性を維持できる
複数マシンによる冗長化が必須になるのは高可用性が欠かせない少数のアプリケーションのみだったが、データの量やアプリケーションの処理量の増大と使用マシンが増え、ハードウェア故障の発生率も増大した
マシンが失われても耐えられるシステムへ
ソフトウェアによる耐障害性の手法
複数台構成でのローリングアップデート
Twitterの例
当初は正規化されたRDBMSでJOINしてタイムラインを生成していたがクエリの負荷に追従できなくなった
投稿されるたびにフォロワーごとのタイムラインのキャッシュに挿入する方式に切り替えた
3100万フォロワーを持つアカウントにおいては大変なことになる
投稿よりも読み込みのほうが2桁以上多く行われるシステムだったため
最終的にはハイブリッドなアプローチにした
キャッシュされたタイムラインと、フォロワーの多いアカウントのツイートをマージする
パフォーマンス
負荷のパラメータを増やしながら、システムのリソース(CPU、メモリ、ネットワークの帯域など)は一定のままに保つと、システムのパフォーマンスにどういった影響が生じるでしょうか?
負荷のパラメータを増やしたときに、パフォーマンスを一定に保つにはリソースをどれほど増やさなければならないでしょうか?
Hadoopのようなバッチ処理のシステムではスループットに注目する
1秒あたりに処理できるレコード数や、あるサイズのデータセットに対して1つのジョブを実行するのにかかる合計時間
オンラインシステムではクライアントがリクエストを送信してからレスポンスを受信するまでの時間、レスポンスタイムが重要になる
リクエストが処理を待っている期間を表すレイテンシとは異なる
平均よりはパーセンタイル値を見る
SLOやSLAに利用される
ヘッドオブラインブロッキング
Amazonの例
内部サービスのレスポンスタイムの要件を99.9パーセンタイルで示している
100ミリ秒遅れると売上が1%下がる事を観測している
負荷対策
スケールアップ
スケールアウト
シェアードナッシング
エラスティック
負荷の増大を検知して自動的にコンピューティングリソースを追加できるシステム
ストートレスなサービスの分散は容易だがステートフルなデータシステムを単一ノードから分散システムに移行するのは複雑になる
データベースがその筆頭で、スケーリングコストや高可用性のために分散せざるを得ない要求出でてまでは単一ノードでスケールアップするのが一般的だった
どんな処理が頻繁で、どんな処理がまれなのかという推定によりアプローチはまるで変わる
メンテナンス
運用性
運用担当者の負荷が低く、価値の大きい活動に集中できる
自動化のセットアップ
単純性
シンプルで表現力に富むコードで書かれている
逆に言えば、状態空間の爆発、モジュール間の密結合、依存関係のもつれ、一貫性のない命名や用語、ワークアラウンドは単純性を損なう
機能を減らさずとも実現できる
偶発的な複雑さを除く
進化性
プラスティシティ
要求が変わらないシステムはほとんどない
変化の適応が容易かどうかは単純性と抽象化に関係する
組織のプロセスという点ではアジャイルが変化に適応するフレームワーク
ただし手法に関する議論は小さなスケールにとどまる事が多く、大規模なデータシステムの方法に焦点をあてるのが本書
データシステムのレベルにおけるアジリティのことを進化性と呼ぶ
2章 データモデルとクエリ言語
https://gyazo.com/33dfe34761ce4538982fafce54790d40