单体到微服务
Monolithic to Microservice
我有一个单一的应用程序,我正在尝试将其转换为基于微服务的应用程序。
方法一:-
- 数据库仍然保持不变,但会有多个微服务连接到同一个数据库
方法二:-
不同模块的不同微服务,每个微服务都会有自己的数据库。
但是,每个模块都需要用户数据(Table -> 用户)。
说,我们要分成 4 个模块。管理模块、计费模块、预约模块、库存模块
这里,例如:- 管理模块、预约模块和计费模块需要用户数据。对于约会模块,某些约会查询需要与其他数据库中的用户 table 连接。
如何处理?
首先,你应该考虑你是否真的需要微服务架构,因为只有当微服务非常独立时,你才能从这种架构中获益,我的意思是如果它们之间的连接很少他们。
说到这里,第一种方法是完全不可取的,因为微服务架构的关键是微服务应该完全解耦,如果它们共享相同的数据库 + 模式 + tables 所需的更改其中之一将触发其余部分的更改,因此您将拥有一个分布式单体(两者都有最坏的情况)。
有两种可能的解决方案。
其中之一是每次需要用户信息时调用用户服务,不好的部分是每次需要该信息时都必须调用,因此您依赖于其他服务,延迟会增加。
另一种解决方案是将用户table(仅需要的部分)复制到需要此信息的其他服务上,并使用消息异步更新它,例如,拥有kafka或其他消息队列当用户有任何更新时 table 用户服务将在特定主题中发布一条消息,其他服务将订阅该消息,因此他们可以相应地更新他们的用户信息。
这里的问题是最终一致性,我的意思是,其他服务不会立即看到更新。
正如你所看到的,这两个选项都有一些缺点,它们都是因为服务之间的通信,所以它们之间的通信越少越适合微服务架构
微服务不应该有公共数据库。我们应该避免同样的事情。
现在第二个选项似乎更接近于微服务。但它有一个缺点,那就是共享用户数据库。理想情况下,用户数据库应由单独的服务管理(用户数据的主要真实来源)。
现在问题来了,其他服务将如何获取用户数据。有 2 个选项:-
A. 其他服务会调用用户服务获取用户数据。
B. 其他服务将保留用户数据的副本。每当用户服务中的用户数据发生任何变化时,它都会发布一个事件,所有其他服务都会更新并复制相同的内容。
现在问题来了,你应该选择哪个选项。我更喜欢 A 选项(为用户数据调用用户服务)。如果存在性能限制并且使用缓存无法满足同样的要求,那么您应该选择选项 B。
我有一个单一的应用程序,我正在尝试将其转换为基于微服务的应用程序。
方法一:-
- 数据库仍然保持不变,但会有多个微服务连接到同一个数据库
方法二:-
不同模块的不同微服务,每个微服务都会有自己的数据库。 但是,每个模块都需要用户数据(Table -> 用户)。
说,我们要分成 4 个模块。管理模块、计费模块、预约模块、库存模块
这里,例如:- 管理模块、预约模块和计费模块需要用户数据。对于约会模块,某些约会查询需要与其他数据库中的用户 table 连接。
如何处理?
首先,你应该考虑你是否真的需要微服务架构,因为只有当微服务非常独立时,你才能从这种架构中获益,我的意思是如果它们之间的连接很少他们。
说到这里,第一种方法是完全不可取的,因为微服务架构的关键是微服务应该完全解耦,如果它们共享相同的数据库 + 模式 + tables 所需的更改其中之一将触发其余部分的更改,因此您将拥有一个分布式单体(两者都有最坏的情况)。
有两种可能的解决方案。 其中之一是每次需要用户信息时调用用户服务,不好的部分是每次需要该信息时都必须调用,因此您依赖于其他服务,延迟会增加。
另一种解决方案是将用户table(仅需要的部分)复制到需要此信息的其他服务上,并使用消息异步更新它,例如,拥有kafka或其他消息队列当用户有任何更新时 table 用户服务将在特定主题中发布一条消息,其他服务将订阅该消息,因此他们可以相应地更新他们的用户信息。
这里的问题是最终一致性,我的意思是,其他服务不会立即看到更新。
正如你所看到的,这两个选项都有一些缺点,它们都是因为服务之间的通信,所以它们之间的通信越少越适合微服务架构
微服务不应该有公共数据库。我们应该避免同样的事情。
现在第二个选项似乎更接近于微服务。但它有一个缺点,那就是共享用户数据库。理想情况下,用户数据库应由单独的服务管理(用户数据的主要真实来源)。
现在问题来了,其他服务将如何获取用户数据。有 2 个选项:- A. 其他服务会调用用户服务获取用户数据。 B. 其他服务将保留用户数据的副本。每当用户服务中的用户数据发生任何变化时,它都会发布一个事件,所有其他服务都会更新并复制相同的内容。
现在问题来了,你应该选择哪个选项。我更喜欢 A 选项(为用户数据调用用户服务)。如果存在性能限制并且使用缓存无法满足同样的要求,那么您应该选择选项 B。