Javaにおけるマイクロサービスアグリゲーターパターン:Javaで効率的な複合サービスを構築する
別名
- APIコンポジション
マイクロサービスアグリゲーターのデザインパターンの意図
マイクロサービスアグリゲーターパターンは、複数のマイクロサービスからの応答を単一の統合された応答に集約し、スケーラブルなシステムにおけるクライアント-サーバー間の相互作用を最適化します。
マイクロサービスアグリゲーターパターンの詳細な説明と現実世界の例
現実世界の例
旅行予約プラットフォームでは、アグリゲーターマイクロサービスがフライト、ホテル、レンタカーのマイクロサービスからデータを統合し、シームレスなユーザーエクスペリエンスを提供し、スケーラビリティを向上させます。ユーザーが各サービスに個別のリクエストを行う代わりに、プラットフォームはアグリゲーターマイクロサービスを使用します。このマイクロサービスは、これらの各サービスを呼び出し、応答を収集し、情報を単一の統合された応答に統合してユーザーに返送します。これにより、必要なすべての旅行詳細が1か所で提供され、ユーザーが基盤となるサービスと直接やり取りする必要性が減るため、ユーザーエクスペリエンスが簡素化されます。
平易な言葉で
マイクロサービスアグリゲーターは、さまざまなマイクロサービスからデータの一部を収集し、処理のために集計を返します。
Stack Overflowの意見
マイクロサービスアグリゲーターは、アプリケーションに必要な機能を達成するために複数のサービスを呼び出します。
Javaでのマイクロサービスアグリゲーターパターンのプログラム例
当社のWebマーケットプレイスでは、アグリゲーターマイクロサービスを利用して、別々のマイクロサービスから製品と在庫情報を組み合わせてフェッチし、効率的なデータ処理とシステムパフォーマンスの向上を保証しています。
データモデルから始めましょう。ここにProduct
があります。
public class Product {
private String title;
private int productInventories;
// Other properties and methods...
}
次に、Aggregator
マイクロサービスを紹介します。これには、それぞれのマイクロサービスを呼び出すためのクライアントProductInformationClient
とProductInventoryClient
が含まれています。
@RestController
public class Aggregator {
@Resource
private ProductInformationClient informationClient;
@Resource
private ProductInventoryClient inventoryClient;
@RequestMapping(path = "/product", method = RequestMethod.GET)
public Product getProduct() {
var product = new Product();
var productTitle = informationClient.getProductTitle();
var productInventory = inventoryClient.getProductInventories();
//Fallback to error message
product.setTitle(requireNonNullElse(productTitle, "Error: Fetching Product Title Failed"));
//Fallback to default error inventory
product.setProductInventories(requireNonNullElse(productInventory, -1));
return product;
}
}
これが、情報マイクロサービスの実装の本質です。在庫マイクロサービスも同様で、在庫数を返すだけです。
@RestController
public class InformationController {
@RequestMapping(value = "/information", method = RequestMethod.GET)
public String getProductTitle() {
return "The Product Title.";
}
}
これで、Aggregator
REST APIを呼び出すと、製品情報が返されます。
# Example bash call
curl http://localhost:50004/product
# Example output
{"title":"The Product Title.","productInventories":5}
Javaでマイクロサービスアグリゲーターパターンを使用する場合
マイクロサービスアグリゲーターパターンは、eコマースやダッシュボードアプリケーションなど、複数のマイクロサービスからの複合応答を必要とするシナリオに最適です。集計されたデータはユーザーエクスペリエンスとシステム効率を向上させます。
マイクロサービスアグリゲーターパターンの利点とトレードオフ
利点
- クライアントの簡素化:クライアントは、複数のマイクロサービスへの呼び出しを管理するのではなく、1つのサービスとだけやり取りするため、クライアント側のロジックが簡素化されます。
- レイテンシーの削減:応答を集約することで、ネットワーク呼び出しの数が減り、アプリケーション全体のレイテンシーが向上する可能性があります。
- 疎結合:クライアントは個々のマイクロサービスから疎結合され、クライアントに影響を与えることなくマイクロサービス環境をより柔軟に変更できるようになります。
- 集中化されたロジック:集計により、さまざまなサービスから収集されたデータに対して集中化された変換とロジックの適用が可能になり、クライアントで処理したり、複数のサービスに分散したりするよりも効率的です。
トレードオフ
- 単一障害点:アグリゲーターサービスは、高可用性とスケーラビリティを念頭に設計されていない場合、ボトルネックまたは単一障害点になる可能性があります。
- 複雑さ:アグリゲーターの実装は、特に複数のサービスを扱う場合のデータ集計ロジックとエラー処理の点で複雑になる可能性があります。
関連するJavaデザインパターン
- APIゲートウェイ:マイクロサービスアグリゲーターパターンは、APIゲートウェイと組み合わせて使用されることが多く、クライアントが複数のマイクロサービスにアクセスするための単一のエントリポイントを提供します。
- コンポジット:マイクロサービスアグリゲーターパターンは、コンポジットパターンの一種と見なすことができ、コンポジットは複数のマイクロサービスからの集約された応答です。
- ファサード:マイクロサービスアグリゲーターパターンは、ファサードパターンの一種と見なすことができ、ファサードはクライアントに簡略化されたインターフェイスを提供するアグリゲーターサービスです。
参考文献とクレジット
- Building Microservices: Designing Fine-Grained Systems
- Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
- Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services
- Microservice Architecture: Aligning Principles, Practices, and Culture
- Microservices Patterns: With examples in Java
- パターン:APIコンポジション
- Production-Ready Microservices: Building Standardized Systems Across an Engineering Organization
- Microservice Design Patterns (Arun Gupta)