具有共享数据库的微服务

时间:2020-02-29 06:56:34

标签: architecture microservices

我已经构建了两个微服务,并且都具有对共享数据库的读写访问权限。一种服务创建/更新用户详细信息。另一个服务直接从数据库读取用户数据并生成报告。现在的问题是,第二个微服务是否由于某种原因不得不更新某些用户数据,我应该使用第一个微服务来更新用户数据还是直接从第二个微服务中更新数据库中的用户数据,因为它已经具有对共享数据库的写访问权。这种用例有最佳实践吗?

2 个答案:

答案 0 :(得分:1)

如果您有两个微服务需要读写相同的数据以实现其目标,那么问题就不在于您使用哪种技术(共享数据库连接或公开REST api),而是为什么会发生这种情况首先。

共享数据之前,请考虑以下两个选项:

  1. 为什么首先要使用两个单独的微服务?如果他们读取和写入相同的数据,那么他们可能会承担相同的责任,因此它们应该是单个微服务,而不是两个。

  2. 数据是承担一项责任还是更多责任?如果您对数据/数据库进行建模以使其承担两个职责,那么您不仅需要两个微服务,还需要两个数据库。我不知道您的用例,所以很难说,但是例如,如果您将产品价格和产品说明存储在同一张表中,那么定价和目录微服务都将共享数据库,而实际上,它们仅需要共享ProductId。

另一种可能性是您需要将写入模型与读取模型分开。在这种情况下,您可以让一个微服务控制导致模型发展(写入)的业务逻辑,而另一个微服务将存储为读取而优化的模型的“副本”。这种模式(CQRS)具有以下优点:

  1. 您可以使用与写入管道不同的方式来优化和缩放读取管道。

  2. 如有必要,可以向读取模型提供来自多个写入模型的数据(想象按名称,类别,价格,等级等对产品进行搜索和分类)。

答案 1 :(得分:0)

共享数据库模式被认为是一种反模式,因为您的微服务会相互纠缠,并且两者都将取决于您的单个数据库。

通过将api放在控制流程的服务之上,可以让其他服务通过其端点收集信息。这样可以使您更好地隔离。

基本上,这可以解决您的问题。