【发布时间】: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