データ指向アプリケーションデザイン
はじめに
演算アプリケーションとは、CPU のサイクルがボトルネックになるアプリケーションのこと。
データ指向アプリケーションとは、データの量や複雑さ、変化の速度が主な課題であるアプリケーションのこと。
今日の多くのアプリケーションは後者である。
1. データシステムの基礎
多くのアプリケーションでは以下のようなデータシステムが必要となる。 これらの境界線は曖昧である。複数を組み合わせて利用される。
- データベース
- キャッシュ
- 検索インデックス
- ストリーム処理 (他のプロセスへメッセージを送り非同期に処理する)
- バッチ処理
ソフトウェアにおける重要な 3 つの課題は、信頼性、スケーラビリティ、メンテナンス性の 3 つである。
信頼性
信頼性とは、何か問題が生じても正しく動作し続けるかどうかのこと。
問題を起こしうるものを fault と呼ぶ。 障害はサービスを止めてしまうことを指し、fault とは異なるもの。 fault が発生してもシステムが正しく動作し続けることを fault-tolerant または resilient と呼ぶ。
ハードウェアの障害、ソフトウェアのエラー、ヒューマンエラーなどがある。
信頼性はほとんどの場合で非常に重要である。 信頼性を犠牲にしてコストを下げる場合もあるが、そうする場合にはそのことを強く意識しておくこと。
スケーラビリティ
スケーラビリティとは、負荷が増えたときに対応できる能力のこと。
まずは負荷を表現するためのパラメータが何かを特定する必要がある。 これはアプリケーション固有ではあるが、例えばリクエスト数、アクティブユーザ数、キャッシュヒット率などが考えられる。
次にパフォーマンスを計測するためのメトリクスを決める。 スループットやレスポンスタイムがよく使われる。 平均ではなくパーセンタイルで考える。p50 p95 p99 p999 など。特に p95 以上あたりはテイルレイテンシーと呼ぶ。 ヘッドオブラインブロッキング / HOL blocking による遅延はよく発生する。
負荷への対応としてはスケールアップとスケールアウトがある。 複数のマシンに負荷を分散することをシェアードナッシングアーキテクチャとも呼ぶ。 負荷の増大に対して自動でリソースを拡張することをエラスティックと呼ぶ。
メンテナンス性
- 運用性
- 運用チームが扱いやすいようにシステムであること
- 例えばモニタリング、デプロイ、メンテナンス、トラブルシューティングなどがやりやすいこと
- シンプルさ
- 偶発的な複雑さ(実装からのみ生じている複雑さ)をなくせ
- 複雑な詳細を上手に抽象化して覆い隠せ
- 進化性
- データシステムのレベルにおけるアジ リティのことを指す
- アジャイルやその手法である TDD、リファクタリングとは別の話