メインコンテンツまでスキップ

データ指向アプリケーションデザイン

はじめに

演算アプリケーションとは、CPU のサイクルがボトルネックになるアプリケーションのこと。

データ指向アプリケーションとは、データの量や複雑さ、変化の速度が主な課題であるアプリケーションのこと。

今日の多くのアプリケーションは後者である。

1. データシステムの基礎

多くのアプリケーションでは以下のようなデータシステムが必要となる。 これらの境界線は曖昧である。複数を組み合わせて利用される。

  • データベース
  • キャッシュ
  • 検索インデックス
  • ストリーム処理 (他のプロセスへメッセージを送り非同期に処理する)
  • バッチ処理

ソフトウェアにおける重要な 3 つの課題は、信頼性、スケーラビリティ、メンテナンス性の 3 つである。

信頼性

信頼性とは、何か問題が生じても正しく動作し続けるかどうかのこと。

問題を起こしうるものを fault と呼ぶ。 障害はサービスを止めてしまうことを指し、fault とは異なるもの。 fault が発生してもシステムが正しく動作し続けることを fault-tolerant または resilient と呼ぶ。

ハードウェアの障害、ソフトウェアのエラー、ヒューマンエラーなどがある。

信頼性はほとんどの場合で非常に重要である。 信頼性を犠牲にしてコストを下げる場合もあるが、そうする場合にはそのことを強く意識しておくこと。

スケーラビリティ

スケーラビリティとは、負荷が増えたときに対応できる能力のこと。

まずは負荷を表現するためのパラメータが何かを特定する必要がある。 これはアプリケーション固有ではあるが、例えばリクエスト数、アクティブユーザ数、キャッシュヒット率などが考えられる。

次にパフォーマンスを計測するためのメトリクスを決める。 スループットやレスポンスタイムがよく使われる。 平均ではなくパーセンタイルで考える。p50 p95 p99 p999 など。特に p95 以上あたりはテイルレイテンシーと呼ぶ。 ヘッドオブラインブロッキング / HOL blocking による遅延はよく発生する。

負荷への対応としてはスケールアップとスケールアウトがある。 複数のマシンに負荷を分散することをシェアードナッシングアーキテクチャとも呼ぶ。 負荷の増大に対して自動でリソースを拡張することをエラスティックと呼ぶ。

メンテナンス性

  • 運用性
    • 運用チームが扱いやすいようにシステムであること
    • 例えばモニタリング、デプロイ、メンテナンス、トラブルシューティングなどがやりやすいこと
  • シンプルさ
    • 偶発的な複雑さ(実装からのみ生じている複雑さ)をなくせ
    • 複雑な詳細を上手に抽象化して覆い隠せ
  • 進化性
    • データシステムのレベルにおけるアジリティのことを指す
    • アジャイルやその手法である TDD、リファクタリングとは別の話