現在の状況
私たちは、マイクロサービスアーキテクチャでオンラインショッピングWebアプリケーションを実装しています(そして現在保守しています)。
要件の1つは、エクスペリエンスと最終的な注文をカスタマイズするために、顧客がカートに追加するものにルールを適用できる必要があることです。明らかに、ビジネスルールエンジンを導入する必要があり、このために特定の「マイクロサービス」を実装しました(まだそう呼べる場合)。
1年の間に、このルールエンジンはますます複雑になり、より多くのデータ(カートのコンテンツだけでなく、ユーザー情報、役割、既存のサービス、請求情報など)が必要になりました。それらのルールを計算します。
現時点では、shopping-cart
マイクロサービスは他のマイクロサービスからこのデータをすべて収集しています。このデータの一部はで使用されますがshopping-cart
、ほとんどの場合、主にルールエンジンのフィードに使用されます。
新しい要件
これで、同様の要件にルールエンジンを再利用する他のアプリケーション/マイクロサービスが必要になりました。したがって、現在の状況では、ルールエンジンを呼び出すことができるように、同じ種類のデータを送信し、同じマイクロサービスを呼び出し、(ほぼ)同じリソースを構築する必要があります。
そのまま続行すると、いくつかの問題に直面します。
- 誰もが(ルールエンジンを呼び出して)データのフェッチを再実装する必要があります(自分でデータを必要としない場合でも)。
- ルールエンジンへの要求は複雑です。
- この方向で続けると、多くの要求のためにこのデータをネットワーク全体に転送する必要があります(μsAがルールエンジンを呼び出すμsBを考えますが、Aはルールエンジンが必要とするデータの一部を既に持っています)。
shopping-cart
すべてのデータ取得により巨大になりました。- おそらく多くのことを忘れてしまいます…
これらのトラブルを回避するために何ができますか?
理想的には、ルールエンジンの複雑さを増やさないようにします。また、ボトルネックにならないように確認する必要があります。たとえば、一部のデータはフェッチに時間がかかります(10秒以上)ためshopping-cart
、ルールを呼び出す前にデータが存在する可能性が高くなるようにプリフェッチを実装しましたエンジン、および許容できるユーザーエクスペリエンスを維持します。
いくつかのアイデア
- ルールエンジンに必要なデータをフェッチさせます。これにより、さらに複雑さが増し、単一の責任原則に違反します(さらに…)。
- ルールエンジンがデータを取得する前にプロキシμsを実装します。
- ルールエンジンが必要なすべてのデータを一度にフェッチするために呼び出す「データフェッチャー」μsを実装します(複合照会)。
shopping-cart
されていますが、他のマイクロサービスのニーズに合わせて簡単に調整できます(これらはまだユーザー、製品、注文に関連しています)。ご覧のとおり、特にビジネスで適用する述語を選択できるため、同じ入力データが必要になります。カートの内容自体を除くすべてのデータは、他のマイクロサービスによって提供されます。データの取得自体は複雑ではありませんが、他の10個のマイクロサービスを呼び出して、ルールエンジンが期待する構造を維持する必要がある場合、複雑になります。