为什么每个微服务要有自己独立的数据库?

2022-05-19 09:41:45 +08:00
 lotusp

分享一下自己写的一篇文章:为什么每个微服务要有自己独立的数据库?

在微服务架构下,推荐每个服务要有自己独立的数据库,甚至现在一些企业会做微服务架构成熟度评估,其中有一条是数据库是否是每个 service 一个,甚至还要求每个数据库要独立部署。

最近跟一个同事讨论 EDA 的场景下数据怎么管理,不知道大家有没有什么经验?欢迎分享,谢谢

11344 次点击
所在节点    程序员
63 条回复
NoKey
2022-05-19 11:44:15 +08:00
@fancy2020 分布式事务,原理忒麻烦
NoKey
2022-05-19 11:45:06 +08:00
服务分拆,数据库分拆,全部独立一套,这样的项目,一般公司 hold 不住
Actrace
2022-05-19 11:57:03 +08:00
小公司做这套。。。快醒醒,公司已经没了。
asanelder
2022-05-19 13:00:17 +08:00
@fancy2020 #13 分布式事务
clf
2022-05-19 14:11:39 +08:00
简单点按业务分表,按大业务分库,整体连接的都是一个数据库集群。服务不允许操作数据库里非自己的数据,其实也差不多达到了要求了。
xinJang
2022-05-19 14:24:02 +08:00
@Actrace 你这句逗乐我了。我中山面了几个问微服务的,我就好家伙,你公司就没几个人,还微服务。
事实上我也没做过微服务
dddd1919
2022-05-19 14:24:41 +08:00
做评估的跟卖软硬件的是不是有利益输送。。。。。
lscexpress
2022-05-19 14:29:03 +08:00
@EvaCcino 比喻的很好,下次不要再比喻了。既不懂微服务,也不懂现在房子并非都是商品房。
walkerliu
2022-05-19 14:35:46 +08:00
@dddd1919 一个服务一个数据库,又不是一个服务一个 instance 实例
zcf0508
2022-05-19 14:37:06 +08:00
公司 1 个前端 3 个后端,系统却有 20 多个,数据到处冗余还不一致,天天修数据。
klo424
2022-05-19 15:16:02 +08:00
@xinJang #26 我一个人搞微服务架构搞了半年😂
xinJang
2022-05-19 15:20:07 +08:00
@klo424 我我我不会啊 主要也不知道的它实际场景
timethinker
2022-05-19 15:32:28 +08:00
给微服务一个定义吧,普遍认为的微服务就是把什么订单、用户等等系统拆分出来当作一个独立的项目来开发和部署,但是需要注意这个“拆分”只是逻辑上的。

比如我在开发的时候将所有的服务都放在一个项目里面,然后最终只打包出一个可执行文件来,分别在 ABC 机器上面进行部署,然后在 nginx 上面针对请求的 URL 路径转发到不同的机器上。我可以在 ABC 机器上面都分别配置不同数据库,毕竟这台机器只负责部分子集,只会操作部分的数据表,这样一来出现的一个问题就是 ABC 之间数据不互通了,比如订单需要查询用户信息,调用 UserService ,UserService 将不会查询到用户数据,因为这些数据存在于另一台机器和另一个数据库上,一种办法是 ABC 三台机器使用同一个数据库,这样可以解决数据互通的问题。注意自始至终我没有使用到 RPC 以及消息队列,我只是将同一个程序部署到了三台机器上,每一个机器负责部分的 URL 请求,你说这算不算是微服务呢?

如果你认为不算,我们可以改造一下,当某一个机器调用 XXXService.doSomething()的时候,实现不再是通过 JVM 进程内直接调用对象方法,而是通过构造 HTTP 请求另外一台专门负责这服务的机器来进行处理,这样一来,我们就可以将 ABC 三台机器又恢复到使用各自独立的数据库。如果我们拆分得足够好,三台机器应该至始至终只会生产和查询自己负责的那几张表。你说这算不算是一种微服务呢?

注意不管我如何部署,我们的开发结构仍然是一个单体的大项目,所有的代码在变更以后都需要重新打包然后部署到三台机器上面,但是如果我只修改了 A 机器负责的功能,我可以只更新 A 机器那一份,只要接口没有变动,其他两台机器仍然可以正常请求。

既然 ABC 都只负责部分功能,那为什么不在开发的时候就建立 3 个项目呢?这样岂不是更加清晰吗?的确可以这么做,但是我想说的是这样并不是必须的,或者说这不是重点,那么重点是什么?重点就是你如何确定这是 3 个项目而不是 4 个或者 5 个呢?是根据有 3 台机器我们就得有 3 个项目吗?所以重点就是如何找到进行拆分背后所隐含的那些逻辑,这些逻辑就是你的业务组织方式。

早前,我以为开发微服务就是把各种 Service 拆分出来当作一个独立的进程,使用独立的数据库,然后通过 RPC 进行相互调用,成功的把的注意力集中到了各种注册中心,网关,配置中心等等令人眼花缭乱的东西上面去了。在经历各种各样的填坑之后,回过头来再想一下,如果我只是作为一名开发,真的有必要去了解这些东西吗?我把大量的时间浪费在了去研究这些鬼东西上,反而把应该排在第一位的需求给丢到了一边。当服务网格和容器化出现以后,我对微服务这个词有了一些不一样的定义,说到底微服务终究不过是一种部署策略,它不是什么开发架构,它只是一系列指导如何正确开发服务的约定和理念,有了这些理念,我们就可以更容易的开发出适配部署运维的应用服务。微服务的终极目标,不是教我们如何用什么开发框架,用什么中间件,而是为了实现如何使资源利用得更加合理,更加有弹性,更加可伸缩。
dddd1919
2022-05-19 15:50:04 +08:00
@walkerliu 所以多服务会用到更多或者性能更高的机器,至少考虑去单点的情况,总归要吃更多的资源
vhwwls
2022-05-19 18:08:56 +08:00
@lscexpress #28 哈哈哈哈 老哥说的太对了
Actrace
2022-05-19 19:56:41 +08:00
@xinJang 我不是嘲讽微服务,我主要是嘲讽 CTO (如果有的话)。有时候真的是笑死。
siweipancc
2022-05-20 09:10:41 +08:00
产品:我要点数据,你把两个微服务的数据库同步一下就好了。
大部分的需求跟基础架构不会考虑系统设计,各怀鬼胎
dianso
2022-05-20 09:12:30 +08:00
因为数据库必须酱紫
nothingistrue
2022-05-20 11:10:55 +08:00
@LowBi #4
@yumerdev93 #5

微服务首要解决的是业务解耦,性能是其次。要业务解耦首先要做的是去关联,不去关联就不要做微服务。去关联的方法多得很,就是门槛比较高(其实门槛本身不高,而是 Sun 带起来又被国内发扬光大的"J2EE——>三层架构——>CRUD”风格,把门直接给隐藏了)。
tairan2006
2022-05-24 16:43:30 +08:00
拆分数据库是为了性能,如果你的量级不够没必要拆分。

其实中小公司直接上 TiDB 这种分布式数据库更简单。

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

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

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

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

© 2021 V2EX