目前,当我构建应用程序时,我将它们构建为一个大型的单块应用程序,这样所有东西都驻留在一个编译好的程序集中,数据驻留在一个SQL数据库中(使用了redis/elasticsearch作为支持)。就我的目的而言,这是比较好的工作方式,但我想转向设计微服务架构。然而,当您的服务/数据库分布在多个服务器上时,我很难理解如何维护任何关系完整性。
观察以下图表:
在本例中,标识服务与订购服务是分开的。显然,Identity Microservice需要从数据库中获取用户数据,内容包括名字、姓氏、密码、角色/声明等。
显然,系统的其他部分与用户有关系。例如,每个订单都可能与下订单的用户绑定。在传统的SQL数据库中,只需有一个外键来保持关系的完整性。使用上面的图表,"Ordering“看起来完全独立于用户数据库。在这种体系结构中如何维护关系完整性?订购服务是否只是用用户的ID插入“订单”记录,而没有在任何地方保持任何关系?如果该用户随后被从系统中删除,会发生什么情况。在这个特定的示例中,您可能仍然希望维护订单数据,但是在删除用户时,需要删除与该用户相关的数据。在一个微服务体系结构中,这一切似乎都是手工完成的,有很大的出错空间。
发布于 2018-11-10 09:08:35
订购服务是否只是用用户的ID插入“订单”记录,而没有在任何地方保持任何关系?
是的
这里要记住的是,尽管这些服务被称为“微”,但它们往往是相当大的。您将有大量紧密耦合的对象,例如地址或它们中的任何内容。
任何系统都会选择一个范围,上面写着“好吧,我不关心100年前的客户家谱,也不在乎他们开的是哪种类型的车”。
Microservice体系结构要求您考虑整个系统可能不是单个范围。
当您习惯于编写单点或大型关系数据库时,立即的想法是“但我需要客户和订单之间的引用完整性!”但现实往往是你没有。
你可以想象出一整吨与维护客户/客户系统相关的逻辑,而这实际上与你的系统是一个电子商务网站、一个留言板、还是一个税务系统或其他任何东西都没有关系。
您希望能够在系统的该部分添加功能,而不必考虑购买商品或填写纳税申报表。
因此,在其他系统中,用户id的松散耦合是很好的,当然,在删除或丢失用户信息时,您需要小心。维护审计跟踪或复制关键字段(如名称和地址)到其他系统,如果这样做是明智的,例如在已完成的订单上,需要一个送货标签。
发布于 2018-11-10 05:37:41
发布于 2018-11-10 17:21:54
我认为您应该有一个入口点组件(可能,eshop webapp MVC)到您的miscroservices的生态系统中,它将扮演协调器的角色,当然,您的微服务可能会在http上进行协作,但是对于写操作,这种请求应该通过一个条目,而执行器必须确保用户的操作顺序(通过队列和操作状态),否则,当用户删除订单时(仅举一个例子),您可能会遇到问题,这就是为什么您必须保持这样的操作顺序才能获得身份。
您还可以将体系结构转换为事件驱动的体系结构,这也可以确保操作的顺序。
https://softwareengineering.stackexchange.com/questions/381279
复制相似问题