假设我们有一个如下图所示的 SOA 基础架构,并且每个服务都可以在不同的主机上运行(这对于两个外网服务“网站”和“支付系统”尤其有效)。
显然我们有一个数据(持久性)层。假设它是通过 EJB + JPA 或类似的方式实现的。
如果我们想在不同的服务之间加入数据(在用户 UI 中),我至少看到了两种选择:
我们希望在 RDBMS 级别进行高效的 JOIN,因此我们有一个包(即 persistence.package),其中包含所有实体和会话外观(CRUD 实现),它们必须以某种方式共享(如何?)或为每个服务部署. 也就是说,如果我在 order 模式中更改某些内容,我必须重新部署这些包,从而在几乎所有内容之间引入紧密耦合。此外,数据库必须是唯一的和共享的。
为避免此类问题,我们为每个不同的服务(即 order.package)保留一个实体包,并让服务通过某种协议(soap、rest、esb 等)进行通信。所以我们可以在每个主机本地保存数据(不共享架构),我们不需要重新部署实体包。但是这种方法对于数据挖掘来说很糟糕,因为必须在多个服务之间搜索和返回相关数据的查询效率非常低(因为我们不能进行 SQL 连接)
对于上述问题,是否有更好/标准的方法?