在不同的微服务之间连接表

Rob*_*nto 11 architecture microservices

我仍然试图理解微服务架构.

分离不同应用程序(包括数据库)的想法让我很兴奋.但是,如果有两个微服务,例如产品和用户,我仍然感到困惑.产品和用户分别在其数据库中拥有表产品和用户.根据微服务的最佳实践,我们只能从服务中访问数据库.

问题是,让我们假设我们的产品表有user_id列.我们想做搜索产品,它也返回创建产品的用户的名字.这需要在产品微服务中的产品表和用户微服务中的用户表之间进行连接.你怎么处理这个?

小智 11

此类情况的最佳答案是 CQRS。维护用户和产品关系的物化视图。物化视图可以是任何在读取时提供低延迟的东西,比如 NoSql DB。每当 Command 通过其微服务更新 User 或 Product 时,相应的事件应生成并由管理此物化视图的其他服务捕获。该服务将用于获取您感兴趣的查询。请始终牢记,微服务架构相信最终一致性,这绝对不是一件坏事:)。希望这能回答您的问题。


小智 8

虽然我认为按照Jan建议的方式做这件事并没有什么不妥,我想补充说,差异微服务应该添加到你的系统中是不同的.

上面的服务隔离是我们在SOA世界中看到的很多东西,并且在没有提供太多价值的情况下,它变得过于复杂.

如果你,我理解它只是一个例子,需要查询连接到产品的用户 - 为什么要拆分服务?您最终为每个db-entity设计一个服务,而不是查看给定的需求,在我看来有限的上下文.

-Lars

  • 完全同意这一点,微服务对于微服务毫无意义. (2认同)
  • @Lars 这是一篇旧帖子,我现在已经多次遇到同样的情况了。我同意,如果服务边界不能得到适当的尊重,那么划分成不同的服务就没有意义。然而,在某些情况下,每项服务本身都具有相当大的复杂性和差异。在这些情况下,将服务放在一起并在单个 API 下紧密耦合会导致更多问题。找出“跨服务”查询的最佳策略是什么(不知道该术语是否有效)会很棒。 (2认同)

Jan*_*ert 6

您必须调用每个微服务并手动进行连接或将相关用户ID传递给每个服务.

UserMicroservice:

SELECT * FROM Users WHERE some condition is true
Run Code Online (Sandbox Code Playgroud)

获取用户列表,包括他们的ids.

ProductMicroserivce:

SELECT * FROM Products WHERE some condition is true AND userId IN (.........)
Run Code Online (Sandbox Code Playgroud)

因此用户和产品仍然可以在两个不同的数据库中,产品只需要具有userId的概念.

反过来也可以,ProductMicroserivce:

SELECT * FROM Products WHERE some condition is true
Run Code Online (Sandbox Code Playgroud)

解压缩所有UserIds然后调用UserMicroservice:

SELECT * FROM Users WHERE some condition is true AND id IN (.........)
Run Code Online (Sandbox Code Playgroud)

  • 所以我们使用api(Rest/http)互相调用服务? (2认同)