最近、「N層アーキテクチャーの経験が必要」または「N層アプリを開発できる必要がある」という文章を含む、かなりの数の開発者求人情報を目にしました。
これにより、N層アーキテクチャとは何ですか?どうやってそれを経験するのですか?
最近、「N層アーキテクチャーの経験が必要」または「N層アプリを開発できる必要がある」という文章を含む、かなりの数の開発者求人情報を目にしました。
これにより、N層アーキテクチャとは何ですか?どうやってそれを経験するのですか?
回答:
ソフトウェアエンジニアリングでは、多層アーキテクチャ(n層アーキテクチャとも呼ばれます)は、プレゼンテーション、アプリケーション処理、およびデータ管理が論理的に別個のプロセスであるクライアント/サーバーアーキテクチャです。たとえば、ミドルウェアを使用してユーザーとデータベース間のデータ要求を処理するアプリケーションは、多層アーキテクチャを採用しています。「多層アーキテクチャ」の最も一般的な使用法は、3層アーキテクチャを指します。
「層」と見なされるものについては議論の余地がありますが、私の意見では、少なくともプロセスの境界を越える必要があります。または、レイヤーと呼ばれます。ただし、物理的に異なるマシンにある必要はありません。推奨しませんが、論理層とデータベースを同じボックスでホストできます。
編集:1つの影響は、プレゼンテーション層とロジック層(ビジネスロジック層と呼ばれることもあります)は、時として信頼性の低い、低速な、および/または安全でないネットワークを介して「ネットワークを越えて」マシンの境界を越える必要があることです。これは、データがファイルと同じマシン上にある単純なデスクトップアプリケーションや、データベースに直接アクセスできるWebアプリケーションとは大きく異なります。
n層プログラミングの場合、「データセット」と呼ばれるある種のトランスポータブル形式でデータをパッケージ化し、それらをネットワーク上で飛ばす必要があります。.NETのDataSetクラスやSOAPなどのWebサービスプロトコルは、オブジェクトをネットワーク経由で飛ばそうとする試みのほんの一部です。
これは、プレゼンテーションレイヤーをコアビジネスロジックおよびデータアクセスから分離する方法に基づいています(Wikipedia)
N層データアプリケーションは、複数の層に分離されたデータアプリケーションです。「分散アプリケーション」および「多層アプリケーション」とも呼ばれるn層アプリケーションは、処理をクライアントとサーバー間で分散される個別の層に分離します。データにアクセスするアプリケーションを開発するときは、アプリケーションを構成するさまざまな層を明確に分離する必要があります。
典型的なn層アプリケーションには、プレゼンテーション層、中間層、およびデータ層が含まれます。n層アプリケーションのさまざまな層を分離する最も簡単な方法は、アプリケーションに含める層ごとに個別のプロジェクトを作成することです。たとえば、プレゼンテーション層はWindowsフォームアプリケーションであり、データアクセスロジックは中間層にあるクラスライブラリである場合があります。さらに、プレゼンテーション層は、サービスなどのサービスを介して中間層のデータアクセスロジックと通信する場合があります。アプリケーションコンポーネントを別々の層に分離すると、アプリケーションの保守性とスケーラビリティが向上します。これは、ソリューション全体の再設計を必要とせずに単一の層に適用できる新しいテクノロジーをより簡単に採用できるようにすることで実現します。加えて、
MicrosoftのWebサイトから取得。
質問を理解している場合、質問者は「大丈夫、3層は十分に理解されているが、4層、または一般化とは、N層アーキテクチャを意味します。だから、広く理解され、同意されているN層の定義は何ですか?」
それは実際にはかなり深い質問であり、その理由を説明するために、もう少し深く掘り下げる必要があります。私と一緒に耐えなさい。
古典的な3層アーキテクチャ:データベース、「ビジネスロジック」、およびプレゼンテーションは、関心の分離の原則を尊重する方法を明確にする良い方法です。つまり、「ビジネス」が顧客にサービスを提供する方法を変更したい場合、システム全体を調べてこれを行う方法を理解する必要はありません。特に、ビジネス上の問題が散らばってはいけません。コードを介して意地悪。
現在、このモデルは何十年にもわたって機能し、クラシックな「クライアント/サーバー」モデルです。クラウド製品に早送りします。Webブラウザーは、物理的に分散された幅広いユーザーのセットのユーザーインターフェイスであり、通常、従来の3層アーキテクチャーには含まれないコンテンツ配信サービスを追加する必要があります(そして独自に管理する必要があります)。
この概念は、サービス、マイクロサービス、データと計算の分散方法などに関して一般化されています。何かが「層」であるかどうかは、主に、層が層の背後(または下)のサービスにインターフェースとデプロイメントモデルを提供するかどうかにかかっています。したがって、コンテンツ配信ネットワークは階層になりますが、認証サービスはそうではありません。
ここで、この概念を念頭に置いたN層アーキテクチャーの例の他の説明を読み、問題を理解し始めます。その他の視点には、ベンダーベースのアプローチ(例:NGINX)、コンテンツ認識ロードバランサー、データ分離およびセキュリティサービス(例:IBM Datapower)が含まれます。これらはすべて、特定のアーキテクチャー、デプロイメント、およびユースケースに価値を追加する場合としない場合があります。
N層データアプリケーションは、複数の層に分離されたデータアプリケーションです。「分散アプリケーション」および「多層アプリケーション」とも呼ばれるn層アプリケーションは、処理をクライアントとサーバー間で分散される個別の層に分離します。データにアクセスするアプリケーションを開発するときは、アプリケーションを構成するさまざまな層を明確に分離する必要があります。
通常のMCV(3層アーキテクチャー)を構築する場合、MCVをダブルデッキインターフェースで実装することを決定できます。これにより、コードを1行も変更せずに特定の層を実際に置き換えることができます。
たとえば、複数のデータベースを使用できるようにするシナリオ(この場合、コントロールレイヤーとデータレイヤーの間に二重のインターフェイスがある)で、このの利点がよく見られます。
ビューレイヤー(プレゼンテーション)に配置すると、USERインターフェースを別のマシンに置き換えて(ホールド!!)、REAL入力を自動化できます(!!!)。これにより、何千もの退屈なユーザビリティテストを実行できます。何回もユーザーが同じものを何度もタップして再タップして再タップする必要はありません。
いくつかのこのような説明3層アーキテクチャのような1又は2の二重インターフェイスと4層又は5層の暗黙ダブルインターフェイスを暗示、アーキテクチャ。
その他のケースには、以下に限定されないが含まれます(ただし、これらに限定されません)。セミまたはフルに複製されたデータベースシステムの場合、実際にはデータベースの1つを「マスター」と見なすことができるため、階層が作成されます。マスターデータベースとスレーブデータベースで構成されます。
モバイルの例
したがって、多層またはN層には確かにいくつかの解釈がありますが、前述の層の交換を可能にするために、間に挟み込まれた薄いインターフェースディスクで構成される3層+追加の層に確実に固執します。テスト(特にモバイルデバイスで使用)では、制御ロジックが実際のユーザーのタップと区別できない方法でユーザーのタップをシミュレートすることにより、実際のソフトウェアでユーザーテストを実行できます。これは、ユーザーOTAからのすべての入力を記録し、回帰テストを実行するときに同じ入力を再利用できるという点で、実際のユーザーテストのシミュレーションにおいてほぼ最優先事項です。
層について話すときは、一般的に物理プロセス(異なるメモリ空間を持っている)について話します。
したがって、アプリケーションのレイヤーが異なるプロセスにデプロイされている場合、それらの異なるプロセスは異なる層になります。
たとえば、3層アプリケーションでは、ビジネス層がメインフレーム(個別のプロセス)と通信し、レポートサービス(個別のプロセス)と通信する場合、そのアプリケーションは5層になります。
したがって、総称名はn層です。
https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/n-tierから
N層アーキテクチャは、アプリケーションタイヤを主に論理タイヤと物理層に分割し、それらをサブパーツに分割します。
レイヤーは、責任を分離し、依存関係を管理する方法です。各層には特定の責任があります。上位層は下位層でサービスを使用できますが、その逆はできません。
層は物理的に分離され、別々のマシンで実行されます。層は、別の層を直接呼び出すか、非同期メッセージング(メッセージキュー)を使用できます。各層は独自の層でホストされる場合がありますが、これは必須ではありません。複数の層が同じ層でホストされる場合があります。層を物理的に分離すると、スケーラビリティと復元力が向上しますが、追加のネットワーク通信からの遅延も増加します。
従来の3層アプリケーションには、プレゼンテーション層、中間層、およびデータベース層があります。中間層はオプションです。より複雑なアプリケーションでは、4つ以上の層を持つことができます。上の図は、2つの中間層を備え、機能の異なる領域をカプセル化したアプリケーションを示しています。
N層アプリケーションは、クローズドレイヤーアーキテクチャまたはオープンレイヤーアーキテクチャを持つことができます。
In a closed layer architecture, a layer can only call the next layer immediately down.
In an open layer architecture, a layer can call any of the layers below it.
クローズドレイヤーアーキテクチャは、レイヤー間の依存関係を制限します。ただし、1つのレイヤーが次のレイヤーにリクエストを渡すだけの場合は、不要なネットワークトラフィックが発生する可能性があります。
N層アプリケーションは、4つ以上のコンポーネントが関係するアプリケーションです。それらのコンポーネントは何ですか?
Instagram、Facebookなどのすべてのソーシャルアプリケーション、Uber、Airbnbなどの大規模な業界サービス、Pokemon Goなどのオンラインの大規模マルチプレーヤーゲーム、ファンシー機能を備えたアプリケーションはn層アプリケーションです。
Martin Fowlerが明確に示しています:
レイヤー化は、ソフトウェア設計者が複雑なソフトウェアシステムを分解するために使用する最も一般的な手法の1つです。それはマシンアーキテクチャで見られます。そこでは、レイヤーがプログラミング言語から派生し、オペレーティングシステムコールがデバイスドライバーとCPU命令セット、およびチップ内のロジックゲートに渡されます。ネットワーキングは、イーサネットの上にあるIPの上にあるTCPの上にFTP層があります。
システムをレイヤーの観点から考えるとき、ソフトウェアの主要なサブシステムが、何らかの形のレイヤーケーキに配置され、各レイヤーが下位レイヤーにあることを想像します。このスキームでは、上位層は下位層によって定義されたさまざまなサービスを使用しますが、下位層は上位層を認識しません。さらに、各レイヤーは通常、その下のレイヤーを上のレイヤーから隠しているため、レイヤー4はレイヤー2のサービスを使用するレイヤー3のサービスを使用しますが、レイヤー4はレイヤー2を認識しません(すべてのレイヤーアーキテクチャがこのように不透明であるわけではありません)ですが、ほとんどは不透明ですが、ほとんどは不透明です。)
システムをレイヤーに分解すると、いくつかの重要な利点があります。
•他のレイヤーについてあまり知らなくても、1つのレイヤーをまとまった全体として理解できます。イーサネットの仕組みの詳細を知らなくても、TCP上にFTPサービスを構築する方法を理解できます。
•同じ基本サービスの代替実装でレイヤーを置き換えることができます。FTPサービスは、イーサネット、PPP、またはケーブル会社が使用するものを変更せずに実行できます。
•レイヤー間の依存関係を最小限に抑えます。ケーブル会社がIPを機能させるという条件で物理的な伝送システムを変更した場合、FTPサービスを変更する必要はありません。
•レイヤーは標準化に適した場所です。TCPとIPは、レイヤーの動作方法を定義しているため、標準です。
•レイヤーを作成したら、それを多くの高レベルのサービスに使用できます。したがって、TCP / IPはFTP、Telnet、SSH、およびHTTPで使用されます。そうでない場合、これらの高レベルのプロトコルはすべて、独自の低レベルのプロトコルを作成する必要があります。カイル・ジェフリー・パッサレッリ図書館から
レイヤー化は重要なテクニックですが、欠点もあります。
•レイヤーは、すべてではなく一部を適切にカプセル化します。その結果、カスケード変更が発生することがあります。レイヤードエンタープライズアプリケーションでのこの典型的な例は、UIに表示する必要があるフィールドを追加することであり、データベースに存在する必要があるため、その間のすべてのレイヤーに追加する必要があります。
•追加のレイヤーはパフォーマンスに悪影響を与える可能性があります。すべてのレイヤーで、通常、表現をある表現から別の表現に変換する必要があります。ただし、基礎となる関数をカプセル化すると、多くの場合、補償以上の効率が得られます。トランザクションを制御するレイヤーを最適化すると、すべてがより高速になります。しかし、レイヤードアーキテクチャの最も難しい部分は、どのレイヤーをどのように持つべきか、各レイヤーの責任をどうするべきかを決定することです。