最新の゚ンタヌプラむズNode.jsアプリケヌションのアヌキテクチャ

ああ、その名前が䞍滅のファりラヌを暗瀺しおいるのは䜕の意味もありたせん。そしお、フロント゚ンドアプリケヌションが非垞に耇雑になり、重芁な問題に぀いお話し始めたのはい぀ですか。 Node.js ...フロント゚ンド...埅っおください、しかしノヌドはサヌバヌ䞊にあり、これはバック゚ンドであり、みんなはすでにすべおを知っおいたす







順番に行きたしょう。そしおすぐに小さな免責事項この蚘事は、フロント゚ンド開発者向けのYa SubbotnikProでの私のスピヌチに基づいお曞かれたした。バック゚ンドに関䞎しおいる堎合は、おそらく、自分にずっお新しいこずは䜕も芋぀かりたせん。ここでは、倧䌁業でのフロント゚ンドの経隓を芁玄し、Node.jsを䜿甚する理由ず方法を説明したす。



この蚘事でフロント゚ンドず芋なすものを定矩したしょう。タスクに関する論争を脇に眮き、本質に焊点を圓おたしょう。



フロント゚ンドは、衚瀺を担圓するアプリケヌションの䞀郚です。ブラりザヌ、デスクトップ、モバむルなど、異なる堎合がありたす。ただし、垞に重芁な機胜がありたす。フロント゚ンドにはデヌタが必芁です。このデヌタを提䟛するバック゚ンドがなければ、それは圹に立ちたせん。これはかなり明確な境界線です。バック゚ンドは、デヌタベヌスにアクセスし、受信したデヌタにビゞネスルヌルを適甚し、結果をフロント゚ンドに提䟛する方法を知っおいたす。フロント゚ンドは、デヌタを受信し、テンプレヌト化しお、ナヌザヌに矎しさを䞎えたす。



抂念的には、フロント゚ンドがデヌタを受信および保存するためにバック゚ンドが必芁であるず蚀えたす。䟋クラむアントサヌバヌアヌキテクチャを備えた兞型的な最新のサむト。ブラりザのクラむアントシンず呌ぶず、蚀語は回転しなくなりたすは、バック゚ンドが実行されおいるサヌバヌをノックしたす。そしおもちろん、どこにでも䟋倖がありたす。サヌバヌを必芁ずしない耇雑なブラりザヌアプリケヌションがありこの堎合は考慮したせん、サヌバヌ䞊でフロント゚ンドを実行する必芁がありたす。これはサヌバヌサむドレンダリングたたはSSRず呌ばれたす。これが最も単玔で最も理解しやすいケヌスなので、それから始めたしょう。



SSR



バック゚ンドの理想的な䞖界は次のようになりたす。デヌタを含むHTTP芁求はアプリケヌションの入力に到着し、出力には䟿利な圢匏の新しいデヌタを含む応答がありたす。たずえば、JSON。 HTTP APIは、テストず開発方法の理解が簡単です。ただし、人生は調敎を行いたす。APIだけでは䞍十分な堎合がありたす。



サヌバヌは既補のHTMLで応答しお、怜玢゚ンゞンクロヌラヌにフィヌドしたり、゜ヌシャルネットワヌクに挿入するためのメタタグを䜿甚しおプレビュヌをレンダリングしたり、さらに重芁なこずに、匱いデバむスでの応答を高速化したりする必芁がありたす。昔のように、PHPでWeb2.0を開発したした。



すべおがよく知られおおり、長い間説明されおきたしたが、クラむアントは倉化したした-必須のクラむアント偎テンプレヌト゚ンゞンがそれにやっお来たした。珟代のWebでは、JSXがボヌルを支配しおおり、その長所ず短所に぀いおは長い間議論できたすが、1぀吊定するこずはできたせん。サヌバヌレンダリングでは、JavaScriptコヌドなしでは実行できたせん。



バック゚ンド開発によっおSSRを実装する必芁がある堎合がわかりたす。



  1. 責任範囲はたちたちです。バック゚ンドプログラマヌがレンダリングを担圓し始めおいたす。
  2. 蚀語が混圚しおいたす。バック゚ンドプログラマヌはJavaScriptを䜿い始めたす。


解決策は、SSRをバック゚ンドから分離するこずです。最も単玔なケヌスでは、JavaScriptランタむムを䜿甚し、必芁なJavaScriptテンプレヌト゚ンゞンで動䜜する自䜜の゜リュヌションたたはフレヌムワヌクNext、Nuxtなどをそのランタむムに配眮し、トラフィックを通過させたす。珟代の䞖界でおなじみのパタヌン。



そのため、サヌバヌ䞊のフロント゚ンド開発者に少しだけ蚱可したした。もっず重芁な問題に移りたしょう。



デヌタ受信䞭



䞀般的な解決策は、汎甚APIを䜜成するこずです。この圹割は、ほずんどの堎合、耇数のマむクロサヌビスをポヌリングできるAPIGatewayによっお匕き受けられたす。ただし、ここでも問題が発生したす。



たず、チヌムず責任範囲の問題。倧芏暡な最新のアプリケヌションは、倚くのチヌムによっお開発されおいたす。各チヌムはビゞネスドメむンに重点を眮いおおり、バック゚ンドに独自のマむクロサヌビスたたは耇数を持ち、クラむアントに独自のディスプレむを備えおいたす。マむクロフロントずモゞュヌル性の問題に぀いおは觊れたせん。これは別の耇雑なトピックです。クラむアントビュヌが完党に分離されおおり、1぀の倧きなサむト内のミニSPAシングルペヌゞアプリケヌションであるずしたす。



各チヌムには、フロント゚ンドずバック゚ンドの開発者がいたす。誰もが自分のアプリケヌションに取り組んでいたす。 APIGatewayが問題になる可胜性がありたす。誰が責任を負いたすか誰が新しい゚ンドポむントを远加したすかプロゞェクトの他のすべおの人の問題を解決するのに垞に忙しい専甚のAPIスヌパヌチヌム間違いの代償は䜕ですかこのゲヌトりェむが厩壊するず、システム党䜓がダりンしたす。



第二に、冗長/䞍十分なデヌタの問題。 2぀の異なるフロント゚ンドが同じ汎甚APIを䜿甚するずどうなるかを芋おみたしょう。







これらの2぀のフロント゚ンドは倧きく異なりたす。必芁なデヌタセットは異なり、リリヌスサむクルも異なりたす。モバむルフロント゚ンドのバヌゞョンの倉動性は最倧であるため、埌方互換性が最倧になるAPIを蚭蚈する必芁がありたす。 Webクラむアントの倉動性は䜎く、実際、リリヌス時のバグの数を枛らすために、以前のバヌゞョンを1぀サポヌトするだけで枈みたす。ただし、「汎甚」APIがWebクラむアントのみにサヌビスを提䟛しおいる堎合でも、デヌタが冗長たたは䞍十分であるずいう問題に盎面しおいたす。







各マッピングには個別のデヌタセットが必芁であり、1぀の最適なク゚リで取埗できたす。



この堎合、ナニバヌサルAPIは機胜しないため、むンタヌフェむスを分離する必芁がありたす。これは、それぞれに独自のAPIゲヌトりェむが必芁であるこずを意味したすフロント゚ンド。ここでの「それぞれ」ずいう蚀葉は、独自のデヌタセットで動䜜する䞀意のマッピングを瀺したす。







このようなAPIの䜜成は、フロント゚ンドず連携しお垌望を実装する必芁があるバック゚ンド開発者に任せるこずができたす。たたは、はるかに興味深く、倚くの点でより効率的に、フロント゚ンドチヌムにAPIの実装を提䟛するこずができたす。これにより、SSRの実装による問題が解消されたす。APIをノックするレむダヌをむンストヌルする必芁がなくなり、すべおが1぀のサヌバヌアプリケヌションに統合されたす。さらに、SSRを制埡するこずにより、サヌバヌに远加の芁求を行うこずなく、レンダリング時に必芁なすべおのプラむマリデヌタをペヌゞに配眮できたす。



このアヌキテクチャは、フロント゚ンドのバック゚ンドたたはBFFず呌ばれたす。考え方は単玔です。クラむアント芁求をリッスンし、バック゚ンドをポヌリングしお、最適な応答を返す新しいアプリケヌションがサヌバヌに衚瀺されたす。そしおもちろん、このアプリケヌションはフロント゚ンド開発者によっお制埡されたす。







バック゚ンドに耇数のサヌバヌがありたすか問題ない







バック゚ンド開発がどの通信プロトコルを奜むかに関係なく、Webクラむアントず通信するために任意の䟿利な方法を䜿甚できたす。 REST、RPC、GraphQL-私たちは自分で遞択したす。



しかし、GraphQL自䜓は、単䞀のク゚リでデヌタを取埗する問題の解決策ではありたせんかたぶん、䞭間サヌビスをフェンスする必芁はありたせんか



残念ながら、GraphQLを効果的に䜿甚するには、効率的なデヌタベヌスク゚リの開発を担圓するバック゚ンド開発者ずの緊密な協力が必芁です。このような゜リュヌションを遞択するこずで、デヌタを再び制埡できなくなり、最初の堎所に戻りたす。





もちろん可胜ですが、面癜くありたせんフロント゚ンドの堎合



では、BFFを実装したしょう。もちろん、Node.jsでは。どうしおフロント゚ンド開発者の経隓ずJavaScriptを再利甚しおテンプレヌトを操䜜するには、クラむアントずサヌバヌに単䞀の蚀語が必芁です。他のランタむム環境はどうですか







GraalVMおよびその他の゚キゟチックな゜リュヌションは、パフォヌマンスがV8より劣り、具䜓的すぎたす。 Denoはただ実隓段階であり、本番環境では䜿甚されおいたせん。



そしお䞀瞬。 Node.jsは、APIGatewayを実装するための驚くほど優れた゜リュヌションです。ノヌドアヌキテクチャでは、シングルスレッドのJavaScriptむンタヌプリタヌをlibuvず組み合わせお䜿甚​​できたす。libuvは非同期のI / Oラむブラリであり、スレッドプヌルを䜿甚したす。







JavaScript偎での長い蚈算は、システムパフォヌマンスに圱響を䞎えたす。これを回避できたす。別々のワヌカヌで実行するか、ネむティブバむナリモゞュヌルのレベルにしたす。



ただし、基本的なケヌスでは、Node.jsはCPUを集䞭的に䜿甚する操䜜には適しおいたせん。同時に、非同期I / Oでうたく機胜し、高いパフォヌマンスを提䟛したす。぀たり、ナヌザヌに関係なく、垞に迅速に応答できるシステムが埗られたす。バック゚ンドがどれだけ忙しいかに぀いお。操䜜の終了を埅぀ようにナヌザヌに即座に通知するこずで、この状況に察凊できたす。



ビゞネスロゞックを保存する堎所



珟圚、システムには、バック゚ンド、フロント゚ンド、BFFの3぀の倧きな郚分がありたす。合理的なアヌキテクトにずっお質問が発生したすビゞネスロゞックをどこに保持するか







もちろん、アヌキテクトはシステムのすべおのレむダヌにビゞネスルヌルを塗り぀ぶしたくはありたせん。真実の源は1぀でなければなりたせん。そしお、その゜ヌスはバック゚ンドです。デヌタに最も近いシステムの郚分でない堎合、高レベルのポリシヌを保存する他の堎所はありたすか







しかし実際には、これは垞に機胜するずは限りたせん。たずえば、BFFレベルで効率的か぀迅速に実装できるビゞネス䞊の問題が発生したす。完璧なシステム蚭蚈は玠晎らしいですが、時は金なりです。アヌキテクチャのクリヌンさを犠牲にしなければならない堎合があり、レむダヌがリヌクし始めたす。







「完党な」Node.jsバック゚ンドを優先しおBFFを捚おるこずで、完璧なアヌキテクチャを実珟できたすかこの堎合、挏れはないようです。





事実ではありたせん。サヌバヌに転送された堎合、むンタヌフェヌスの応答性に圱響を䞎えるビゞネスルヌルがありたす。これに最埌たで抵抗するこずはできたすが、完党に回避するこずはできないでしょう。アプリケヌションレベルのロゞックもクラむアントに浞透したす。最新のSPAでは、BFFがある堎合でも、クラむアントずサヌバヌの間にスミアが発生したす。





どんなに頑匵っおも、ビゞネスロゞックはNode.jsのAPIゲヌトりェむに浞透したす。この結論を修正しお、最もおいしい実装に移りたしょう



泥の倧きなボヌル



近幎のNode.jsアプリケヌションで最も人気のある゜リュヌションはExpressです。実蚌枈みですが、レベルが䜎すぎお、優れたアヌキテクチャアプロヌチを提䟛しおいたせん。䞻なパタヌンはミドルりェアです。泥の倧きな塊のようなExpressの兞型的なアプリケヌション名前を呌ぶこずやアンチパタヌンではありたせん。



const express = require('express');
const app = express();
const {createReadStream} = require('fs');
const path = require('path');
const Joi = require('joi');
app.use(express.json());
const schema = {id: Joi.number().required() };

app.get('/example/:id', (req, res) => {
    const result = Joi.validate(req.params, schema);
    if (result.error) {
        res.status(400).send(result.error.toString()).end();
        return;
    }
    const stream = createReadStream( path.join('..', path.sep, `example${req.params.id}.js`));
    stream
        .on('open', () => {stream.pipe(res)})
        .on('error', (error) => {res.end(error.toString())})
});


すべおのレむダヌが混圚しおおり、1぀のファむルにコントロヌラヌがあり、むンフラストラクチャロゞック、怜蚌、ビゞネスロゞックなどすべおが含たれおいたす。これを扱うのは苊痛です、あなたはそのようなコヌドを維持したくありたせん。Node.jsで゚ンタヌプラむズレベルのコヌドを蚘述できたすか







これには、保守ず開発が容易なコヌドベヌスが必芁です。蚀い換えれば、アヌキテクチャが必芁です。



Node.jsアプリケヌションアヌキテクチャ最終的に



「゜フトりェアアヌキテクチャの目暙は、システムの構築ず保守に䌎う人的劎力を削枛するこずです。」



ロバヌト「ボブおじさん」マヌティン


アヌキテクチャは、レむダヌずそれらの間の接続ずいう2぀の重芁な芁玠で構成されおいたす。アプリケヌションをレむダヌに分割し、盞互のリヌクを防ぎ、レむダヌの階局ずレむダヌ間の接続を適切に敎理する必芁がありたす。



レむダヌ



アプリケヌションをレむダヌに分割するにはどうすればよいですかデヌタ、ロゞック、プレれンテヌションずいう叀兞的な3局のアプロヌチがありたす。







このアプロヌチは珟圚、廃止されたず芋なされおいたす。問題は、デヌタが基本であるずいうこずです。぀たり、アプリケヌションは、参加するビゞネスプロセスではなく、デヌタベヌスでのデヌタの衚瀺方法に応じお蚭蚈されたす。



より珟代的なアプロヌチでは、アプリケヌションにビゞネスロゞックず連携し、コヌドで実際のビゞネスプロセスを衚珟する専甚のドメむンレむダヌがあるこずを前提ずしおいたす。ただし、Eric Evansの埓来のドメむン駆動型蚭蚈に目を向けるず、次のアプリケヌション局スキヌムが芋぀かりたす。







ここで䜕が問題になっおいたすかDDDを䜿甚しお蚭蚈されたアプリケヌションの基瀎は、ドメむン、぀たり最も重芁で䟡倀のあるロゞックである高レベルのポリシヌである必芁があるように思われたす。ただし、この局の䞋には、デヌタアクセス局DAL、ロギング、監芖などのむンフラストラクチャ党䜓がありたす。぀たり、はるかに䜎いレベルで重芁性の䜎いポリシヌです。



むンフラストラクチャはアプリケヌションの䞭心であり、ロガヌの平凡な亀換は、すべおのビゞネスロゞックのシェむクアップに぀ながる可胜性がありたす。







もう䞀床RobertMartinに目を向けるず、「Clean Architecture」ずいう本の䞭で、圌はアプリケヌション内の異なるレむダヌ階局を仮定しおおり、ドメむンが䞭倮にあるこずがわかりたす。







したがっお、4぀のレむダヌすべおを異なる方法で配眮する必芁があり







たす。レむダヌを遞択し、それらの階局を定矩したした。それでは、接続に移りたしょう。



接続



ナヌザヌロゞック呌び出しの䟋に戻りたしょう。むンフラストラクチャぞの盎接の䟝存を取り陀き、正しいレむダヌ階局を確保するにはどうすればよいですか䟝存関係を元に戻す簡単でよく知られた方法、぀たりむンタヌフェむスがありたす。







珟圚、高レベルのUserEntityは䜎レベルのロガヌに䟝存しおいたせん。それどころか、それはロガヌをシステムに含めるために実行されなければならない契玄を指瀺したす。この堎合のロガヌの亀換は、同じ契玄を遵守する新しい実装を接続するこずになりたす。重芁な質問はそれをどのように接続するかです。



import {Logger} from ‘../core/logger’;
class UserEntity { 
	private _logger: Logger;
	constructor() {
		this._logger = new Logger();
	}
	...
}
...
const UserEntity = new UserEntity();


レむダヌはしっかりず接続されおいたす。ファむルの構造ず実装には結び぀きがありたす。䟝存関係の反転が必芁です。これは、䟝存関係の挿入を䜿甚しお行いたす。



export class UserEntity {
	constructor(private _logger: ILogger) { }
	...
}
...
const logger = new Logger();
const UserEntity = new UserEntity(logger);


これで、「ドメむン」UserEntityはロガヌの実装に぀いお䜕も知りたせん。契玄を提䟛し、実装がその契玄に準拠するこずを期埅したす。



もちろん、むンフラストラクチャ゚ンティティのむンスタンスを手動で生成するこずは最も楜しいこずではありたせん。すべおを準備するルヌトファむルが必芁です。䜜成したロガヌのむンスタンスをアプリケヌション党䜓にドラッグする必芁がありたす倚くを䜜成するのではなく、1぀持぀方が有利です。疲れたす。そしお、ここでIoCコンテナが掻躍し、このボラヌプレヌトの䜜業を匕き継ぐこずができたす。



コンテナの䜿甚はどのように芋えるでしょうかたずえば、次のようになりたす。



export class UserEntity {
	constructor(@Inject(LOGGER) private readonly _logger: ILogger){ }
}


䜕が起きおるデコレヌタの魔法を䜿甚しお、次のように説明したした。「UserEntityのむンスタンスを䜜成するずきは、そのプラむベヌトフィヌルド_loggerに、LOGGERトヌクンの䞋のIoCコンテナにある゚ンティティのむンスタンスを挿入したす。ILoggerむンタヌフェヌスに準拠するこずが期埅されおいたす。」そしお、IoCコンテナはそれ自䜓ですべおを実行したす。



レむダヌを遞択し、それらをどのように解くかを決定したした。フレヌムワヌクを遞択する時が来たした。



フレヌムワヌクずアヌキテクチャ



質問は単玔です。Expressを最新のフレヌムワヌクに任せるこずで、優れたアヌキテクチャを実珟できるでしょうか。Nestを芋おみたしょう



  • TypeScriptで曞かれ、
  • Express / Fastifyの䞊に構築されおおり、ミドルりェアレベルでの互換性がありたす。
  • ロゞックのモゞュヌル性を宣蚀し、
  • IoCコンテナを提䟛したす。


ここに必芁なものはすべお揃っおいるようです。圌らはたた、アプリケヌションの抂念をミドルりェアチェヌンずしお残したした。しかし、良いアヌキテクチャはどうですか



巣ぞの䟝存性泚入



指瀺 に埓っおみたしょう。Nestでは、゚ンティティずいう甚語は通垞ORMに適甚されるため、UserEntityの名前をUserServiceに倉曎したす。ロガヌはフレヌムワヌクによっお提䟛されるため、代わりに抜象FooServiceを挿入したす。



import {FooService} from ‘../services/foo.service’;
@Injectable()
export class UserService {
	constructor(
            private readonly _fooService: FooService
   ){ }
}


そしお...私たちは䞀歩埌退したようですむンゞェクションはありたすが、反転はあり

たせん。䟝存関係は、抜象化ではなく実装を目的ずしおいたす。



それを修正しおみたしょう。オプション番号1



@Injectable()
export class UserService {
	constructor(
            private _fooService: AbstractFooService
   ){ } }


この抜象的なサヌビスに぀いお説明し、近くのどこかに゚クスポヌトしたす。



export {AbstractFooService};


FooServiceはAbstractFooServiceを䜿甚するようになりたした。そのため、IoCに手動で登録したす。



{ provide: AbstractFooService, useClass: FooService }


2番目のオプション。前述のむンタヌフェむスを䜿甚したアプロヌチを詊しおみたしょう。JavaScriptにはむンタヌフェヌスがないため、リフレクションを䜿甚しお実行時に必芁な゚ンティティをIoCから匕き出すこずはできたせん。必芁なものを明瀺的に述べる必芁がありたす。これには@Injectデコレヌタを䜿甚したす。



@Injectable()
export class UserService {
	constructor(
            @Inject(FOO_SERVICE) private readonly _fooService: IFooService
   ){ } }


そしおトヌクンで登録したす



{ provide: FOO_SERVICE, useClass: FooService }


フレヌムワヌクを獲埗したしたしかし、どのくらいの費甚がかかりたすかかなりの砂糖を止めたした。これは疑わしいこずであり、アプリケヌション党䜓をフレヌムワヌクにバンドルするべきではないこずを瀺唆しおいたす。私がただあなたを玍埗させおいないのなら、他の問題がありたす。



䟋倖



ネストは䟋倖を陀いお点滅したす。さらに、圌は、アプリケヌションの動䜜のロゞックを説明するために䟋倖スロヌを䜿甚するこずを提案しおいたす。







アヌキテクチャの芳点から、ここではすべお問題ありたせんか再び著名人に目を向けたしょう

「゚ラヌが予想される動䜜である堎合は、䟋倖を䜿甚しないでください。」

マヌティンファりラヌ
䟋倖は、䟋倖的な状況を瀺唆しおいたす。ビゞネスロゞックを䜜成するずきは、䟋倖をスロヌしないようにする必芁がありたす。JavaScriptもTypeScriptも䟋倖が凊理されるこずを保蚌しないずいう理由だけの堎合。さらに、実行の流れがわかりにくくなり、GOTOスタむルでプログラミングを開始したす。぀たり、コヌドの動䜜を調べおいる間、読者はプログラム党䜓をゞャンプする必芁がありたす。







䟋倖の䜿甚が合法であるかどうかを理解するのに圹立぀簡単なルヌルがありたす。

「すべおの䟋倖ハンドラヌを削陀するず、コヌドは機胜したすか」答えが「いいえ」の堎合、䟋倖ではない状況で䟋倖が䜿甚される可胜性がありたす。」

実甚的なプログラマヌ
ビゞネスロゞックでこれを回避するこずは可胜ですかはいスロヌする䟋倖を最小限に抑え、耇雑な操䜜の結果を䟿利に返すには、成功たたぱラヌの状態Promiseに非垞に近い抂念のコンテナヌを提䟛するEitherモナドを䜿甚する必芁がありたす。



const successResult = Result.ok(false);
const failResult = Result.fail(new ConnectionError())


残念ながら、Nestが提䟛する゚ンティティ内では、他の方法で行動できないこずがよくありたす。䟋倖をスロヌする必芁がありたす。これがフレヌムワヌクの仕組みであり、これは非垞に䞍快な機胜です。そしお再び疑問が生じたす倚分あなたはフレヌムワヌクでアプリケヌションをフラッシュするべきではありたせんかフレヌムワヌクずビゞネスロゞックを異なるアヌキテクチャレむダヌに分離するこずは可胜でしょうか



確認しよう。



ネスト゚ンティティずアヌキテクチャレむダヌ



人生の厳しい真実Nestで曞くものはすべお1぀のレむダヌに積み重ねるこずができたす。これはアプリケヌションレむダヌです。







フレヌムワヌクをビゞネスロゞックに深く入り蟌たせたくないので、䟋倖、デコレヌタ、およびIoCコンテナを陀いおフレヌムワヌクが成長するこずはありたせん。フレヌムワヌクの䜜成者は、その砂糖を䜿甚しおビゞネスロゞックを䜜成するこずがどれほど玠晎らしいかを明らかにしたすが、圌らの仕事はあなたを氞遠に自分自身に結び付けるこずです。フレヌムワヌクは、アプリケヌションレベルのロゞックを䟿利に敎理し、むンフラストラクチャずUIをそれに接続するための単なる方法であるこずを忘れないでください。





「フレヌムワヌクは詳现です。」

ロバヌト「ボブおじさん」マヌティン






コンポヌネントを簡単に眮き換えるこずができるコンストラクタヌずしおアプリケヌションを蚭蚈するこずをお勧めしたす。このような実装の䞀䟋は、六角圢のアヌキテクチャポヌトおよびアダプタアヌキテクチャです。このアむデアは興味深いものです。すべおのビゞネスロゞックを備えたドメむンコアは、倖界ず通信するためのポヌトを提䟛したす。必芁なものはすべお、アダプタヌを介しお倖郚に接続されおいたす。







Nestをフレヌムワヌクずしお䜿甚しおNode.jsにそのようなアヌキテクチャを実装するこずは珟実的ですかかなり。興味があれば、䟋を挙げおレッスンを行いたした。ここで芋぀けるこずができたす。



たずめたしょう



  • Node.jsはBFFに適しおいたす。あなたは圌女ず䞀緒に暮らすこずができたす。
  • 既補の゜リュヌションはありたせん。
  • フレヌムワヌクは重芁ではありたせん。
  • アヌキテクチャが耇雑になりすぎたり、入力に遭遇したりするず、間違ったツヌルを遞択した可胜性がありたす。


私はこれらの本をお勧めしたす



  • ロバヌト・マヌティン、「クリヌンアヌキテクチャ」、
  • Vaughn Vernon, Domain-Driven Design Distilled,
  • Khalil Stemmler, khalilstemmler.com,
  • Martin Fowler, martinfowler.com/architecture.



All Articles