【问题标题】:Linking data in java microservices in a database per service implementation在每个服务实现的数据库中链接 Java 微服务中的数据
【发布时间】:2018-08-20 19:11:18
【问题描述】:

我正在构建一个 java/spring 微服务,其中每个服务都有自己的数据库。假设我有一个用户服务,它将用户信息存储在一个表中,一个订单服务仅存储订购者的用户名,如下所述:-

User Service (UserService Database - User Table )
id     firstName    lastName     username     age 
1       Chris        Brown       c.brown      20
2       John         Doe         j.doe        25

并订购如下服务

 Order Service (OrderService Database - Order Table )
    id     username    productName     productPrice     OrderDate 
    1      c.brown       Sony Mic       100$            20-08-2018
    2       j.doe       Television      j.doe           11-07-2018

问题是在列出订单时从用户服务获取名字和姓氏的最佳方法是什么。我知道微服务应该通过 Rest API 进行通信,但是如果我有 1000 个有订单的用户,我将不得不循环 1000 次以获取 firstName 和 lastName 或将用户名作为数组,这可能是昂贵的活动。

我已阅读有关使用 CQRS 和事件源的信息,但不确定如何在这种情况下最好地应用它。

【问题讨论】:

  • 如果服务在同一个数据库实例上运行,您可以通过用户名加入(确保字段在两个表中都有索引)或在订单数据库中保留一些名字/姓氏的副本,否则使用任何缓存首先加载用户/姓氏。
  • OrderUser 是单独的微服务吗?
  • @MehrajMalik ,是的,单独的微服务和单独的数据库
  • @GeorgyGobozov ,感谢您的反馈,会考虑这种方法..

标签: java spring spring-boot microservices cqrs


【解决方案1】:

如果您想构建一个可扩展且有弹性的应用程序,您的微服务不应该从一个到另一个进行同步调用(您可以阅读The Art of Scalability 书)。

这意味着当微服务收到来自其客户端的请求时,它应该已将所有数据收集到其本地存储中。在您的情况下,您有两种可能性:

  1. firstNamelastName 列添加到Orders table
  2. 创建另一个表,用户具有idfirstNamelastName 列,并在向客户端返回数据时创建join

要使复制的信息最终与源(用户服务)保持一致,您可以使用以下技术之一:

  1. 有一个cron 作业,它获取所有需要的用户信息并替换所有firstNamelastName 列。
  2. 使用集成事件;在 CQRS/事件溯源架构中,您已经拥有域事件 - 您可以订阅这些事件。如果您没有 CQRS 而是一个简单的架构,那么您可以向数据库添加触发器,将低级别的突变事件(行创建/更新/删除)推送到订阅的服务。有关更多选项,您可以阅读 Edson Yanaga 的 Migrating to Microservice Databases

【讨论】:

    【解决方案2】:

    Order Service 可以在其数据库中保留有限用户信息(在您的情况下为名字和姓氏)的影子副本(使用事件溯源),并且可以自行构建具有有限用户信息的 Order 对象。

    【讨论】:

    • 嗨 S.K,感谢您提供有用的反馈。让我研究您提出的解决方案。
    【解决方案3】:

    理想情况下,应该有一个REST 调用来从其他MS 获取数据。

    但是,如果这些调用非常昂贵,您应该考虑更改数据库设计并将这些所需数据放在一个普通的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2018-06-04
      • 1970-01-01
      • 2019-05-03
      相关资源
      最近更新 更多