【问题标题】:Microservices: Filtering across different services微服务:过滤不同的服务
【发布时间】:2020-05-05 11:02:52
【问题描述】:

在我当前的项目中,我们有两个具有两个不同数据库实例的微服务,它们都有引用相同底层资源的表(尽管名称不同),即服务中的资源表A 的 DB 称为 foo,而在服务 B 的 DB 称为 bar

使用两个服务发送写入,每个服务负责在更新/写入/删除时写入另一个服务(暂时忽略网络/数据库故障。)

每个服务负责资源的不同信息,因此每个表包含不同的列,其中包含相同资源的不同信息。例如:服务 A 具有属性 health_state,而服务 B 具有属性 [和列] archived

我们希望允许用户按两个服务列/属性进行过滤 - 即GET /foo?search="health_state='unhealthy' and archived='false'"。怎么做呢?

我们最初考虑让一个微服务成为另一个微服务的“前端”,并支持在A 中搜索这两种服务的字段。然后 A 会将相关搜索字段发送到B 并将结果加入A 的数据库中。如果B 的结果集很大,这是一个可能无法很好扩展的选项,这是因为A 需要all archived 资源(在上面的示例中)才能执行加入。此外,搜索查询的解析可能非常复杂。如果我们确实采用了这种方法,有没有关于如何大规模做到这一点的建议?

请记住,将我们的应用程序移植到 here 中提到的 CQRS 之类的东西似乎是一个巨大的变化(相应的数据库中目前有 10K+ 行)。

感谢您的回复!

【问题讨论】:

  • 为什么首先需要两种不同的服务?为什么不只有一个微服务来管理“资源”?如果由于某种原因需要 CQRS 方法可能是您的唯一选择。
  • @cool 我同意单体应用可能是一个不错的选择。但是这个架构是在我加入这个项目之前决定的。
  • 如果您确实有可扩展性需求,我建议您将它们组合起来,因为数据仍然很小(
  • 结合这两个服务或迁移到 CQRS - 我认为这两个选项现在都与我们无关。
  • UI 上也应该考虑可扩展性。如果您在 UI 上一次显示所有记录,那么 UI 上的设计似乎很糟糕,它看起来更像是一份报告,如果它是一份报告,您应该考虑轮询 API 以将连接的数据放入缓存的数据库中,保持刷新它并使用该数据源,但是您需要考虑更新缓存的频率。

标签: architecture microservices distributed-system distributed-transactions


【解决方案1】:

你也许可以看看 GraphQL。您可以将 2 个不同应用程序的输出拼接在一起以产生结果。这是一个众所周知的可扩展解决方案,您也可以在 graphql 服务器上应用缓存来提高性能。

https://graphql.org/ 是一个很好的起点。

我还建议您重新审视服务设计,因为对同一资源的过滤通常应该在同一服务中完成,除非它是通道服务。如果可以近乎实时地访问数据,那么在弹性搜索中对数据进行索引然后检索也是另一种选择。

【讨论】:

  • Graphql 部分具有误导性,因为它对实际问题没有任何好处。
  • 为什么不呢?您可以结合 API 和应用过滤器的输出。
  • 如果第一个 API 的输出返回 100 万行怎么办?
  • 我同意这可能是个问题,但如果不是呢?因此我建议重新审视设计,因为 CQRS 似乎是一个很大的变化。如果属性不经常更改/记录数较少,我认为具有良好缓存策略的 graphql 可以工作
猜你喜欢
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2019-11-15
  • 2018-02-20
  • 2021-03-31
  • 2014-01-08
  • 2020-06-16
  • 2018-11-26
相关资源
最近更新 更多