如何在微服务中处理公共数据
Howto handle common data in Microservices
我正在尝试找出关于微服务架构的一般理解问题。
例如,如果我有三个服务:
- 订购服务
- 产品服务
- 用户服务
并且每一项服务数据都需要连接到用户。那么哪个用户添加了产品,哪个用户订购了东西等等
所以我需要说“嘿订单服务,给我特定用户的所有订单”。这意味着在订单服务数据库中会有一个“用户 ID”列,对吧?但这只是一个与用户服务数据库中的用户数据无关的列,对吗?这是方法吗?
因此,万一用户被删除,订单服务可能需要询问是否还有该用户 ID etx 的订单。
所以问题是,是否有用户 ID 的列根本没有连接到用户 table,所以没有外键等,因为它们是完全不同的数据库?
非常感谢!
微服务的理念是您应该将它们视为独立的服务,它们只是很小——“微”。这在设计上意味着(逻辑上)独立的数据库。实际上,您可能会使用相同的数据库(例如,更简单、节省成本),但您会将 table 分开——服务之间没有外键。您还将避免在同一数据库事务中接触来自多个微服务的 tables。
注意:对于 NoSQL 数据库来说也是类似的 - 即使您使用相同的数据库,也至少要保持数据在逻辑上是分开的。
这意味着始终存在“最终一致性”——无法同时在多个微服务中删除一个对象,始终存在延迟。
这是处理此类用户和订单服务的一种方法:
- 用户 X 在订单服务中创建订单 Y
- 从订单服务获取 X 的订单将 return Y.
- 用户 X 已从用户服务中删除。 “用户已删除”消息被发送到消息代理(消息代理将其发送到正在侦听此类消息的所有微服务)
- 从订单服务获取 X 的订单仍然会 return Y。您可以选择验证每次调用订单服务的用户,但这会带来服务之间额外调用的额外费用。在大多数情况下,我会信任会话 cookie 或承载令牌,而无需为每次调用重新验证它。
- 现在订单服务接收并处理用户 X 的“用户已删除”消息并删除 X 的所有订单
- 现在提取 X 的订单将 return 没有任何内容或“无效用户”
在此示例中,订单 table 可能有类似“user_id”的列,该列将映射到用户 table 的用户 ID。但即使 Order table(来自 Order 微服务)和 User table(来自 User 微服务)使用相同的数据库实例,它也不会被设置为外键。
我正在尝试找出关于微服务架构的一般理解问题。
例如,如果我有三个服务:
- 订购服务
- 产品服务
- 用户服务
并且每一项服务数据都需要连接到用户。那么哪个用户添加了产品,哪个用户订购了东西等等
所以我需要说“嘿订单服务,给我特定用户的所有订单”。这意味着在订单服务数据库中会有一个“用户 ID”列,对吧?但这只是一个与用户服务数据库中的用户数据无关的列,对吗?这是方法吗?
因此,万一用户被删除,订单服务可能需要询问是否还有该用户 ID etx 的订单。
所以问题是,是否有用户 ID 的列根本没有连接到用户 table,所以没有外键等,因为它们是完全不同的数据库?
非常感谢!
微服务的理念是您应该将它们视为独立的服务,它们只是很小——“微”。这在设计上意味着(逻辑上)独立的数据库。实际上,您可能会使用相同的数据库(例如,更简单、节省成本),但您会将 table 分开——服务之间没有外键。您还将避免在同一数据库事务中接触来自多个微服务的 tables。
注意:对于 NoSQL 数据库来说也是类似的 - 即使您使用相同的数据库,也至少要保持数据在逻辑上是分开的。
这意味着始终存在“最终一致性”——无法同时在多个微服务中删除一个对象,始终存在延迟。
这是处理此类用户和订单服务的一种方法:
- 用户 X 在订单服务中创建订单 Y
- 从订单服务获取 X 的订单将 return Y.
- 用户 X 已从用户服务中删除。 “用户已删除”消息被发送到消息代理(消息代理将其发送到正在侦听此类消息的所有微服务)
- 从订单服务获取 X 的订单仍然会 return Y。您可以选择验证每次调用订单服务的用户,但这会带来服务之间额外调用的额外费用。在大多数情况下,我会信任会话 cookie 或承载令牌,而无需为每次调用重新验证它。
- 现在订单服务接收并处理用户 X 的“用户已删除”消息并删除 X 的所有订单
- 现在提取 X 的订单将 return 没有任何内容或“无效用户”
在此示例中,订单 table 可能有类似“user_id”的列,该列将映射到用户 table 的用户 ID。但即使 Order table(来自 Order 微服务)和 User table(来自 User 微服务)使用相同的数据库实例,它也不会被设置为外键。