面向微服务架构的分布式数据库设计风格

Distributed database design style for microservice-oriented architecture

我正在尝试将一个单体应用程序转换为面向微服务的架构风格。后端我正在使用 spring , spring 引导框架进行开发。前端我正在使用 angular 2。并且还使用 PostgreSQL 作为数据库。

这里我的困惑是,当我将我的数据库设计为分布式时,根据功能它可能包含 5 个数据库。意思是我是按照垂直分区来设计的。然后我想实现微服务间的通信服务来实现整个功能。

我想的另一种方式是水平分割当前结构。所以我的域是基于一些教育大学。所以一半的大学都在一个数据库下,剩下的将在另一个数据库下。并按二区部署服务(二为两套大学)。

目前我决定继续使用最后提到的方法。我对这些类型的任务不熟悉,因为它指的是一些架构任务。我也是这个微服务和分布式数据库世界的初学者。有人会确认我的方法可以解决我的问题吗?我可以继续我的第二种方法——根据域对象对数据库进行水平分区吗?

Currently I am decided to continue with the last mentioned approach.

如果您想要数据库的水平可伸缩性(针对越来越多的客户端连接进行扩展),您最好使用旨在作为可伸缩的分布式系统工作的技术。类似于 CockroachDB or NoSQL。例如,Cockroachdb 内置了数据分片和复制,并允许您根据需要通过添加服务器节点进行扩展。

when I am designing my databases as distributed, according to functionalities it may contain 5 databases

听起来您的总体想法是正确的 - 按域功能拆分。这是一个 link 到 关于微服务的一般数据库设计。

在微服务世界中,每个微服务都拥有一组功能以及由这些功能操作的数据。如果一个微服务需要另一个微服务拥有的数据,它不能直接访问另一个微服务的数据库maintained/owned,而是调用另一个微服务公开的API。

现在,关于数据的放置,有多种选择 - 您可以将微服务拥有的数据存储在 NoSQL 数据库中,例如 MongoDB、DynamoDB、Cassandra(这实际上取决于微服务的 use-case) 或者您可以在 SQL 数据库的单个实例中为每个 micro-service 设置不同的 table。但请记住,如果您选择具有多个 table 的 SQL 数据库的单个实例,那么不同微服务拥有的 table 之间将没有连接(基本上没有交互)。

我建议您从小处着手,然后在系统使用量增长时考虑数据库扩展问题。

Can I continue with my second approach - Horizontal partitioning of databases according to domain object?

暂时是,如果在此基础上您能够扩展当前系统以满足您的需求。

现在让我们考虑一下为什么首先要将微服务作为一种开发风格。

  1. 小组件 - 更易于管理
  2. 可独立部署 - 持续交付
  3. 多种语言
  4. 代码是围绕业务能力组织的
  5. 和.....

迁移到微服务时,不应让多个服务直接从彼此的数据库读取数据,这会使它们紧密耦合。

一个服务应该完全不知道另一个服务是如何设计其内部结构的。

现在,如果您想转向微服务并充分利用它,您应该像您所说的那样进行垂直分区,并且服务可以相互通信。

此外,在转向微服务的过程中,您还会遇到很多其他问题。我尝试编译如何在这个 link 上开始微服务。

How to separate services which are reading data from same table:

现在让我们首先创建一个虚拟示例:我们有三个服务 Order 、 Shipping 、 Customer 都是三个不同的微服务。

以下是多个服务需要来自同一 table 的数据的方式:

  1. 服务一需要从其他服务读取数据以进行诸如验证之类的事情。

订单和运输服务可能需要来自客户服务的一些数据来完成他们的操作。

例如:在下订单时,将使用客户 ID 调用订单服务 API,现在订单服务可能需要验证其是否为有效客户。

一种方法数据库级暴露——不推荐——使用相同的客户table——将订单服务绑定到客户服务Impl

另一种方式,调用其他服务获取数据

变化 - 1 调用客户服务来检查客户是否存在并获取一些客户数据,如名称,并将其保存在订单服务中

变化 - 2 在下订单时不验证,在 OrderPlaced 事件中从客户服务异步检查并在需要时验证和更新订单状态

我建议根据您想要的一致性调用其他服务来获取数据。

  1. 在某些用例中,您希望在来自多个服务的数据之间进行单一事务处理。

例如:删除客户。您可能希望客户的所有订单也应该被删除。

在这种情况下,您需要处理最终一致性,服务一会引发一个事件,然后服务二会做出相应的反应。

现在如果这回答了你的问题而不是确定,否则请指定在哪种情况下多个服务需要调用另一个服务。

如果还没有解决,你可以发邮件到puneetjindal.11@gmail.com,我会回复你的