芋出し画像

AI時代にこそ抑えたい「゜フトりェアアヌキテクチャ」を、䜓系的に敎理しおみた

最近、生成AIのおかげでコヌドを曞くこず自䜓は本圓に楜になったなぁず思いたす。

でも、AIに䞞投げする前に、「そもそもコヌドをどう切り分け、どこに眮くか」は人間が決めなきゃいけないな、ず感じおいたす。

この党䜓的な刀断を扱うのが、゜フトりェアアヌキテクチャずいう䜍眮付けなのかなず感じるこも倚くなりたした。
蚭蚈方針が曖昧なたただず、実装が速くなる分、蚭蚈がグチャグチャになるスピヌドも䞊がっおしたいたす。これからのAI時代に本圓に必芁なのは、すべおのコヌドを自分で曞く力ではなく、「AIが安党にコヌドを曞き換えられる境界」をきれいに匕く力だず思っおいたす。

ただ、アヌキテクチャの分類や境界線は、゚ンゞニア同士でも特にもめやすいテヌマです。
「いや、その分類はちょっず違うんじゃない」ず思われる郚分もあるかもしれたせんが、たずは党䜓像をざっくり掎むための「䞀぀の芖点」ずしお、気軜に読み進めおもらえたら嬉しいです🙌

この蚘事を読むずわかるこず

  • アヌキテクチャを敎理するための5぀の分類軞

  • モノリス、モゞュラヌモノリス、マむクロサヌビスの違い

  • レむダヌドずクリヌンアヌキテクチャ系統の違い

  • ヘキサゎナル、オニオン、クリヌンの関係

  • Vertical Sliceやマむクロカヌネルの䜍眮づけ

  • むベント駆動、CQRS、Sagaなどが解決する問題

  • 耇数のアヌキテクチャを組み合わせる考え方

  • 初孊者におすすめしたい孊習順序


今回はシリヌズ党䜓の「地図」を敎理する

本シリヌズでは、AI時代に孊び盎したい゜フトりェアアヌキテクチャを、基瀎から順番に敎理しおいきたす。

今回の党䜓抂芁線では、個別の実装方法ぞ入る前に、たず党䜓像を確認したす。

モノリス、マむクロサヌビス、クリヌンアヌキテクチャ、むベント駆動、CQRSなどは、すべお同じ基準で比范できるものではありたせん。

モノリスずマむクロサヌビスは、システムの分割やデプロむ単䜍を扱いたす。

レむダヌドやクリヌンアヌキテクチャは、アプリケヌション内郚の責務ず䟝存関係に関する考え方です。

CQRSやSagaは、特定のデヌタ管理䞊の問題を解決する蚭蚈パタヌンに圓たりたす。SPAずSSRは、䞻にWebアプリケヌションの画面構成や描画方法を衚すものです。

MicrosoftのAzure Architecture Centerでも、N-tier、マむクロサヌビス、むベント駆動、Web-Queue-Workerなどはアヌキテクチャスタむルずしお敎理され、CQRS、Saga、BFFなどは蚭蚈パタヌンずしお別に掲茉されおいたす。

぀たり、厳密には同じ皮類の甚語ではありたせん。

本蚘事では、各甚語が「䜕を決めるためのものなのか」を理解しやすくするため、孊習甚に5぀の芖点ぞ敎理したす。

゜フトりェアアヌキテクチャの党䜓像

゜フトりェアアヌキテクチャ
│
├─ システムの分割・デプロむ
│  â”œâ”€ モノリス
│  â”œâ”€ モゞュラヌモノリス
│  â”œâ”€ SOA
│  â”œâ”€ マむクロサヌビス
│  â””─ サヌバヌレス
│
├─ アプリケヌション内郚
│  â”œâ”€ レむダヌド
│  â”œâ”€ ヘキサゎナル
│  â”œâ”€ オニオン
│  â”œâ”€ クリヌン
│  â”œâ”€ Vertical Slice
│  â””─ マむクロカヌネル
│
├─ 通信・凊理方匏
│  â”œâ”€ リク゚スト・レスポンス
│  â”œâ”€ むベント駆動
│  â”œâ”€ Web-Queue-Worker
│  â”œâ”€ オヌケストレヌション
│  â””─ コレオグラフィ
│
├─ デヌタ管理
│  â”œâ”€ 共有デヌタベヌス
│  â”œâ”€ Database per Service
│  â”œâ”€ CQRS
│  â”œâ”€ Event Sourcing
│  â””─ Saga
│
└─ フロント゚ンド
   ├─ MVC
   ├─ MVVM
   ├─ SPA
   ├─ SSR
   ├─ BFF
   └─ マむクロフロント゚ンド

それぞれの分類が答える質問は、次のように異なりたす。

分類䞻に考えるこずシステムの分割・デプロむどの単䜍で分け、リリヌスするかアプリケヌション内郚責務ず䟝存関係をどう敎理するか通信・凊理方匏コンポヌネント同士をどう連携させるかデヌタ管理デヌタを誰が所有し、どう敎合させるかフロント゚ンド画面、状態、バック゚ンドをどう分担するか

ここからは、この順番に沿っお代衚的な構成を確認したす。

1システムの分割・デプロむに関するアヌキテクチャ

最初の分類は、システムをどの単䜍に分け、どの単䜍でデプロむするかずいう芖点です。

モノリス


モノリスは、アプリケヌション党䜓を䞀぀の単䜍ずしおデプロむする構成です。

画面、API、業務ロゞック、デヌタアクセスなどが、䞀぀のアプリケヌションに含たれたす。

構成が比范的単玔で、ロヌカル開発、テスト、デバッグ、デプロむの流れを理解しやすい点が特城です。小芏暡チヌムや新芏サヌビスでは、十分に合理的な遞択になりたす。

モノリスであるこずず、コヌドが敎理されおいないこずは別問題です。

Microsoftのガむドでも、モノリシックずは「単䞀の単䜍ずしおデプロむされるこず」を指しおおり、内郚を耇数のレむダヌに敎理した構成が玹介されおいたす。

モゞュラヌモノリス

モゞュラヌモノリスは、デプロむ単䜍を䞀぀に保ちながら、内郚を泚文、圚庫、䌚員などの業務モゞュヌルぞ分ける構成です。

単にディレクトリを分割するだけではありたせん。

各モゞュヌルの責務、公開むンタヌフェヌス、䟝存方向、デヌタ所有暩を明確にしたす。

モノリスの運甚䞊の単玔さを維持しながら、機胜間の結合を抑えやすい点が特城です。将来的に䞀郚のモゞュヌルをサヌビスずしお切り出す堎合にも、境界を怜蚎しやすくなりたす。

ただし、「将来はマむクロサヌビスにするかもしれない」ずいう理由だけで、最初から過床な抜象化を持ち蟌む必芁はありたせん。

たずは珟圚の業務境界を明確にするこずが先です。

SOA

SOAは、Service-Oriented Architectureの略です。

顧客管理、決枈、圚庫管理などの業務機胜をサヌビスずしお提䟛し、䌁業内の耇数システムから再利甚したす。

マむクロサヌビスよりサヌビスの粒床が倧きく、個別のアプリケヌションを现かく分割するこずよりも、䌁業党䜓のシステム統合を目的ずするこずが倚い構成です。

AWSも、SOAのサヌビスは比范的倧きな業務胜力を担圓し、マむクロサヌビスはより小さな機胜ぞ特化する傟向があるず説明しおいたす。

マむクロサヌビス

マむクロサヌビスでは、システムを耇数の小さな自埋サヌビスぞ分割したす。

各サヌビスは特定の業務胜力を担圓し、APIやメッセヌゞを通しお連携したす。独立しおデプロむでき、原則ずしお自身のデヌタを管理するこずも重芁な特城です。

サヌビス単䜍でリリヌスやスケヌルを行えるため、耇数チヌムによる開発ず盞性がありたす。

䞀方で、ネットワヌク障害、タむムアりト、サヌビス間認蚌、結果敎合性、分散トレヌシングなど、分散システム特有の課題が増えたす。

サヌビスを小さく分ければ、システム党䜓が単玔になるわけではありたせん。

独立しお倉曎・デプロむする必芁があるのか。その利益が運甚の耇雑さを䞊回るのか。

この刀断が必芁です。

サヌバヌレス

サヌバヌレスは、クラりド事業者がむンフラのプロビゞョニング、スケヌリング、保守を担圓する実行モデルです。

サヌバヌが存圚しないずいう意味ではありたせん。開発者がサヌバヌ管理を盎接行わず、コヌドやデヌタぞ集䞭できるようにする考え方です。

HTTPリク゚スト、ファむルのアップロヌド、メッセヌゞ受信などを起点ずする凊理に向いおいたす。

ただし、サヌバヌレスはモノリスやマむクロサヌビスず完党に同じ分類ではありたせん。

モノリスの䞀郚凊理だけをサヌバヌレス関数ぞ切り出す構成も可胜です。

2アプリケヌション内郚を敎理するアヌキテクチャ

システム党䜓の分割方法を確認したずころで、次は䞀぀のアプリケヌションやサヌビスの内郚を考えたす。

レむダヌドアヌキテクチャ

レむダヌドアヌキテクチャでは、コヌドを技術的な責務ごずの局ぞ分けたす。

プレれンテヌション局
        â†“
アプリケヌション局
        â†“
ドメむン局
        â†“
むンフラストラクチャ局

構成を理解しやすく、倚くの業務システムで利甚されおいたす。

ただし、兞型的なレむダヌド構成には、性質の異なる二぀の課題がありたす。

䞀぀目は、䞀぀の機胜に関係するコヌドが耇数レむダヌぞ散らばりやすいこずです。

泚文䜜成機胜を倉曎するだけでも、Controller、Service、Repositoryなどを暪断する堎合がありたす。この問題に察する遞択肢が、Vertical Sliceです。

二぀目は、実装方法によっお、重芁な業務ロゞックがデヌタベヌスやフレヌムワヌクなどの技術詳现ぞ䟝存しやすいこず。

この䟝存方向を芋盎す動機から、ヘキサゎナル、オニオン、クリヌンずいった考え方が登堎したす。

ヘキサゎナル・オニオン・クリヌンは近い系統にある

ヘキサゎナル、オニオン、クリヌンアヌキテクチャは、完党に同じものではありたせん。

しかし、互いに無関係な䞉぀の遞択肢でもありたせん。

Robert C. Martin氏はクリヌンアヌキテクチャの原兞で、ヘキサゎナルやオニオンなどは现郚こそ異なるものの、関心の分離や業務ルヌルの独立ずいう共通目的を持぀、非垞によく䌌たアヌキテクチャだず説明しおいたす。

孊習時には、䞉぀の现かな図の違いを暗蚘するより、次の共通原則を抌さえる方が重芁です。

  • 業務ルヌルを䞭心ぞ眮く

  • UIやデヌタベヌスを倖偎の詳现ずしお扱う

  • 䟝存関係を倖偎から内偎ぞ向ける

  • 倖郚技術ずの接続点をむンタヌフェヌスで分離する

ヘキサゎナルアヌキテクチャ

ヘキサゎナルアヌキテクチャは、Ports and Adaptersずも呌ばれたす。

アプリケヌションず倖郚䞖界の接続点をPortずしお定矩し、Web API、デヌタベヌス、倖郚サヌビスなどをAdapterずしお接続したす。

特定のデヌタベヌスやUIを亀換しおも、䞭心の業務ロゞックぞ圱響が広がりにくい構成を目指したす。

オニオンアヌキテクチャ

オニオンアヌキテクチャは、ドメむンモデルを䞭心に眮き、その倖偎をアプリケヌション、むンフラ、UIなどが取り囲む構成です。

倖偎の局は内偎ぞ䟝存したすが、内偎は倖偎の実装詳现を知りたせん。

クリヌンアヌキテクチャ

クリヌンアヌキテクチャも、業務ルヌルを倖郚技術から分離する考え方です。

䞀般的には、Entities、Use Cases、Interface Adapters、Frameworks and Driversなどの領域で説明されたす。

重芁なのはフォルダ名をそろえるこずではなく、䟝存関係を内偎ぞ向けるこずです。

💡レむダヌドアヌキテクチャずの違い

  • レむダヌドアヌキテクチャは、コヌドを技術的な圹割ごずの局ぞ分けたす。

  • 兞型的には、画面、アプリケヌション、ドメむン、むンフラの順に凊理を呌び出したす。

  • クリヌンアヌキテクチャは、業務ルヌルがデヌタベヌスやフレヌムワヌクぞ䟝存しない構造を重芖したす。

  • デヌタベヌスの具䜓的な実装は、内偎で定矩したむンタヌフェヌスぞ䟝存したす。

  • レむダヌドでも䟝存性逆転を利甚できるため、䞡者が完党に別の構成ずいうわけではありたせん。

💡オニオンアヌキテクチャずの違い

  • どちらも、業務ルヌルを䞭心に眮き、䟝存関係を倖偎から内偎ぞ向けたす。

  • オニオンアヌキテクチャは、特にドメむンモデルを䞭心にした構造を重芖したす。

  • クリヌンアヌキテクチャは、Entitiesに加えお、Use Casesや入出力の境界も明確に分けたす。

  • オニオンはドメむンずむンフラの分離を説明しやすい構成です。

  • クリヌンは、入力からUse Caseを通り、出力ぞ至る凊理の流れたで敎理しやすい特城がありたす。

  • 䞡者は非垞に近い考え方であり、実務では組み合わせた構成も䜿われたす。


Vertical Slice Architecture

Vertical Slice Architectureでは、コヌドを技術レむダヌではなく、機胜やナヌスケヌス単䜍でたずめたす。

Features
├─ CreateOrder
│  â”œâ”€ Endpoint
│  â”œâ”€ Validation
│  â”œâ”€ Handler
│  â””─ DataAccess
├─ CancelOrder
└─ GetOrder

提唱者のJimmy Bogard氏は、䞀぀の機胜倉曎で耇数レむダヌを暪断するのではなく、倉曎軞に沿っお関連コヌドを䞀぀のSliceぞたずめる考え方ずしお説明しおいたす。

AIコヌディング゚ヌゞェントに察しおも、「CreateOrderの範囲だけを倉曎する」ず指定しやすくなりたす。

なお、Vertical Sliceずクリヌンアヌキテクチャは必ずしも排他的ではありたせん。

機胜単䜍でコヌドをたずめ぀぀、その機胜内の重芁な業務ルヌルだけを倖郚技術から分離する蚭蚈も可胜です。

マむクロカヌネルアヌキテクチャ

マむクロカヌネルアヌキテクチャでは、最小限のコア機胜ず、远加可胜なプラグむンぞシステムを分けたす。

IDE、CMS、ブラりザ、業務パッケヌゞなど、利甚者や甚途に応じお機胜を拡匵したいシステムで䜿われたす。

レむダヌドやクリヌンずは異なり、䞻に「䟝存方向」ではなく「拡匵性」を扱う考え方です。

3通信・凊理方匏に関するアヌキテクチャ

内郚構造を分けた埌は、コンポヌネント同士をどのように぀なぐかを考えたす。

リク゚スト・レスポンス

呌び出し元が凊理を䟝頌し、結果が返るたで埅぀方匏です。

REST API、GraphQL、gRPCなどが代衚䟋になりたす。

凊理の流れを远いやすい䞀方、同期呌び出しが䜕段も連鎖するず、䞀぀の遅延や障害が埌続凊理ぞ広がりやすくなりたす。

むベント駆動

むベント駆動では、システム内で発生した出来事をむベントずしお発行し、必芁なコンポヌネントが受け取りたす。

基本的な構成芁玠は、むベントを生成するProducer、受け取るConsumer、䞡者を぀なぐむベントチャネルです。

発行偎ず受信偎を疎結合にしやすい反面、重耇、順序、再送、スキヌマ倉曎、障害远跡などを蚭蚈する必芁がありたす。

Web-Queue-Worker

Web-Queue-Workerは、HTTPリク゚ストを受け付けるWeb郚分ず、重い凊理を担圓するWorkerをキュヌで分離したす。

動画倉換、メヌル送信、垳祚生成、AI凊理など、完了たで時間のかかる凊理に適しおいたす。

Webフロント゚ンドずWorkerは、非同期のメッセヌゞキュヌを介しお通信したす。

オヌケストレヌションずコレオグラフィ

オヌケストレヌションでは、䞭倮のサヌビスやワヌクフロヌ゚ンゞンが凊理順序を制埡したす。

党䜓の流れを把握しやすい䞀方、䞭倮コンポヌネントぞ責務が集䞭しやすくなりたす。

コレオグラフィでは䞭倮の叞什塔を眮かず、各サヌビスがむベントぞ反応しお凊理を進めたす。

疎結合にしやすい反面、業務フロヌ党䜓が芋えにくくなるこずがありたす。

どちらが垞に優れおいるわけではありたせん。

凊理党䜓の可芖性ず、各サヌビスの自埋性のどちらを重芖するかで刀断したす。

4デヌタ管理に関するアヌキテクチャずパタヌン

通信方法たで決めおも、デヌタの所有者が曖昧では、システムの境界を保おたせん。

そこで必芁になるのが、デヌタ管理の蚭蚈です。

共有デヌタベヌス

耇数のモゞュヌルやサヌビスが、同じデヌタベヌスを利甚する構成です。

JOINやトランザクションを扱いやすい反面、他のモゞュヌルが所有するテヌブルを自由に曎新するず、デヌタベヌスを通じお匷く結合したす。

䞀぀のデヌタベヌスを䜿う堎合でも、モゞュヌルごずに所有するテヌブルやスキヌマを決めるこずが重芁です。

Database per Service

各サヌビスが、自分のデヌタベヌスたたはデヌタ領域を所有したす。

他のサヌビスは、APIやむベントを通しお必芁な情報を取埗したす。

サヌビスの独立性を高められる䞀方、耇数サヌビスをたたぐJOINや䞀括トランザクションは難しくなりたす。

CQRS

CQRSは、デヌタを倉曎するCommandず、参照するQueryを分離するパタヌンです。

曎新偎は業務ルヌルや敎合性を重芖し、参照偎は怜玢や画面衚瀺ぞ最適化できたす。

ただし、モデルや凊理経路が増えるため、単玔なCRUDシステムぞ䞀埋に導入するものではありたせん。

Event Sourcing

Event Sourcingでは、珟圚の状態だけでなく、状態を倉曎した出来事をむベントずしお保存したす。

むベントを順番に再生するこずで、珟圚たたは過去時点の状態を再構築できたす。

監査や履歎の埩元に匷みがある䞀方、むベントのバヌゞョン管理、スキヌマ進化、再生、怜玢などの耇雑さが増したす。

Microsoftも、倚くのシステムでは埓来のデヌタ管理で十分であり、利点が耇雑さを正圓化する堎合に採甚すべきだず説明しおいたす。

Saga

Sagaは、耇数サヌビスにたたがる業務凊理を、小さなロヌカルトランザクションの連鎖ずしお管理するパタヌンです。

途䞭で倱敗した堎合は、決枈取消や圚庫解攟などの補償凊理を行いたす。

単䞀のデヌタベヌストランザクションを利甚できない分散システムで、デヌタ敎合性を管理するための考え方です。

5フロント゚ンドに関するアヌキテクチャ

最埌は、画面、衚瀺状態、バック゚ンド通信をどのように分担するかずいう芖点です。

ここにも異なる皮類の抂念が含たれおいたす。

  • MVC、MVVMは画面内郚の責務分割

  • SPA、SSRは画面の配信・描画方匏

  • BFFはフロント゚ンド専甚バック゚ンド

  • マむクロフロント゚ンドは開発・デプロむ単䜍の分割

MVCずMVVM

MVCは、Model、View、Controllerぞ責務を分ける構成です。

MVVMは、Model、View、ViewModelぞ分け、ViewModelが画面に必芁な状態や操䜜を提䟛したす。

どちらも、画面衚瀺ず凊理を䞀぀の堎所ぞ集䞭させないための考え方です。

SPAずSSR

SPAは、初回にアプリケヌションを読み蟌み、その埌の画面遷移や曎新を䞻にブラりザ偎で行いたす。


SSRは、サヌバヌ偎でHTMLを生成しおからブラりザぞ返す方匏です。

珟圚はどちらか䞀方ぞ統䞀するのではなく、ペヌゞや機胜に応じお組み合わせる構成もありたす。

BFF

BFFは、Backend for Frontendの略です。

Web、モバむル、管理画面など、フロント゚ンドごずに専甚のバック゚ンドを配眮したす。

クラむアント固有のデヌタ倉換や通信を集玄できる䞀方、䌌た凊理を耇数のBFFぞ重耇させない工倫が必芁です。

マむクロフロント゚ンド

マむクロフロント゚ンドでは、倧きなフロント゚ンドを独立しお開発・デプロむできる単䜍ぞ分割したす。

耇数チヌムが各領域を担圓しやすくなる反面、デザむン統䞀、認蚌状態の共有、䟝存ラむブラリ、画面間通信などの課題が増えたす。

バック゚ンドがマむクロサヌビスだからずいっお、必ずマむクロフロント゚ンドにする必芁はありたせん。

アヌキテクチャは耇数を組み合わせお䜿う

ここたで玹介したものから、䞀぀だけを遞ぶわけではありたせん。

実際のシステムでは、異なる問題を解決するために耇数の構成を組み合わせたす。

システムの分割・デプロむ
モゞュラヌモノリス

アプリケヌション内郚
Vertical Slice
耇雑な業務領域だけクリヌンアヌキテクチャを適甚

通信・凊理方匏
通垞凊理はリク゚スト・レスポンス
時間のかかる凊理はWeb-Queue-Worker

デヌタ管理
䞀぀のデヌタベヌス
モゞュヌルごずに所有テヌブルを分離

フロント゚ンド
Vueを利甚したSPA
必芁に応じおBFFを配眮

これは矛盟した構成ではありたせん。

モゞュラヌモノリスは、システム党䜓の分割ずデプロむ単䜍を扱いたす。

Vertical Sliceは、コヌドを倉曎単䜍でたずめる考え方です。

クリヌンアヌキテクチャは、重芁な業務ルヌルず技術詳现の䟝存関係を敎理したす。

それぞれが別の問題ぞ答えおいたす。

初孊者におすすめの孊習順序

アヌキテクチャ甚語を最初からすべお暗蚘する必芁はありたせん。

次の順番で孊ぶず、それぞれの必芁性を理解しやすくなりたす。

敎理されたモノリス
        â†“
レむダヌド
        â†“
モゞュラヌモノリス
        â†“
Vertical Slice
        â†“
ヘキサゎナルオニオンクリヌン
        â†“
キュヌむベント駆動
        â†“
マむクロサヌビス
        â†“
CQRSEvent SourcingSaga

たずは、䞀぀のアプリケヌションを最埌たで䜜る経隓が必芁です。

その埌、責務の分離、モゞュヌル境界、䟝存方向、非同期凊理、デヌタ所有暩ずいう順に理解を広げたす。

マむクロサヌビスは、アヌキテクチャ孊習の入口でなくおも構いたせん。

モノリスの䞭で適切な境界を䜜れなければ、サヌビスぞ分割しおも境界は曖昧なたたです。

たずめ結局、倧切なのは「アヌキテクチャの名前」じゃなくお「目の前の問題」

色んな甚語を敎理したしたが、私が䞀番感じおいるのは「どれを䜿うか」より、自分の䞭で次の3぀に答えが出おいるかが倧事だな、ずいうこずです。

  • 「䜕」を綺麗に分けたくお、その蚭蚈にするのか

  • 今、目の前にある「どんな問題」を解決したいのか

  • その代わりに、どんな「面倒くささ耇雑さ」を背負う芚悟があるか

䞇胜な正解はないので、小さく始めるなら普通のモノリスず1぀のDBで十分。必芁に迫られたら、その時に倉えればいいんです。

AI時代の蚭蚈も、甚語の暗蚘が目的ではないはず。 「自分ずAIが同じシンプルな方針を共有できお、倉曎の圱響をサクッず予枬できるか」。結局はここに尜きるな、ず実感しおいたす。

この蚘事が、迷ったずきのちょっずした道しるべになれば嬉しいです。

参考文献

  • Microsoft Learn「Architecture Styles」

  • Microsoft Learn「Common web application architectures」

  • Microsoft Learn「Microservices architecture style」

  • Microsoft Learn「Event-driven architecture style」

  • Microsoft Learn「CQRS pattern」

  • Microsoft Learn「Event Sourcing pattern」

  • Microsoft Learn「Saga design pattern」

  • Alistair Cockburn「Hexagonal Architecture」

  • Robert C. Martin「The Clean Architecture」

  • Jimmy Bogard「Vertical Slice Architecture」

  • AWS「SOA vs. Microservices」

  • AWS Prescriptive Guidance「Understanding and implementing micro-frontends」

いいなず思ったら応揎しよう