- 現在の多くのアプリケーションはデータ指向
- データベース、キャッシュ、検索インデックス、ストリーム処理、バッチ処理などの機能が必要
- タスクに対してどの手法、ツール、組み合わせが適切かを判別しないといけない
- この章では、実現目標の信頼性、スケーラビリティ、メンテナンス性の概要を見る
- 障害があったとしても正しく動作し続けること
- 色々なフォールトがある(ハードウェア、ソフトウェア、ヒューマンエラー)
- ハードは冗長化したりソフトウェアでの耐障害性を高めるとダウンタイムとかなくなっていいよね
- ローリングデプロイができるとシステムのダウンタイムなくなっていいよね
- 正しいことを行いやすく間違ったことを起こさないシステム設計ができるといいよね
- リカバリを素早くできるようにしよう
- 信頼性を損なった時に何が起こるかのコストの判断はするようにしよう
- システムの成長に対して無理なく対応可能であること
- どう計算資源を追加すれば負荷に対応できるか?を考えておくこと
- 負荷を表現して(リクエスト数とかデータベース読み書き数とか)、負荷を増やした時にパフォーマンスにどう影響が起こるのか調べる
- リクエストタイムのパーセンタイルを見てどこを改善するかみることがある(典型的なレスポンスタイムを改善するのか、外れ値部分を改善するのか)
- 色々負荷対処方法はある
- スケールアップ
- スケールアウト
- が、どういった処理が頻繁に起こり、この処理は稀にしか起こらないという負荷の推定を行わないと的外れなスケーリングになるよ
- 既存動作のメンテナンスと新しいユースケースへの対応が可能であること
- 運用しやすく、システムが理解しやすく、未来に起こる予想外のユースケースに対応しやすくしよう