问一个系统设计的问题

2020-09-05 16:21:52 +08:00
 MeloForsaken

目前有一个 springboot 的业务项目,打个比方叫做服务 A 。

现在需要在这项目 A 的数据基础上,出一些报表,由于可能需要频繁的更改代码并更新,所以打算再起一个服务 B 。

现在的问题是怎么让 B 调用 A 的数据,RPC ?还是把 A 的 Mapper 和 POJO 转移到公共的 module ?还是在服务 B 上单独重新写 Mapper 和 POJO ?

1993 次点击
所在节点    程序员
10 条回复
519718366
2020-09-05 16:39:42 +08:00
最简单的快速迭代方式就是,a 服务直接出相关服务,B rpc 调用。

有没有必要把相关的 dao 抽成单独模块,就看你们的划分了
firefox12
2020-09-05 17:09:34 +08:00
RPC, 高内聚,A 就负责它的数据和逻辑,B 就复制 A 的数据里变报表。
limuyan44
2020-09-05 18:39:58 +08:00
你说的前 2 种方案 b 服务上线 a 服务难道不跟着上线吗,哪天业务新增一个字段不是从 a 服务频繁上线变成了 ab 服务频繁上线了。
cassyfar
2020-09-05 18:54:18 +08:00
A 的 mapper 和 pojo 移到公共的 module 来。不要通过 A 拿数据。。。因为业务逻辑上,A 和 B 是完全独立的。
shizepeng
2020-09-05 19:14:16 +08:00
一个好的系统设计者应该要多角度去综合考虑问题,如果你选择 RPC 方式,那么维护成本肯定低,但是可扩展性不强,系统耦合性高,而且 A 的改造升级会不会影响 B 的正常运转,系统之间的耦合性强。

如果采用 B 方案,那么维护成本高容易出错,但是可扩展性强,耦合性低,生产活动、升级改造过程中不会互相干扰。

各有优劣,没法抉择,这时候就看需求,需求很重要,仔细阅读需求后,再来考虑问题。如果对生产活动的稳定性要求高,对可扩展性要求强,那么采用 B 方案,反之,采取 A 方案。
lecher
2020-09-06 00:16:44 +08:00
问题是如何满足频繁变更的报表需求。
成本最低的方案其实是用专门的报表基础设施解决这几个问题:
1. 报表计算逻辑的声明
2. 报表同步数据

自己另起服务定制写统计是成本最高的方案,不管你是 rpc 还是定制写计算逻辑。
两个业务其实可以通过数据库解耦。
不管你有多少业务项目:A1 、A2 、A3……
业务项目只负责自己的业务数据读写的约束。

报表业务应该只关注数据库的数据是什么样,如何通过数据库的数据计算出需要的报表,clickhouse 、tableau 、superset 这类开箱即用的报表解决方案不是更合适吗。
lazyfighter
2020-09-07 11:14:50 +08:00
B 依赖 A,也解决不掉,需求来了,不改 A 啊
teddy2725
2020-09-07 11:17:32 +08:00
再搞个 B 数据库以 A 的数据做数据源,联机分析和联机事务场景不同,表结构也需要不一样
ychost
2020-09-07 14:43:25 +08:00
B 去调用 A 就行了,用 dubbo 之类的也方便
lix7
2020-09-07 19:12:37 +08:00
直接 mono-repo 复用代码,但是分开部署

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704481

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX