现在的情况
我们正在微服务架构中实现(现在正在维护)在线购物Web应用程序。
要求之一是,企业必须能够对客户添加到购物车中的商品应用规则,以自定义其体验和最终订单。很显然,必须建立业务规则引擎,并且为此我们实现了一个特定的“微服务”(如果仍然可以这样)。
在过去的一年中,此规则引擎变得越来越复杂,需要越来越多的数据(例如购物车的内容以及用户信息,他的角色,他的现有服务,一些账单信息等)才能计算这些规则。
目前,我们的shopping-cart
微服务正在从其他微服务收集所有这些数据。即使部分资料已由所使用shopping-cart
,大部分时间主要还是用来提供规则引擎。
新要求
现在,需要其他应用程序/微服务来重用规则引擎以实现类似的需求。因此,在当前情况下,他们将必须传输相同类型的数据,调用相同的微服务并构建(几乎)相同的资源才能调用规则引擎。
照原样继续,我们将面临几个问题:
- 每个人(称为规则引擎)都必须重新实现对数据的获取,即使他们自己不需要数据也是如此。
- 对规则引擎的请求很复杂;
- 继续朝这个方向发展,我们将不得不在整个网络上传输许多请求的数据(想想μsA调用μsB调用规则引擎,但是A已经有了规则引擎需要的一些数据);
shopping-cart
由于所有数据的获取而变得巨大;- 我可能会忘记很多……
我们怎样做才能避免这些麻烦?
理想情况下,我们将避免为规则引擎增加更多的复杂性。我们还必须确保它不会成为瓶颈-例如,某些数据的获取速度相当慢(10 s甚至更多),因此我们实施了预提取,shopping-cart
以便在调用规则之前数据更有可能存在引擎,并保持可接受的用户体验。
一些想法
- 让规则引擎获取所需的数据。这将增加它的复杂性,违反了单一责任原则(甚至更多……);
- 在规则引擎获取数据之前实施代理μs;
- 实施规则引擎调用的“数据获取程序”μs,以一次获取其所需的所有数据(复合查询)。
shopping-cart
,但我们可以很容易地使其适应其他微服务的需求(它们仍然与用户,产品和订购有关)。正如我们所看到的,他们将需要相同的输入数据,尤其是因为企业能够选择要应用的谓词。除了购物车内容本身之外,所有其他其他微服务都提供了数据。数据的获取本身并不复杂,但是当您必须调用约10个其他微服务并维护规则引擎期望的结构时,获取数据就变得很复杂。