あえて言うまでもなく現在は多くのWebシステムが動いており、新しく作り出すシステムもWebシステムの形態をとることが多いと思われます。
ここで問題となるのはWebシステムとしてあるべき姿、優れたWebシステムとはどのようなものであるのかをシステムオーナーが理解せずに開発・運用してしまい、不具合対応に追われてしまうということです。情報の信頼性、対応費用などのデメリットはできるだけ抑えたいところです。
優れたWebシステムアーキテクチャを設計する際に考慮すべき主な点を以下に列挙してみます。
スケーラビリティ
需要の増加に対応できるようシステムを水平/垂直に拡張できる設計にする
マイクロサービスアーキテクチャなどの分散システム設計を採用する
ロードバランシング、キャッシング、CDNなどの技術を活用する
AWS、Azure、GCP、等々のクラウドサービスを用いるということは1つの案です。
また、需要増加が緩やかなものであればレンタルサーバー、オンプレミス環境での拡張も選択肢となりえます。
水平拡張とは例えばWebサーバーを1台から2台、3台と増やしてロードバランサーにて振り分けるというものです。動的な増強に向いていると言えます。
垂直拡張とは1台のサーバーを性能の高いものに置き換えるというものです。メモリサイズを増やすなど単一処理の性能限界を突破する際に向いています。
マイクロサービスアーキテクチャとはシステムを単一アプリケーションとして作成するのではなく、機能ごとに細かく分けてサーバーに分担させるというようなイメージです。局所的な性能強化をしやすいですが、構成が複雑になるため開発・運用には知見が求められます。
可用性
冗長設計により単一障害点を排除する
フェイルオーバー、自動スケーリングなどの耐障害性技術を導入する
モニタリングとアラート機能を設ける
サーバー設計(インフラ設計)を行う際は何かが1つ動かなくなってもシステム全体が動作するということが必要です。これが単一障害点の排除となりますが、いわゆる本番環境(商用環境)は冗長化しているが開発環境(検証環境)は冗長化していないということが見られます。費用面ではやむを得ないのですが、可用性の担保ができるかどうかはシステム公開前にしっかり確認したいところです。
保守性
ルーズカップリングの原則に従い、各コンポーネントを疎結合な設計にする
コンポーネント間の通信にはRESTfulなAPIを採用するなどインターフェースを標準化する
ドキュメントの整備やコーディング規約の統一でメンテナンス性を高める
開発の初期にしっかり時間をとって決めておきましょう。
また後々のシステム改修で部分的な理解で他と異なる修正を行うと保守性が下がってしまうことがあります。
そもそもローコード、ノーコードでの開発を視野に入れることも保守性維持には重要かもしれません。
セキュリティ
認証、認可、データ暗号化などの基本的なセキュリティ対策を講じる
DDoS対策、IDS/IPSの導入などでシステムの保護を図る
定期的にセキュリティ監査を行い脆弱性を検出する
概ねセキュリティパターンは一般的に対応が知られているため、一般的な対応を検討するということが重要となります。システムも時間が経つと劣化するわけではないですが、セキュリティリスクが増してきます。
人間も年1回は健康診断をしますし、システムも同様にセキュリティ監査を年に1回以上は実施すると良いでしょう。
拡張性
新機能の追加や既存機能の変更がしやすいモジュール構造にする
ヘッドレスアーキテクチャなどを取り入れUIとロジックを分離する
クラウドネイティブアーキテクチャを採用しクラウドの機能を活用できるようにする
可用性のところと重複がありますが、拡張性についてもシステム要件定義、システム設計段階で十分に検討しましょう。
これらの観点を意識しつつ、システムの目的や要件に合わせて最適なアーキテクチャを選定することが重要です。また、継続的な改善とリファクタリングを行いながら、システムの品質を維持向上させていくことも欠かせません。