はじめに
この記事はソフトウェアアーキテクチャの基礎を勉強したシリーズの第4弾となります。
初回の基礎知識編はこちら
今回はマイクロカーネルアーキテクチャです
トポロジー
コアシステムとプラグインの2つのコンポーネントで構成されたモノリシックアーキテクチャ
基本的機能をもったコアシステムと独立した機能をもつプラグインコンポーネントを組み立てることで、拡張性、適応性、分離性を実現している

コアシステム
システムを実行するのに必要最低限の機能を形式的に定義したもの
VScodeが良い例である。VScode自体は単なるエディタであるが、多くのプラグインが用意されおり、それらを用いることで多くの機能を使用することができる
例えば、持っているクレジットカードの種別によって特典を付与する機能があるとする
def get_benefit(card_tyep: string):
if (card_type == 'AAA'):
hoge()
elif (card_type == 'VVV):
huga()
上記の機能はクレジットカード種別全てに対応する必要があり、今後も対応する種別は増えるためコアシステムに持たせるべきではなく、プラグインとして持たせておく方がよい
def get_benefit(card_tyep: string):
card_benefiter = CardBenefit() # これがプラグイン
card_benefiter(card_tyep)
コアシステムの分割
コアシステムをどのように分割するかも決定する必要がある
技術でも分割できるし、ドメインによって分割することもできる

ユーザーインターフェースのデプロイ単位
ユーザーインターフェースを組み込む場合はユーザーインターフェースを単一にするか分割するかも選択肢として感がられる

プラグインコンポーネント
コアシステムを強化・拡張するための特殊な処理や追加機能、カスタムコードなどを含む、独立したコンポーネントである
プラグインコンポーネントは互いに独立し、依存関係がないのが理想的
プラグインコンポーネントには以下の方式がある
- ランタイムベース
- コンパイルベース
プラグインコンポーネントの在り方
プラグインコンポーネントは必ずポイントツーポイントでなくてもよく、RESTやメッセージングを使用してもよい
各プラグインをコンテナを使用したスタンドアローンのサービスと定義してもよい

各プラグインのスケーラビリティは確保や非同期処理が可能とはなるが
オーバーヘッドの増加やプラグインの応答が返ってこない(または、稼働していない)などの問題が発生するためトレードオフではある
データの保存
一般的にはデータベースとのやり取りはコアシステムのみで行い
コアシステムがデータベースが取得したデータをプラグインコンポーネントに渡して処理する流れがよい
理由としては疎結合であり、データベースの変更をコアシステムのみが影響を受けて、各プラグインコンポーネントには影響しないほうがいいからである

しかし、各プラグインコンポーネントで使用するために独自のデータストアを所有することもできる
事例
ソフトウェア開発やリリースに使用されるツールのほとんどがマイクロカーネルアーキテクチャで実現されている
VSCode, Jira, Chrome, FirefoxなどのWebブラウザもそうである
また、複雑なルールが無数にあり、それらを条件的に処理するようなアプリケーションにも向いている
Ex) 税金のフォームで職業や年収、地域によって、減税率を変化させたい場合
アーキテクチャの評価
- ドメインによる分割と技術による分割の両方が可能である唯一のアーキテクチャスタイル
- ユーザーのカスタマイズセイや機能拡張を重視したプロダクトやアプリケーションと相性がいい
- 機能を独立したプラグインコンポーネントに分割できるため、テスト容易性、デプロイ容易性、信頼性は平均値となる(レイヤードアーキテクチャより高い)
- 不要な機能はプラグインコンポーネントごと削除すればいいので、モジュール性もある
| アーキテクチャ特性 | 評価 |
|---|---|
| 分割タイプ | ドメインと技術 |
| 量子数 | 1 |
| デプロイ容易性 | ★★★ |
| 弾力性 | ★ |
| 進化性 | ★★★ |
| 対障害性 | ★ |
| モジュール性 | ★★★ |
| 全体的なコスト | ★★★★★ |
| パフォーマンス | ★★★ |
| 信頼性 | ★★★ |
| スケーラビリティ | ★ |
| シンプルさ | ★★★★ |
| テスト容易性 | ★★★ |
※★が多いほど評価が高い
自分なりの説明
WioTerminalがいい例かも
基本な機能はあるが、センサーを追加することで、CO2濃度が測定できたりなどの追加機能を得ることができる
