SOAサービスの主要な設計原則の1つは、サービスの構成可能性の原則(https://en.wikipedia.org/wiki/Service_composability_principle)です。
アイデアは、既存のサービスを構成要素として使用して新しいサービスを構成することにより、新しいサービスを迅速に開発できるということです。新しいメソッドを実装するときにオブジェクトのexisingメソッドを呼び出す方法に似ています。これは、SOAによる生産性の向上の多くがもたらされることになっている場所です。
実際に誰かがこれを実際にしていますか?私はこれを文章で延々と繰り返してきましたが、実際の実装を実際に経験したことはありません。また、ほとんどのテキストでは、トランザクション処理に関する記述が省略されています。これは、構成可能なサービスを実現する上で最大の障害であると思われます。
最初に、重要なサービスを作成する前に、トランザクションの問題に取り組む必要があります。もちろん、例にサービス「findCurrentTime()」および「writeLogMessage()」がある場合、トランザクションについて心配することは簡単ですが、「depositMoney()」および「withdrawMoney()」などの実世界の例を持っている場合はそうではありません。
私は2つのオプションを知っています:
- WS-Atomic Transactionなどを使用して実際のトランザクションを実装する
- Aへの呼び出しを「cancelA()」またはBへの呼び出しが失敗した場合に何らかの補償を行う補償ベースのソリューションを実装する
これらは両方とも非常に問題があるように思われます。
- WS-Atomic Transaction
- 多くの複雑さのは、私は警告したことが最もアドバイス「お尻の痛みは、それを行ういけません」
- サポートは制限されています。たとえば、オープンソースのESBを使用する場合、ServiceMix、Mule、またはWSO2の主要な代替はサポートしません
- 補償
- 補償の処理を実装することは私にとって非常に複雑に思えます。サービスAが成功し、サービスBから回答を得られず、失敗したか成功したかわからない場合はどうすればよいですか?このようなロジックを(合成サービスの実装者として)手動で処理すると、手首を切り裂きたいと思うようになります。
- また、重要なサービスで補償方法を使用する方法もわかりません。サービスAが「depositMoney()」で成功した場合、他のアクションがすぐに別の場所に送金し、「compensateDepositMoney()」を受け取ったとします。ワームの大きな缶のようです。
私にとっては、サービスの構成は非常に基本的なSOAの原則であるため、サービスを(便利に)構成できない場合は、SOAの利点を実際には得られないようです。。現実は何ですか?90%のSOAユーザーは、実際のサービスを使わずに「暗号化されたSOA」を使用していますか?または、ほとんどのユーザーが実際にサービス構成を使用しており、その難しさを誇張していますか?