【问题标题】:Querying multiple database in a microservice architecture在微服务架构中查询多个数据库
【发布时间】:2022-01-10 21:50:42
【问题描述】:

我目前正在开展一个使用微服务架构的项目。我对这种架构也有些陌生,并且有一些顾虑。我大致了解微服务的概念,以及我们如何为每个服务拥有一个数据库。这使我对如何从不同数据库中为特定用户提取数据感到困惑。

场景 假设我有一个 Users 和一个 Posts 服务,它们的架构是这样的

用户

const schema = {
  name: String
  id: String
  ...
}

发帖

const schema = {
  text: String
  user: Id // reference of the user who made this post.
}

现在在 UI 上,我想加载一组帖子和发布帖子的相关用户,我如何在发布相应帖子的 User 旁边获得 Post。我正在使用 MongoDB,如何填充存储在其他数据库中的数据?我也在使用 Kafka 处理异步操作,如何将 Kafka 用于此用例?还是有更好的方法来做到这一点? Post 的最终响应可能是这样的。

{
 text: 'Some random message',
 user: {
  name: 'John Doe',
  id: 1234
 }
}

另外,我知道我可以调用 User 服务来获取用户,然后调用 Post 服务来获取 Post 并将两个对象合并在一起,但是还有比这更好的选择吗基本上?我正在考虑在我想为用户进行多次查找的情况下,例如获取用户及其相关的帖子、消息等,我该如何处理这样的场景,我可以利用它们的任何技术来处理这样的情况吗?

提前谢谢你!

【问题讨论】:

  • 根据我的经验,对于不同的服务每次都使用两个不同的数据库并不是强制性的。您可以拥有使用相同数据库的服务,但可以使用不同的集合。您应该以两种服务可以独立工作或具有最少依赖性的方式拆分您的服务。在您的两个服务中,彼此高度依赖
  • @HandsomeCoder 我很清楚这一点,但我只是好奇这基本上是如何工作的。从昨天开始,我一直在做一些研究,并将 API 组合和 CQRS 作为查询数据库的模式,但是如果您对此有更多的线索,我会很高兴听到您的意见。谢谢

标签: javascript node.js mongodb microservices


【解决方案1】:

我认为您的问题是服务边界过于细化。我建议将您的服务与有界上下文 (https://martinfowler.com/bliki/BoundedContext.html) 对齐。例如,如果您有一个包含帖子和用户的“博客”服务,那么博客服务可以同时包含用于不同模型的 mongo 和关系数据库。

然后你要求服务“给我一个用户的帖子”,它负责将这些数据作为其逻辑的一部分进行组合。

如果您必须将它们分开(对于您遇到的确切问题,我不建议这样做),那么我会在帖子服务中保留一个轻量级的用户名缓存。

当您返回用户名时,使用它将用户名填充到帖子中。您可以使用事件、轮询、批处理定期更新缓存。或者只是在缓存未命中时查询用户服务。

在处理分布式系统时,您不能像在单体应用中那样依赖一致性和同步、稳定的通信。

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 2020-09-12
    • 1970-01-01
    • 2019-03-03
    • 2021-05-24
    • 2020-07-05
    • 2016-12-07
    • 2017-09-09
    • 2019-10-08
    相关资源
    最近更新 更多