今天面试了一家外包公司,被问到分布式事务场景,我回答系统对接和微服务应用之间业务数据同步,直接被面试官打断结束面试了,想问下大家分布式事务是什么?
1
csys 127 天前 1
CAP ,共识算法,最终一致性,状态同步,补偿机制,SAGA
具体是什么取决于面试方想要听到什么,广义的狭义的,过去的现在的,都不一样 但是总之就是通过各种手段在分布式环境下确保“正确” |
2
Saber299 OP @csys 我理解的出现分布式事务问题是两个系统或者两个应用之间不在同一个事务导致的,使用的解决方案也都是基于异步调用,像 mq 、定时任务重试或者人工干预这些,你说的这些我只理解了最终一致性……
|
3
acrisliu 127 天前 3
https://pdai.tech/md/arch/arch-z-transection.html
不知道楼主面试的是什么岗位,这些八股文还是多准备下比较好 |
4
poltao 127 天前 1
才疏学浅,至今没用过分布式事务,我来个八股文链接,一起学习下:
https://github.com/doocs/advanced-java/blob/main/docs/distributed-system/distributed-transaction.md |
5
sagaxu 127 天前 1
经典八股了,虽然外包可能单 db 事务都用不上
|
6
yeqizhang 127 天前 via Android
四五年前我也问过这种问题,知道事务是什么就行了,没必要在意半桶水的面试官。分布式事务高级点就中间件那些实现了算法、论文的,你回答属于业务系统的那块也没错,还有多数据源、多节点的数据库涉及到的事务。
|
7
z1829909 126 天前 1
庙小妖风大, 水浅王八多.
|
8
c3de3f21 126 天前
庙小妖风大, 水浅王八多.
|
9
dododada 126 天前
外包要这些干嘛?真的用到分布式事务的,都是些难搞的大型服务,要保证最终数据一致性那种,还要允许一点延迟,外包不是随便挖坑么
|
10
me1onsoda 126 天前
事务当然是对数据库而言,跟应用没有直接关系
|
11
laminux29 126 天前
不懂分布式事务,写程序容易造成数据状态不一致。如果公司有的选,当然要选懂分布式事务的程序员。
举一个简单的场景,银行服务器的数据,分散在不同的物理机里。比如用户的借记卡数据在 IBM Server 上面,用户的信用卡数据在 X79 Server 上面,现在某用户通过借记卡,给自己的信用卡还款,思考一下,为什么各大银行的还款提醒,不是实时的,甚至有时候你晚上还款了,第二天银行还会给你发短信。通知你还款。 再举个更常见的场景: Server1 保存用户订单信息,Server2 保存商品宝贝详情页。你想想为什么淘宝订单、京东订单、拼多多订单,很多年前的订单,已经看不到当时的商品详情。 |
14
JackSlowFcck 126 天前
分布式事务是指在分布式系统中,涉及多个数据库或服务节点的事务操作。在传统的单体应用中,事务通常由单个数据库管理,比较容易实现事务的一致性。但在分布式环境下,由于数据和操作分布在不同的节点上,事务的管理变得更加复杂。
分布式事务通常具有以下特点: 1. 多个数据源:涉及多个独立的数据库或数据存储节点。 2. 跨服务调用:可能跨越多个不同的服务,每个服务可能有自己的事务管理机制。 3. 数据一致性挑战:确保在多个节点上的数据操作要么全部成功,要么全部回滚,以保持数据的一致性。 常见的分布式事务场景包括: 1. 微服务架构:不同的微服务之间进行数据交互和业务操作时,可能需要保证事务的一致性。例如,在一个电商系统中,订单服务和库存服务分别在不同的微服务中,当创建订单时,需要同时减少库存,这就需要分布式事务来保证两个操作的一致性。 2. 系统集成:多个独立的系统进行对接和数据同步时,也可能需要处理分布式事务。比如,企业内部的不同业务系统之间进行数据交换,要确保数据的完整性和一致性。 实现分布式事务的方法有多种,常见的有两阶段提交( 2PC )、三阶段提交( 3PC )、补偿事务( TCC )、基于消息队列的最终一致性等。这些方法各有优缺点,需要根据具体的业务场景和需求进行选择。 在面试中,如果被问到分布式事务场景,可以更加具体地阐述一些实际的业务例子,比如电商订单与库存的管理、银行转账系统中不同账户之间的资金转移等,并且可以简要介绍一下实现分布式事务的方法和思路。这样可以让面试官更好地了解你的知识深度和解决实际问题的能力。 ----- 不蟹 bro |
15
MoYi123 126 天前
真的有场景是不得不用分布式事务的吗?
我遇到过的情况都是对数据库的事务理解不行, 然后搞了一套恶心人的分布式事务上去. |
16
wWjd5V5L0636B5YV 126 天前
@laminux29 #13 数据状态一致性不是技术选型决定的么?
|
17
pangdundun996 126 天前
@laminux29 这个例子不太合适,银行这个是因为信用卡核心系统基本都是双信息系统,要等夜间跑批清算才能入账,跟分布式事务没关系
|
18
pangdundun996 126 天前
@csys 一般还是本地消息表和可靠消息用得多,3PC 、TCC 那些我是没见到落地过
|
19
dyllen 126 天前
数据同步也没什么大问题呀。就是多个系统之间的原子操作,要么成功要么失败,用处就是保证跨系统的业务操作数据的强一致性,和本地数据库的事务一个目的。
|
20
silencil 126 天前 1
八股文学习了一大堆,面试不到我学习的内容五分之一,工作内容涉及不到十分之一。
|
21
isno 126 天前
https://www.thebyte.com.cn/distributed-transaction/transaction.html
我这里介绍了 4 中分布式事务:BASE 、TCC 、SAGA 你可以看看。 |
22
wei2629 126 天前
我的理解简单来说就是原子性,只有成功和失败两种情况。
|
23
xueyuehua 126 天前
简单说就是一个 api 会经过多个微服务,其中一个挂了,导致数据对不上,比如给用户显示转账成功了,但是实际却扣钱了,但是钱没到另一个账号
|
24
mikasyou 126 天前 2
事务和线程很相似,但又不是很相似。得先认识到并发线程原子性和事务原子性的区别。
一个是不可打断,不可继续分割;一个是存在回退机制,不会出现”错误数据“。 其它的就可以利用你”如何安全的并发编程“相关理论,来认识分布式事务。就像一个变量参与多个线程,一个数据同步到多个数据库。 你是如何控制这个变量在多个线程同步的? - 锁:最简单的阻塞,同步 - 协程:有局限性但很合适的调度 - 事件/回调:可用但也仅仅可用 你又是如何控制这个服务在多个数据库保存操作中不会部分成功,部分失败的? - 多个事务当然也可以阻塞:一致性拉满,可用性降低,与线程锁的特性高度一致。 - 多个事务当然也可以协作:可用性提高,一致性降低。倾斜程度根据协作方式而定, - 多个事务当然也可以回调:或许就是最终一致性了,到回调完成那一刻,数据才会变得正确。 我认为分布式事务本身没什么复杂的,更多是因为涉及分布式事务的业务太复杂了。导致分布式事务看起来很难。其实回到本质还是同步问题。 |
25
bthulu 125 天前 1
从来不用分布式事务, 都是调接口, 成功了就算了, 不成功, 就调回退接口, 回退接口也失败了, 打日志告警人工处理.
现实中哪有真正的分布式事务? 你一次捞到多个数据库连接, 依次开启事务, 执行 sql, 然后 commit 的时候, 有几个成功了, 有几个失败了, 你怎么办? 提供成功的事务, 哪个数据库支持回滚? 就算支持回滚, 也会出现有几个回滚成功了, 有几个回滚失败了, 这时候你又咋办? |
26
Plutooo 125 天前
先从事务讲起,单体服务的事务 ACID 由 spring 管理、数据库保证
然后讲微服务下,A 服务调用 B 服务,为什么原来能在单体用的事务不生效了 接着讲怎么解决,讲最终一致性(本地消息表、事务消息)、强一致性( 2PC 、TCC ) 讲市面上对应的中间件 rocketmq ? seata ? 最后说你们项目怎么做的 |
27
ilvsxk 125 天前
@laminux29 #13 银行 app 和云闪付 app 里的信用卡账单都能做到实时,而短信的账单就会延迟就是为了省成本,发短信是要钱的,银行有几块钱包月实时短信通知的业务。所以这和分布式事务有啥关系?
|
30
laminux29 125 天前
@bthulu
Q1:现实中是否存在真正的分布式事务? A:存在。 Q2:几个成功了, 有几个失败了, 你怎么办? A:只要有一个失败,此次分布式事务就按失败算。分布式框架或相关驱动模组,会自动回滚所有涉及到的分布式数据库,如果你是开发,此时你会 catch 到一个分布式事务失败的 Exception ,你需要做的是,按此次业务失败进行处理。 Q3:提供成功的事务, 哪个数据库支持回滚? A:主流的关系型数据库,必然支持回滚,这是标准。 Q4:就算支持回滚, 也会出现有几个回滚成功了, 有几个回滚失败了, 这时候你又咋办? A:关系型数据库在正常情况下,回滚一定会成功。如果出现回滚失败,这等同于数据库软件出错,此时数据库软件会写日志告警,甚至失去响应、崩溃。如果你是运维,在数据库部署阶段,就要对这些情况进行监控。如果你只是开发,你什么都不用管,问一下运维同事就行。 以上知识在 [数据库原理与设计] 相关教程中有讲解,课程方面属于计算机系的本科课程。 |
31
laminux29 125 天前
@pangdundun996
1.本来我想用转账的例子来说明,但觉得太简单了,不符合本论坛水准。 2.我举得这个例子很合适,你说的双信息系统是对的,但你说的夜间跑批清算是错的,清算早就是全天候的了,真正原因我在评论区里已经讲了。 |
33
justdoit123 125 天前
@bthulu {哭笑脸} “打日志警告人工处理”,项目初期很受用。
|
35
laminux29 124 天前
@bthulu
1.我在前面说的,是规则,像 RFC 一样,是大家都需要遵循的规范,而不是某款关系型数据库的专有功能。 2.从你这个提问来看,你应该不是科班的。如果你对这个话题感兴趣,可以补习一下相关知识: https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_txns.htm |