page icon

疎結合アーキテクチャ

文責:あんちぽ, 石川 陽一

なぜ疎結合アーキテクチャは重要か

システムの役割は単純であればあるほど、高速に改善しやすくなります。複雑な問題を解くときに単純な問題の組み合わせにするというのは重要な設計技術です。疎結合なアーキテクチャとは、このように改善する単位を単純に保つための技術です。

疎結合アーキテクチャとはそもそも何か

疎結合アーキテクチャとは、システムのコンポーネント間の依存関係が少なく、独立性が高いアーキテクチャのことです。各コンポーネントの役割が明確で、インタフェースが決まっていることが特徴です。このようなアーキテクチャでは、機能追加や改善が部分的なシステムの改修だけで完結しやすくなります。
疎結合アーキテクチャの利点は、安全に修正できること、高速に修正できる可能性が高いこと、そして大規模なシステムになっても開発速度が鈍化しないことです。これを実現するためには、ビジネスが求める修正パターンに対して少ないコストで対応できる状況が求められます。
疎結合アーキテクチャを実現するためのキーワードには、ドメインイベントパターンとイベントストーミング、CQS/CQRS、結果整合性、冪等性などがあります。

疎結合アーキテクチャを代表するプラクティスの解説

疎結合アーキテクチャを実現するためのプラクティスには、以下のような代表的なものがあります。
  1. ドメインイベントの発火とPublish/Subscribeモデル: ドメインイベントを発火させることで、関連するサービス間の連携を容易に行えるようになります。これにより、システム間の疎結合性が向上し、各サービスが独立して開発・運用できるようになります。また、イベントの履歴データを保存管理することで、イベントリプレイを利用して再突合や監査の自動化が可能になります。
  1. 結果整合性を考慮したサービスレベルの合意: サービス間で結果整合性を考慮した合意を行うことで、各サービスが独立して動作し、互いに影響を受けないように設計することができます。この合意は、要件のガイドラインに組み込まれるべきであり、それによって各サービスが予期せぬ状況に対応できるようになります。
  1. 冪等性を考慮した設計ガイドライン: バッチ処理、ジョブ、プロシージャに対して冪等性を考慮した設計ガイドラインが存在することで、再送やリトライによっても整合性が担保できるシステムを実現できます。これにより、各コンポーネントが独立して動作し、互いに影響を受けない状態が維持され、疎結合アーキテクチャの利点を最大限に活かすことができます。
これらのプラクティスを適用することで、疎結合アーキテクチャを実現し、システムの拡張性や保守性を向上させることができます。

疎結合アーキテクチャはどのようにして測定するか

 
システムの適応度を計測するための関数や、意思決定の記録といった要素も重要です。疎結合アーキテクチャの測定は、アーキテクチャ適応度関数を用いて行われます。アーキテクチャ適応度関数は、目指すべきアーキテクチャに対してそぐわない点を洗い出すための指標であり、これによってシステムの疎結合度を測定し、改善を進めることができます。
アーキテクチャ適応度関数は、以下のような要素を含むことが一般的です。
  1. システム間の依存関係の数: システムの疎結合度を評価するために、システム間の依存関係の数を計測します。依存関係が少ないほど、システムの疎結合度が高いと言えます。
  1. インターフェースの明確さ: 各コンポーネント間のインターフェースが明確であることが、疎結合アーキテクチャの要件です。インターフェースの明確さを測定することで、コンポーネント間の疎結合度を評価できます。
  1. システムの変更範囲: システムが変更される際、影響を受ける範囲を計測します。疎結合アーキテクチャでは、部分的なシステムの改修だけで完結することが期待されますので、変更範囲が狭いほど疎結合度が高いと言えます。
  1. 修正の容易性: システムが修正される際にかかるコストや労力を測定します。疎結合アーキテクチャでは、安全かつ迅速に修正できることが期待されますので、修正の容易性が高いほど疎結合度が高いと言えます。
これらの指標を用いて、アーキテクチャ適応度関数を計算し、システムの疎結合度を測定します。測定結果をもとに、アーキテクチャの改善を進めることで、疎結合アーキテクチャを実現し、システムの拡張性や保守性を向上させることができます。

疎結合アーキテクチャで陥りがちなアンチパターンとはどういう状況か

 
疎結合アーキテクチャを阻害するアンチパターンも存在します。例えば、複数のシステムが同一のデータベースを参照すること、循環参照的な依存構造や依存構造の可視化が難しいこと、外部との依存関係がテストできない関係性が多数あることなどが挙げられます。このような状況は、疎結合アーキテクチャの効果を損ない、システムの開発や保守性に悪影響を与えることがあります。
  1. 複数のシステムが同一のデータベースにアクセス: 1つのデータベースに対して複数のシステムから直接的な参照や書き込みが行われていると、依存性が簡単には追跡できず、結果的にシステム間の疎結合度が低下します。
  1. 分散トレーシングの仕組みが欠如: 疎結合なシステムでは、各コンポーネントが独立して動作するため、システム全体の動作を追跡しにくいという問題があります。ここで重要なのが「分散トレーシング」の役割です。分散トレーシングとは、複数の独立したコンポーネント間で発生するデータの流れやプロセスの実行状態を追跡し、可視化することを指します。これにより、システム全体のパフォーマンスの監視や、問題発生時の原因特定が容易になります。 しかし、疎結合アーキテクチャにおいて分散トレーシングの仕組みが欠けている場合、問題が発生した際にその原因を特定するのに時間がかかります。このため、システムの保守性や信頼性が低下する可能性があります。分散トレーシングは、疎結合アーキテクチャにおけるシステムの健全性を維持するために不可欠な要素と言えます。
  1. 自動テストやスキーマ定義が不足した外部システムとの依存関係: 自動テストやスキーマ定義が存在しない外部システムとの依存関係が多数存在する場合、機能開発の影響範囲を特定できず、システムの疎結合度が低下します。
これらのアンチパターンを避けることで、疎結合アーキテクチャを実現し、システムの拡張性や保守性を向上させることができます。具体的な対策としては、データベースへのアクセスを制限し、APIやイベント駆動型のアーキテクチャを採用することや、分散トレーシングの仕組みを導入し、外部システムとの連携を自動テストやスキーマ定義を用いて明確にすることが挙げられます。

疎結合アーキテクチャのクライテリア

あんちぽさんメモ2023/4/4 23:052023/4/4 23:05