Database design 如何在微服务中处理公共数据

Database design 如何在微服务中处理公共数据,database-design,service,architecture,microservices,Database Design,Service,Architecture,Microservices,我试图找出一个关于微服务架构的一般理解问题 例如,如果我有三项服务: 订单服务 产品服务 用户服务 并且每个服务数据都需要连接到用户。那么哪个用户添加了产品,哪个用户订购了东西等等 所以我需要说“嘿,订单服务,给我一个特定用户的所有订单”。这意味着在订单服务数据库中会有一列“用户ID”,对吗?但那只是一个与用户服务数据库中的用户数据无关的列,对吗?这样做吗 因此,如果用户被删除,可能需要询问订单服务是否仍有用户id为etx的订单 所以问题是,是否有用户id的列根本没有连接到用户表,所以没有外

我试图找出一个关于微服务架构的一般理解问题

例如,如果我有三项服务:

  • 订单服务
  • 产品服务
  • 用户服务
并且每个服务数据都需要连接到用户。那么哪个用户添加了产品,哪个用户订购了东西等等

所以我需要说“嘿,订单服务,给我一个特定用户的所有订单”。这意味着在订单服务数据库中会有一列“用户ID”,对吗?但那只是一个与用户服务数据库中的用户数据无关的列,对吗?这样做吗

因此,如果用户被删除,可能需要询问订单服务是否仍有用户id为etx的订单

所以问题是,是否有用户id的列根本没有连接到用户表,所以没有外键等,因为它们是完全不同的dbs


非常感谢

微服务的理念是,你应该将它们视为单独的服务,它们很小——“微”。这在设计上意味着(逻辑上)独立的数据库。实际上,您可能会使用相同的数据库(例如,更简单,节省成本),但您会将表分开-服务之间没有外键。您还可以避免在同一个DB事务中接触来自多个微服务的表

注意:这与NoSQL数据库类似-即使您使用相同的数据库,也要保持数据在逻辑上至少是分开的

这意味着始终存在“最终一致性”——一个对象不能在多个微服务中同时删除,始终存在延迟

以下是处理此类用户和订单服务的一种方法:

  • 用户X在订单服务中创建订单Y
  • 从订单服务获取X的订单将返回Y
  • 用户X已从用户服务中删除。“用户已删除”消息发送给message broker(message broker将其发送给正在侦听此类消息的所有微服务)
  • 从订单服务获取X的订单仍将返回Y。或者,您可以为每个对订单服务的调用验证用户,但这会增加服务之间的额外调用的额外成本。在大多数情况下,我信任会话cookie或承载令牌,而无需为每次调用重新验证它
  • 现在,订单服务接收并处理用户X的“用户已删除”消息,并删除X的所有订单
  • 现在获取X的订单将不返回任何内容或“无效用户”

  • 在本例中,Order表可能有类似于“user_id”列的内容,该列将映射到用户表中的用户id。但即使Order表(来自Order microservice)和User表(来自User microservice)使用相同的DB实例,它也不会被设置为外键。

    只是快速阅读了一下,据我所知,共享同一数据库不会违反微服务体系结构,只要每个微服务拥有的数据是该数据库的私有数据。接下来,我相信需要某种形式的外键来将信息绑定到用户。在继续向订单服务请求与该特定密钥匹配的订单之前,该密钥可能必须由用户服务获取。请记住,我还没有开发微服务,所以这只是我对这个主题的初步理解。非常感谢,这正是对我想法的确认!