1


0

誰かがサービスベースのアーキテクチャについて話すときはいつでも、彼らはしばしばスケーラビリティについてしばしば言及します。 ただし、SOAPやRESTなどのプロトコルが含まれるようになったため、サービスを使用すると、サービスを削減するのではなく、より多くのオーバーヘッドが追加されるようです。 それで、Webサービスベースのアーキテクチャーは、Webアプリケーションなどのユーザーの数がおそらく1桁増加するにつれて、パフォーマンス上の利点を実際に追加するのでしょうか。 それとも、スケーラビリティ要件は、コアアプリケーションではなく、単にサービスにオフロードされるのでしょうか。

6 回答


3


スケーラビリティとパフォーマンスは2つの別々のものです。 はい、サービスベースのアプローチではネットワークプロトコルのオーバーヘッドが増えますが、ドメイン上のどのアプリケーションでも十分にテストされたサービスを迅速に採用できるという利点を得るための最小限の犠牲です。

ネットワークのオーバーヘッドが、構築しようとしているシステムにとって重大な問題である場合は、明らかにSOAがあなたにとって間違った選択です。 決してサービスにHTTP経由でアクセスする必要がないことを忘れないでください。 いくつかのプロトコル( `+ net.tcp +`など)がどれほど高速であるかに驚かれると思います。


2


クライアントに影響を与えることなく、Webサービスをスケールアウトして複数のサーバー上で実行することができます。 密結合システムではそれほどうまくいきません。


1


適切に設計されたSOAにより、システム内の各コンポーネントは他のコンポーネントとは独立して動作し、非同期で並行して実行できるため、パフォーマンスとスケーラビリティ(2つの異なる点)はシステム内で最も遅く/スケーラビリティが低い部分によってのみ制限されます。すべてのコンポーネントが連続して実行されるのにかかる合計時間。

ただし、SOAはすべてのソリューションに適しているわけではありません。したがって、特定のケースで明確なメリットが見られない場合は、何もないかもしれません。


1


Webサービスは無料でスケーラビリティをあなたに与えません。 実際、規模が大きくないサービスを構築するのはとても簡単です。

彼らがあなたに与えるのは、スケーラビリティを構築する機会です。 そして、明確に定義されたサービスインターフェースを持つことによって、あなたはそれを必要とするとき、より良い実装と迅速で汚いスケーラブルでないサービスの実装を交換することができます。

重要なことは、「SOA」の「A」を忘れないことです。 あなたはほんのわずかのサービスを作成するだけで巨大な混乱をきたすことができます。 あなたがアーキテクチャを持っていることを確認してください。

スケーラビリティに向けた1つの大きなステップは、基本的な同期、照会/応答タイプのサービス(SOAP RPCなど)から非同期サービスへの移行です。 HohpeとWoolfの「エンタープライズ統合パターン」を参照してください。


0


RESTafariansはRESTがプロトタイプではないことをあなたに思い出させるでしょう - それは建築スタイルです。 RESTは、サービスモデルを提供するために、SOAPが使用するラッパーなしで直接HTTPを使用する方法です。 RESTは、SOAPというワイヤにはるかに近いものです。 それだけでは、一方が他方よりも良くなるわけではなく、どちらも自分の立場にあります。

サービスモデルのスケーラビリティは、「サービス」(資本Wと資本Sを持つWebサービスの場合のように)に直接関連するものではありません。これらのサービスのステートレスな性質に対するものではありません。 適切に構築されたWebアプリケーションもスケーラブルであり、他のサービス駆動型アーキテクチャと同じくらいスケーラブルであると主張することができます。

2つのモデルの違いの1つは、「サービス」を持たないWebアプリケーションがバイナリレベルで同じプロセス内に存在する参照先モジュールと対話しているという点です。シリアル化は不要です。 Webサービス(SOAPまたはREST)では、オーバーヘッドを増やすある程度のシリアル化が導入されています。 ただし、このオーバーヘッドは、それが提供する再利用を考えると価値があると見なされることがよくあります(つまり、アプリを内部的に駆動するのと同じWebサービスを使用してビジネスパートナーを幸せにすることもできます)。

優れたアーキテクチャーの1つは、サービスクラスを公開することです(Webサービスではなく、すぐに混乱する可能性があります)。 このコンテキストでのサービスとは、直接プロセスでローカルアプリケーションに低レベルのビジネスプロセスを提供しているクラスを意味します - このサービスとバイナリで対話する機能を利用する。 ただし、ビジネスパートナーやその他のサービスを使用する場合は、テスト済みのこれらのサービスクラスの上にシンWebサービス層を配置して、Webサービスと同じサービス層を利用できるようにします。


-2


それでは、最初に「スケーラビリティ」を定義しましょう。 ほとんど何でもあります。スケール:最初の概算で、もっと容量が必要な場合は、単純にハードウェアを追加することができます。 しかし、いくつかのアーキテクチャは "よりスケーラブル"です - それはどういう意味ですか? それはコストと関係があります:追加容量の単位あたりのコストがより少ないならアーキテクチャは「よりスケーラブル」です。

スケーラビリティには、一般的にどのアーキテクチャでも3つの範囲があります。最初の部分には固定コストがあるため、ある区間では勾配は0で線形です。その時点を過ぎると傾きが大きくなり、ある時点で容量を追加するのは非常に高価になります。

追加容量の単位あたりのコストを記述する関数が広い範囲にわたってほぼ線形である場合、システムは「線形的に拡張可能」であると言えます。 明らかに、その傾きがより少ないことが望ましいです。

だから、今、誰かがSOA、SOAP、RESTの「スケーラビリティ」などを問うとき、それが彼らが話していることです。

サービス指向アーキテクチャーは「拡張性が高い」と言われています。なぜなら、言うまでもなく、1人のユーザーにサービスを提供するためにはより多くのキャパシティが必要になる場合があります。 これは、大規模システムを管理するためのコストと複雑さの大部分が、セッション状態を維持する必要性、つまり、呼び出しと呼び出しの間に何が起こっているかを追跡する必要があるためです。 サービス指向アーキテクチャーでは、各呼び出しを次の呼び出しから比較的独立させることで、RESTfulアーキテクチャーが制限的なケースとなります。セッション状態はすべて表現にエンコードされるため、残りのシステムはそれを知る必要はありません。 容量を追加したい場合は、サーバーをもう1台追加するだけです。メッセージを新しいメッセージにルーティングするには、単純な負荷分散で十分です。

(これは本質的にフォールトトレラントであることにも注意してください。サーバーが停止した場合、他のサーバーがほぼ自動的に要求を取得し、セッションを失うことはありません。)

一部のJ2EEシステムのように、多くのセッション状態を必要とするアーキテクチャーは、セッション状態を管理するためにさらに複雑な作業が必要になるため、拡張性が低下する傾向があります。

これまでのCGIベースのアーキテクチャで見られたような限定的なケースは、各ユーザーセッションが完全でヘビー級のプロセスを必要とするケースです。 fork / execが負荷の40〜50%で、要求が常にセッションを保持しているマシンに届くようにするために複雑なソフトウェアロードバランシングリグが必要な分野でシステムを見ました。単純にプロセススロットを使い果たすことが大きな問題でした。 そのようなシステムの1つでは、容量を増やすためにまったく新しいハイエンドのStarfireサーバーを購入する必要がありました。