同事去阿里面试,遇到这么一个题目,v 友帮看看如何回答是最好的。

2017-03-01 11:51:49 +08:00
 a1310747
编程写出一个银行转账案例,如 A 账号向 B 账户转账,尽可能包含转账账户、转账金额、接收账号、银行流水号、汇率等信息,要求考虑百万以上并发,保证事务的流畅性和安全性。
6972 次点击
所在节点    问与答
33 条回复
ijustdo
2017-03-01 15:49:32 +08:00
随便想了下 没看太明白 尝试看看呢

A 转账账号
B 接收账号
C 银行中转结算账号 (汇率什么的在这一级结算)
M 代表所有流程中的统一事务编号 你也可以看成是一个特殊 的 uuid 之类


A 向 B 转 X (可以根据统一事务编号查询进度)
1. (统一事务编号)A 的账号冻结 X 金额 (记录日志 能你操作到操作前)
2. (统一事务编号)A 向 C 转 X 金额(并进行汇率换算) 银行收到处理后会给流水号 (流水号)(记录日志 能你操作到操作前)
3. (统一事务编号)C 向 A 转 X 金额(这里不同币种也许汇率换算) (这不也会产生流水号)(记录日志 能你操作到操作前)
4. (统一事务编号)A 收到钱 给统一事务编号 发消息 老子收到钱了(记录日志 能你操作到操作前)
5. (统一事务编号) 把 A 冻结的 X 金额给减去 (记录日志 能你操作到操作前)
6. (统一事务编号) 这里可能还有会计结算 自动收支 安全检查等一堆的 事务完整延时检查 都过了 转账完成
ijustdo
2017-03-01 15:52:28 +08:00
忘了说 最后这个 统一事务编号 实际就是 A->B 赚钱的 银行流水号 中间两步的 都可以看成子事务 或者子流水号
每一步都要求可以逆向操作 每一步可以不用管是在哪里执行的 我说的是机器或者 ip 之内
ijustdo
2017-03-01 16:06:27 +08:00
实际这个流程里主要要考虑 会计一些收支平衡 比喻 我要查看银行 今天或者某时间段所有入账 只用看 给 C 的入账
要看所有出账 就是看 C 的所有出账 理论上每一笔 加上手续费 计算 汇率转换
每一笔 也就是每一个统一事务号下所有交易 要符合会计公式

这个题我也没看明白 说白了 题目出的不好 哈哈 没有突出他要考核的是那一点
TheCure
2017-03-01 16:26:03 +08:00
百万并发 23333
ivvei
2017-03-01 16:41:34 +08:00
@YouXia 但是这题难点不就在并发上吗…… 直接不管这个?
YouXia
2017-03-01 16:55:36 +08:00
@ivvei

阿里面试就喜欢问这种问题,包括校招,比较如何实现分布式搜索引擎,或者这个题目,题目都比较大,甚至很多题目要求实现不了或者连这种应用场景都不会有。

回答时候面试官更看重你解决问题的思路的。
holyghost
2017-03-01 17:09:10 +08:00
@swulling p90 一梭子都突突死得了。
quicknight
2017-03-01 18:03:43 +08:00
1.创建交易号,保存当前交易记录
2.从 A 帐户扣除要转账金额,把交易号,转账金额, A,B 账号一起加入待处理队列
3.队列依次将待处理请求提交银行系统处理
4.接收银行处理结果,成功后按照交易记录,修改 B 帐号金额,交易号流水号保存,通知 A,B ,不成功转账金额退回原始账户,从队列里删掉当前交易,修改交易号状态,通知 A,B
WhoMercy
2017-03-01 18:58:52 +08:00
讲一讲大致思路:
1.先考虑数据传输效率,序列化、 IO 占时,可以使用强类型、高效的 Protobuf 封装数据;
2.再考虑单机处理能力,使用负载均衡分流向集群服务器,提供横向扩展吞吐量处理简单业务逻辑;
3.接着考虑强敏感业务的事物强一致性要求,集群服务器处理完的数据可以使用分布式事务验证数据正确性、做数据持久化(如金额加减、用户资金操作记录)等;
……

2.、 3.具体的实现方案比较多,而且说起来简单,落地难。比如数据的请求使用 AIO(请求后需等待转账完成,而不是立刻完成);比如事务补偿机制,对已经完成的事务做校验、记录……

总之有接触过高并发的话,能说的东西挺多,怕说错就只说有把握的部分。
mooncakejs
2017-03-01 19:15:01 +08:00
涉及钱的服务, 只有队列化,用户不相关的交易可以并行处理,用户相关的必须排队处理。
liprais
2017-03-01 19:28:36 +08:00
如何亩产万斤
jason19659
2017-03-01 21:05:30 +08:00
还有 log 可复查。。
ijustdo
2017-03-02 09:53:41 +08:00
这个问题 真的 没明确 这里可能 A 账号 在国内 B 账号在国外 还有可能 A, B 不同银行 这个问题又没说 是相同的银行
就算相同的银行 币种和汇率都的吃一壶(这些都得实现约定 一什么时候汇率为准)
为什么我引入中间账号 C[你可以把他当做结算 /清算中心]

1. 假设 A 在国内 B 在国外 汇款可能非 24 小时 或者 刚好日期变更先附近两个国家 汇率以那边为主
2. 还有就是 A 汇款后 在 B 没收到钱之前 他的银行卡金额可能还会产生变化 比喻上例跨行会国内 A 汇出钱后 在 B 没收到之前 这个时候 他还可能进行其它交易的
3. 我记得在就几年 那时候 银行就开始小型机了 相信有钱单位能用钱解决的问题都不是问题....
4. 这种问题 因为太多的不确定行 一般都会 尽量拆分 每一步都可以独立执行 每一不都可以恢复执行前
5. 第四步是必须的 如果像央行新要求 atm 汇款 24 小室内 可退回 嘿嘿 那么还有更爽的

个人只见 做金融开发 很蛋疼 不知道这个问题是考程序流程 还是 考架构 没说清楚
所以这个答案估计很多 得看应聘什么职位 从职位的职能去考虑这件事

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

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

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

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

© 2021 V2EX