我正在构建面向服务的系统,具有多种服务和应用。 目前我不确定如何处理来自多个服务和数据库的资源之间的数据库引用。
例如,我有一个用户服务,我可以在其中定义所有用户及其角色。 接下来我有产品服务,我可以在这里定义我的产品,价格和其他信息。
我还有发票服务,用于创建发票。该服务将使用前两个服务的信息。它会将产品和用户链接到发票。现在我不确定最好的方法是什么?
我是否只保存从其他两项服务获得的产品ID和用户ID,而没有任何参照完整性?
如果我这样做,那么在生成报告时我会遇到问题,因为在生成时我需要向产品服务发送大量请求,以便在发票中获取产品的名称和价格。用户也一样。
我是否在发票应用程序中创建了一些表格产品,并在创建发票时存储产品名称和价格?
如果我采用这种方法,那么如果产品的价格或名称发生变化,我的应用程序中的数据会不一致吗?
对于这类问题是否有一些众所周知的模式,那就是最好的解决方案。
答案 0 :(得分:1)
数据库中的跨服务引用是多个Web服务之间数据完整性的常见挑战,特别是在我们讨论实时访问时。
您的案例有两种方法:
1-跨服务器的数据库复制
我认为您将每个应用程序托管在一个单独的服务器上,因此我可以将您的服务器命名为Users_server,Products_server和Invoices_Server。
在您的示例中,您的Invoice网络服务需要从用户&产品服务器,在这种情况下,您可以在Invoices_server上创建用户数据库和产品数据库的复制。
这样,您可以在同一台服务器上运行Join查询,并从多个数据库中获取数据。
查询示例:
SELECT *
FROM UsersDB.User u
JOIN InvoicesDB.Invoice i ON u.Id = i.ClientId
2-主数据库复制
第一步,您必须将所有数据库复制到一个主服务器,我们可以将其称为Base_server,它基本上包含来自所有服务的所有数据库。
然后,您可以为您的应用程序构建一个内部Web服务,以便在“一个呼叫”中提供所需的数据,这将回答您关于生成报告的问题。
换句话说,您将拨打一个鬃毛基本服务电话,而不是拨打2或3个电话到您的单独服务。
注意:作为后端开发人员,我们在构建基于捆绑包的大型应用程序时使用此组织作为最佳实践,我们创建一个基本捆绑包,然后创建依赖于基本捆绑包的service_bundle。
如果您的服务已经上线,我们可能需要有关您使用的技术和数据库类型的更多详细信息,以便为您提供更准确的解决方案。
答案 1 :(得分:0)
仅仅因为您使用SOA并不意味着您放弃了数据库完整性。在数据库设计需要的地方继续使用参照完整性。
在服务级别,您可以让每个服务负责返回其拥有的实体的身份信息。此标识信息可能是也可能不是数据库中的实际主键,但它将由服务的客户端使用,就好像它是实际的主键一样。
当客户想要创建发票时,它将调用用户服务并接收包含用户标识符的用户实体。它将调用产品服务并接收一组产品,每个产品都带有产品标识符。然后,它将调用Invoice服务创建发票,传递用户标识符和产品标识符。这可能会返回发票标识符。
答案 2 :(得分:0)
您可以(可能应该)在发票表中强制执行productId和userId外键的完整性。然后您的数据库确保引用的实体存在。报告应该连接表,而不是每个项的查询服务。我假设整个系统共享一个中央数据库。