比方说,我们有一个 SIMPLE 电子商务系统,有两个独立的系统:库存管理系统(IMS)和订单管理系统(OMS)。假设IMS提供有关库存的信息(getItem,getItemQuantities等),OMS提供订购服务(startOrder,addItemToOrder,finalizeOrder等)
这两个系统使用不同的后端实现为Web服务。在OMS中,假设一个简单的模型,如:
public class Order {
private int orderId;
private List LineItem;
...
}
public class LineItem {
private int orderId;
private int itemId;
private int quantity;
private int subTotal;
....
}
在IMS中,假设一个类似的模型:
public class Category {
private int catId;
private List Item;
...
}
public class Item {
private int itemId;
.... (other attributes)
}
您可以轻松找出一个简单的db表结构来实现上述功能。
作为一个用例,请考虑客户将订单添加到订单中。此请求要求OMS进行多次服务/数据库调用:
从性能角度来看,这是否有意义?你能想到一个更好的方法吗?
[编辑]:作为后续,在用户向OMS询问订单详情的情况下,它只能返回orderId,以及每个包含itemId,quantity和subTotal的orderLineItem列表。客户实际上也想要项目的名称和描述。是否有责任将名称/描述转发给客户(通过IMS)或OMS对此负责?
答案 0 :(得分:1)
暂时忘记SOA。
您有两个独立的系统和至少一个需要对它们进行一致更新的常见操作。
您不仅要考虑检查库存,还要考虑减少库存,并且可能只有在添加订单行时才会正确。
您如何确保一致性?我们可以设计各种方法(2PC交易,记录保留,补偿交易,或批量对账的乐观工作),但在我看来SOA与否,Web服务与否,我们仍然需要解决这些问题。
显然,为了提高效率,我们希望减少系统各部分之间的通信次数,以便提供reuisite功能。因此提出了“检查和做”的模式。然而,至少在原始形式下,这种模式往往不能应对失败的路径。
最好提出一些短路。例如,我们实际上并未在添加订单行时检查库存。 (可能是用户界面已经显示了库存,因此已经进行了相对较新的检查)所以我们在订单最终放置时检查库存,然后告诉用户“无法做到”或“您可能需要等待对于某些位一两周,你想继续“。
通过狡猾,我们可以让许多操作只为一个服务调用更新一个后端系统。
答案 1 :(得分:0)
这可以在单个服务调用中完成,这可以对存储过程进行单个数据库调用。
答案 2 :(得分:0)
从性能的角度来看,我会做到这一点
验证orderId的服务。
一个名为ValidatePlaceInDetails的服务,它同时执行这两项操作 验证传入的itemId存在并根据传入的数量验证库存
用于将新记录插入表格的服务。
我们通过合并2和3减少了服务呼叫。
答案 3 :(得分:0)
我发现你所描述的系统没有任何问题,除了它们是分开的。
但是如果我们想象不能以不同的方式完成这个并且你担心性能,你总是可以实现某种缓存来减少数据库查找次数并存储整个内容缓存中的顺序也是如此。缓存的问题在于,在您提交订单时,必须执行一些更昂贵的数据库操作,以检查订购的商品是否实际有库存,或者只是删除不可用的商品。
有关可能的缓存解决方案,请查看memcached。
答案 4 :(得分:0)
由于这是一个SOA问题,我很好奇为什么要在应用程序和Web服务之间创建如此强大的依赖关系。
为什么不使用ESB,现在有一些开源的,可以让你只使用订单信息调用ESB,响应将是错误或订单号以及你需要的任何其他内容。
你抽象出其他一切,因为它照顾了我在ESB中的规则。
我正在尝试的一个ESB是:https://open-esb.dev.java.net/
优点是您可以更换Web服务,数据库或添加新规则,而无需更改应用程序中的任何代码。
如果您的应用程序已分发,这将非常有用。
理想情况下,您可以提供一些服务质量要求,因此VIP的订单可以比普通人更快地完成,新用户可以更快地进行前两次,这样他们就能看到您的速度有多快系统是。
通过添加ESB会带来性能损失,但是有一些好处,例如松散耦合,可能会弥补它,因为您现在已经不受ESB Web服务的wsdl之外的任何更改的影响。
答案 5 :(得分:0)
我只向IMS发出一个请求,要求检查项目X是否实际有库存。如果它不是有效项,IMS应返回一些结果代码,说明我请求了无效项。这样您就可以省去IMS的往返旅程。如果我要求的物品数量没有库存,那么我会期望另一个结果代码说明。