3

假设我们有一个简单的电子商务系统,有两个独立的系统:库存管理系统 (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)
}

您可以轻松找出一个简单的数据库表结构来实现上述内容。

作为一个用例,考虑客户向订单添加商品。此请求需要 OMS 进行多次服务/数据库调用:

  1. orderId 的验证(可选,可以将此责任传递给数据库)。
  2. 调用 IMS 以验证传入的 itemId 是否存在(由于 diff DB 而需要)
  3. 调用 IMS 以根据传入的数量验证库存(由于 diff DB 而需要)
  4. 将新记录插入表中(必需)

从性能的角度来看,这有意义吗?你能想出更好的方法吗?


[编辑]:作为后续,在用户向 OMS 询问订单详细信息的情况下,它只能返回 orderId,以及每个包含 itemId、数量和 subTotal 的 orderLineItem 列表。客户实际上也想要项目的名称和描述。是否有责任(通过 IMS)向客户检索名称/描述,还是由 OMS 负责?

4

6 回答 6

1

暂时忘记 SOA。

您有两个独立的系统和至少一个需要对它们进行一致更新的通用操作。

您不仅需要考虑检查库存,还需要考虑减少库存,并且大概只有在添加订单行有效时才正确。

你将如何确保一致性?我们可以设计各种方法(2PC 事务,或记录保留,或补偿事务,或批量协调的乐观工作),但在我看来 SOA 与否,Web 服务与否我们仍然需要解决这些问题。

显然,为了提高效率,我们希望减少系统各部分之间为提供 reuisite 功能所需的通信次数。因此,已经提出了“检查并执行”的模式。然而,这样的模式,至少在它们的原始形式中,往往无法应对故障路径。

最好想出一些短路。例如,添加订单行时,我们实际上并没有检查库存。(可能 UI 已经显示了库存,因此已经进行了相对较新的检查)因此,我们在最终下订单时检查库存,然后告诉用户“无法执行”或“您可能需要等待一到两周的一些时间,你想继续吗”。

通过狡猾,我们可以使许多操作只为任何一项服务调用更新一个后端系统。

于 2009-10-16T16:27:02.850 回答
0

从性能的角度来看,我会这样做

用于验证 orderId 的服务。

一个名为 ValidatePlaceInDetails 的服务既可以验证传入的 itemId 是否存在,也可以根据传入的数量验证库存

用于将新记录插入表的服务。

我们通过合并 2 和 3 减少了服务调用。

于 2009-09-13T02:56:59.877 回答
0

我认为您描述的系统没有问题,除了它们是分开的。

但是,如果我们认为这不能以任何不同的方式完成并且您担心性能,您总是可以实现某种缓存来减少数据库查找的次数并将订单的全部内容也存储在缓存中。缓存的问题是,在您提交订单时,必须执行一个新的更昂贵的数据库操作,以检查订购的商品是否实际有库存,或者只是删除不可用的商品。

有关可能的缓存解决方案,请查看memcached

于 2009-09-16T19:06:05.390 回答
0

我只会向 IMS 提出一个请求,请求检查项目 X 是否真的有货。如果它不是一个有效的项目,IMS 应该返回一些结果代码,说明我请求了一个无效的项目。通过这种方式,您可以节省往返 IMS 的时间。如果我要求的商品数量没有库存,那么我会期待另一个结果代码说明这一点。

于 2009-10-01T07:03:53.480 回答
0

由于这是一个 SOA 问题,我很好奇您为什么要在应用程序和 Web 服务之间创建如此强的依赖关系。

为什么不使用 ESB,现在有一些开源的,可以让您使用订单信息调用 ESB,响应将是错误或订单号以及您需要的任何其他内容。

您将其他所有内容抽象出来,因为它处理了我在 ESB 中的规则。

我正在试验的一种 ESB 是:https ://open-esb.dev.java.net/

优点是您可以更换 Web 服务、数据库或添加新规则,而无需更改应用程序中的任何代码。

如果您的应用程序是分布式的,这将非常有用。

理想情况下,您可以提出一些服务质量要求,因此来自 VIP 的订单可以比普通人更快地通过,新用户可以更快地通过前两次,这样他们就可以看到您的系统有多快。

添加 ESB 会影响性能,但有一些好处,例如更松散的耦合,这可能会弥补这一点,因为您现在与 ESB Web 服务的 wsdl 之外的任何更改隔离。

于 2009-09-22T00:10:29.217 回答
0

这可以在单个服务调用中完成,该服务调用可以对存储过程进行单个数据库调用。

于 2009-09-11T00:47:32.597 回答