色々なアーキテクチャスタイル簡易まとめ

## レイヤードアーキテクチャ
### 概要
- 最も一般的なアーキテクチャスタイル
- このアーキテクチャ内の各コンポーネントは、水平方向のレイヤーとして編成される
- 各レイヤーは、アプリケーション内で特定の役割を果たす
### 主な特徴
- コストが低くシンプルな構成で理解しやすい
- 小規模でシンプルなアプリケーションやWEBサイトに適する
- 大規模で複雑なアプリケーションには向かず、弾力性、スケーラビリティは低い
- 時間が限られているとき、要件が定まっていないとき等にはレイヤードアーキテクチャは優れた選択肢の一つとなる


## パイプラインアーキテクチャ
![fosa_1101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760506/619f4228-a439-4800-8c74-a518790cffbd.png)
### 概要
- パイプとフィルターから構成される
  - **パイプ**：あるソースからの入力を他のソースに出力する
  - **フィルター**：入力ソースを加工する。1のフィルターで1つのタスクのみ行う 
### 主な特徴
- シンプルな一方通行の処理を進めることに向いている
- コストが低く、シンプルな構成
- 弾力性、スケーラビリティは低い

## マイクロカーネルアーキテクチャ
![fosa_1201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760506/b36e9553-598c-478c-ab88-7a7031cd7e82.png)
### 概要
- コアシステムとプラグインの2つのコンポーネントで構成される
  -**コアシステム**：システムを実行するのに必要な最低限の機能
  -**プラグイン**：コアシステムを強化、拡張するための特殊な処理や追加機能

### 主な特徴
- コストが低く、シンプルな構成
- 弾力性、スケーラビリティは低い
- ドメインによる分割と技術による分割の両方が可能なアーキテクチャ
- プラグインコンポーネントの切り出しにより、通常よりテストが容易
- ユーザーによってカスタマイズされるツール等によく使用されるアーキテクチャ（VSCode, Chromeなど）

## サービスベースアーキテクチャ
![fosa_1301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760506/86af8dba-faec-4289-a16b-7c7a5f489afd.png)
### 概要
- 最も実用的なアーキテクチャスタイルの一つ
- 分散型のレイヤード構造
- このアーキテクチャにおけるサービスとは、粗い粒度のアプリケーションの一部（ドメインサービス）である
- 各ドメインサービス内で、APIファザード層、ビジネス層、永続化層等で構成される、レイヤードアーキテクチャの形をとる
- 多くのトポロジーが存在し、最も柔軟性の高いアーキテクチャスタイルの一つとなっている
### 主な特徴
- ドメインによって分割されたアーキテクチャ
- 耐障害性、可用性、テスト容易性等、運用・保守の観点で高い評価
- コストが高すぎず、構成が複雑すぎず、全体的にバランスの良いアーキテクチャと言える

## イベント駆動アーキテクチャ
### 概要
- 非同期でイベント（リクエスト）を受信して処理する
- 単体でも、他のアーキテクチャスタイルと組み合わせても使用できる
- メディエータートポロジとブローカートポロジの2タイプがある

### ブローカートポロジ
![broker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760506/bad00b1c-e27f-4908-87a4-9c8f3da2e782.png)
- 軽量メッセージブローカーを介して、ブロードキャスト方式でイベント処理コンポーネントに分散させる
- イベントプロセッサーは非同期的に処理を行い、各プロセッサーが独立して動作する。これにより、高いスケーラビリティ、応答性、パフォーマンスを実現する
- 単純なイベント処理フローを持ち、複数イベントの調整を必要としない場合に便利
- エラー処理やワークフロー制御が難しいという問題点がある

### メディエータートポロジ
![mediator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760506/67b0c78f-3f82-4b35-b0ee-355b89465cd6.png)

- ブローカートポロジーの欠点を解消するためのアーキテクチャ
- イベントメディエーターで複数のイベントプロセッサーの調整を必要とするイベントのワークフローを管理・制御する
- パフォーマンスやスケーラビリティは、ブローカートポロジの方が優れている（悪くはない）

### 主な特徴
- パフォーマンス、スケーラビリティ、耐障害性に優れている
- 動的なイベントフローにより、テスト容易性が低く、また複雑になっている

## マイクロサービスアーキテクチャ
![1_Jn_OZgq9dAG854kLEvG_-Q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760506/7a831255-8e44-4526-91f3-3ff262e10a3e.png)
### 概要
- 近年人気を集めるアーキテクチャスタイル
- このアーキテクチャでは、各サービスが単一目的に特化し、小さな独立した構成要素で構成される
- データベースや他の依存コンポーネントを含め、各サービスが完全に独立して動作可能
### 主な特徴
- スケーラビリティ、弾力性、進化性に優れている
- 分散アーキテクチャとしての課題（サービス間通信を多用すると、耐障害性や信頼性に影響が生じる）がある
- ただし、そういった問題の多くは、スケーリングや冗長性によって解決可能
- 使用するネットワークの量から、パフォーマンスについても問題が生じやすいため、工夫が必要となる

## 参考
[ソフトウェアアーキテクチャの基礎](https://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E5%9F%BA%E7%A4%8E-%E2%80%95%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E4%BD%93%E7%B3%BB%E7%9A%84%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81-Mark-Richards/dp/4873119820/ref=sr_1_1?adgrpid=130100459718&dib=eyJ2IjoiMSJ9.CgHOWtRJ2b97qIZKH5QGOLOeciFRZd6sCSLTZQujClFOLBLzGip6s4OX2iMX6_PH8IlR4DM4ouZonhCNpyLD2i_Qn6ES6rpll9QbHwaI_EgF9KpLUkisc3axMh4EmdT1DU-6byl1nsRZAWWD_WzK32A5l1k0wBzuu78H3yd3l4afu0YRQmLBO_HvTs3fFjD3SNeLFWYLvzcJUKJ2WreBOKYMcL6_R9LFJNQWUWsyTutwDCZXqsn7ztVvJOdhwrUkbaiijTim6QPDJqEswid4feWCac2yIzqZAyqis7qQDD3QemhISlJxUgQvJ_N1cYm2SDkW5Szy15tnpgiLQQLAUJMu0_A2EcXbHxMJP3nQoVSMIrji53KII32lveBoifz4Sp0QXckI7iQGR2tFXGsMjh89tp0b-SiZqe-a6v3KqaUaflZPoDJOthmBcx2drxl7.ayfD-yHtOnawwcny0pMRjhNAykRZ60AFKmOgRFxJZqQ&dib_tag=se&hvadid=651258080600&hvdev=c&hvlocphy=9198939&hvnetw=g&hvqmt=e&hvrand=12900945790184495357&hvtargid=kwd-1645961297979&hydadcr=10018_13606920&jp-ad-ap=0&keywords=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E5%9F%BA%E7%A4%8E&mcid=c0857dab4cef344bb43d576845d4d252&qid=1743243383&sr=8-1)