当前位置: 首页 > 知识库问答 >
问题:

是否应该使用数据库主键来识别跨微服务的实体?

郑富
2023-03-14

给定我有两个微服务:服务A和服务B。

服务A拥有完整的客户数据,服务B需要该数据的一小部分(例如,它通过一些批量加载从服务A获得)。

这两种服务都将客户存储在自己的数据库中。

如果服务B随后需要与服务A交互,例如获取额外数据(例如get/customers/{id}),那么它显然需要在两个服务之间共享的唯一标识符。

由于ID是GUID,我可以在服务B中创建记录时简单地使用服务A中的PK。因此两个PK都匹配。

然而,这听起来非常脆弱。一种选择是将“外部Id”(或“源Id”)存储为服务B中的一个单独字段,并使用该字段与服务a交互。这可能是一个字符串,因为有一天它可能不是GUID。

这方面有“最佳实践”吗?

使现代化

所以我做了更多的研究,发现了一些相关的讨论:

您应该在REST API URL中公开主键吗?

在REST API中向客户机公开数据库ID是一种不好的做法吗?

弹头作为主键

结论

我认为我试图在服务A和服务B中保持客户的两个主键相同的想法是错误的。这是因为:

  1. 显然,PK是特定于服务实现的,因此它们可能完全不兼容,例如UUID与自动递增整数
  2. 即使您可以保证兼容性,尽管这两个实体恰好都被称为“客户”,但它们实际上是两个(可能非常不同)概念,服务A和服务B都“拥有”自己的“客户”记录。不过,您可能想做的是跨这些服务同步一些客户数据

因此,我现在认为,任何一个服务都可以通过其自己的唯一id(在我的例子中是PK GUID)公开客户数据,如果一个服务需要从另一个服务获取额外的客户数据,那么它必须存储另一个服务标识符/密钥并使用它。因此,本质上回到我的“外部id”或“源id”概念,但可能更具体地说是“服务B id”。

共有2个答案

上官自明
2023-03-14

好吧,如果你对价值对象有一个想法,商业ID将更适合设计。

DDD专注于业务,纯UUID/自动增量ID无法呈现它。

使用商业意义ID(UL ID),如客户ID,而不是简单的ID。

濮书
2023-03-14

我认为这在一定程度上取决于数据源和您的设计。但是,我要避免共享的一件事是主键,它是指向外部服务的GUID或自动递增整数。这些是您服务的内部细节,而不是其他服务应该依赖的内容。

我宁愿有一个外部id,这是更了解其他服务,也许是整个业务。它可以是唯一的客户号、订单号或保单号,而不是id。您也可以将其视为“商业id”。还需要记住的一件事是,外部id也可以暴露给最终用户。因此,它是一种在整个组织和服务中普遍存在的识别“实体”的方法,无论您是否有事件驱动的设计或您的服务是否通过API进行通信。我只会将DB ID公开给基础设施或存储库。除此之外,它只是一个业务/外部id。

 类似资料:
  • 微丝网应该可重复使用吗?对于可重用,我并不意味着共享特定于域的模型。 我的意思是,为一个应用程序创建的微服务是否应该在另一个应用程序中重用?如果它们可以在应用程序中重用,是否足够? 分离微服务的最佳方法是什么。从我的观点来看,一旦一个微服务调用另一微服务,它就会紧密耦合,这意味着它不容易(无需修改)被提取并放入另一个没有它所引用/来自的相同服务的微服务应用程序中。 在我看来,要使它们脱钩,有以下几

  • 问题内容: 在Java的JPA中(通过EmbeddedId或IdClass注释)似乎仅对复合数据库键提供第二类支持。当我阅读复合键时,无论使用哪种语言,人们都会碰到它们,因为这是一件坏事。但是我不明白为什么。如今,组合键是否仍然可以使用?如果没有,为什么不呢? 我发现一个同意我的人:http : //weblogs.sqlteam.com/jeffs/archive/2007/08/23/comp

  • 问题内容: 我们目前正在为一家专业公司内部实施类似于CRM的解决方案。由于所存储信息的性质以及信息的不同值和键,我们决定使用文档存储数据库,因为它非常适合此用途(在这种情况下,我们选择MongoDB)。 作为此CRM解决方案的一部分,我们希望存储实体之间的关系和关联,例如包括存储利益冲突,股东,受托人等的冲突。以最有效的方式将所有这些实体链接在一起,我们确定了“关系”的中心模型是必要的。所有关系都

  • 虽然每个微服务通常都有自己的数据,但某些实体需要在多个服务之间保持一致。 对于高度分布式环境(如微服务体系结构)中的这种数据一致性要求,设计的选择是什么?当然,我不想要共享数据库体系结构,即单个数据库管理所有服务的状态。这违反了孤立和不共享的原则。 我明白,微服务可以在创建、更新或删除实体时发布事件。对该事件感兴趣的所有其他微服务可以相应地更新各自数据库中的链接实体。 这是可行的,但是它会导致跨服

  • 如果一个微服务只知道它自己的领域,但是有一个数据流需要多个服务以某种方式交互,那该怎么做呢? 假设我们有这样的东西: 为论证起见,假设一个订单发货后,就应该创建发票。 我确实知道这可以被认为是高度基于意见的。但它也有具体的一面,因为微服务不应该做上述的事情。因此,必须有一个“根据定义它应该做什么”,这不是基于意见的。 开枪啊。

  • 我不清楚如何取回购买服务不保存的数据--例如:用户的全名。当试图通过购买用户名进行更复杂的搜索购买时,问题会变得更严重。 我认为,显然可以通过在两个服务之间同步用户来解决这个问题,方法是在用户创建时广播某种类型的事件(并在购买服务端只保存相关的用户属性)。在我看来,这远非理想。当你有数百万用户时,你如何处理这个问题?您会在每个使用用户数据的服务中创建数百万条记录吗? 另一个明显的选择是在用户服务端