V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
a1310747
V2EX  ›  问与答

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

  •  1
     
  •   a1310747 · 2017-03-01 11:51:49 +08:00 · 6987 次点击
    这是一个创建于 2828 天前的主题,其中的信息可能已经有所发展或是发生改变。
    编程写出一个银行转账案例,如 A 账号向 B 账户转账,尽可能包含转账账户、转账金额、接收账号、银行流水号、汇率等信息,要求考虑百万以上并发,保证事务的流畅性和安全性。
    33 条回复    2017-03-02 09:53:41 +08:00
    a1310747
        1
    a1310747  
    OP
       2017-03-01 11:54:38 +08:00
    同事说了一些关于数据库的锁机制和事务隔离级别 并发这块就不知道怎么解决了
    vingz
        2
    vingz  
       2017-03-01 12:39:25 +08:00
    什么岗位?
    swulling
        3
    swulling  
       2017-03-01 12:40:12 +08:00 via iPhone
    这应该是一个 P8 面试题
    vingz
        4
    vingz  
       2017-03-01 12:42:24 +08:00
    @swulling 架构师吧?
    a1310747
        5
    a1310747  
    OP
       2017-03-01 13:43:19 +08:00
    @swulling 我也不清楚...反正我是没答上来。。
    YouXia
        6
    YouXia  
       2017-03-01 13:45:49 +08:00
    @swulling

    应届生想拿 Special 的话,这个题答的也不能太差才行。 P8 ?你想多了。。。
    YouXia
        7
    YouXia  
       2017-03-01 13:49:34 +08:00
    这个问题,第一点先需要答出两个账户是在同一个数据库里还是不同的数据库里,之后再解题,答出第一点其实就可以加分了。

    当然我不搞业务,答不太好,就不详细说了。
    qieqie
        8
    qieqie  
       2017-03-01 14:03:39 +08:00 via iPhone
    关键词应该是分布式事务,最终一致性
    a1310747
        9
    a1310747  
    OP
       2017-03-01 14:03:45 +08:00
    @YouXia 这点真的没想到 感谢提醒
    YouXia
        10
    YouXia  
       2017-03-01 14:07:36 +08:00
    @qieqie

    涉及到钱的,可以认为只能是强制一致性了。
    swulling
        11
    swulling  
       2017-03-01 14:31:39 +08:00 via iPhone
    @YouXia 如果说应届生就能答出百万并发的架构。而且是百万交易并发。

    我只能说你们那里不是地球。

    其实说 P8 都是说的低太多了,支付宝双十一每秒交易笔数峰值也就十万规模。这个直接百万
    swulling
        12
    swulling  
       2017-03-01 14:32:12 +08:00 via iPhone
    一人秒杀阿里全公司,一个 P8 怎么够,得 P80 吧
    qieqie
        13
    qieqie  
       2017-03-01 14:33:29 +08:00 via iPhone
    @YouXia 题主也说了,在高并发下保证事物的流畅性
    http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency
    正如这篇文章里所说:
    在互联网领域的绝大多数的场景,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。
    ebony0319
        14
    ebony0319  
       2017-03-01 14:35:56 +08:00

    银行的做法就是你给我坐着给我等几分钟,取钱至少要几分钟把。
    YouXia
        15
    YouXia  
       2017-03-01 14:37:42 +08:00   ❤️ 1
    @swulling

    并发这个面试官基本就是就是瞎扯,不用管。支付宝去年 12W 吧。

    这个问题基本上就是让你试着用单机数据库事务实现分布式 /夸库事务。
    YouXia
        16
    YouXia  
       2017-03-01 14:54:32 +08:00
    @qieqie

    其实文章里提到的,比如本地消息表里的“最终一致性”,其实我是当成强一致性的,通过单机强一致性事务,避免了分布式事务。
    benbenlang
        17
    benbenlang  
       2017-03-01 14:59:12 +08:00
    不懂技术,但这个题肯定是在考思路,面试官出发点没错的
    mickeyandkaka
        18
    mickeyandkaka  
       2017-03-01 15:07:29 +08:00
    银行转账 -> 强一致性
    尽可能包含转账账户、转账金额、接收账号、银行流水号、汇率等信息 -> 业务设计可能需要拆可能细的表?
    要求考虑百万以上并发 -> 高可用
    保证事务的流畅性和安全性 -> 高可用与一致性。

    看起来分布式事务 + 分布式一致性算法。为了保证可用性,只能堆尽可能多的机器?
    不知道应该怎么回答。

    我也想知道什么级别会问这种题。。。?
    rason
        19
    rason  
       2017-03-01 15:18:57 +08:00 via iPhone   ❤️ 6
    面试让你造飞机,工作让你拧螺丝。
    a1310747
        20
    a1310747  
    OP
       2017-03-01 15:19:30 +08:00
    @rason 哈哈哈哈哈哈哈哈哈 特别形象!!!
    ijustdo
        21
    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
        22
    ijustdo  
       2017-03-01 15:52:28 +08:00
    忘了说 最后这个 统一事务编号 实际就是 A->B 赚钱的 银行流水号 中间两步的 都可以看成子事务 或者子流水号
    每一步都要求可以逆向操作 每一步可以不用管是在哪里执行的 我说的是机器或者 ip 之内
    ijustdo
        23
    ijustdo  
       2017-03-01 16:06:27 +08:00
    实际这个流程里主要要考虑 会计一些收支平衡 比喻 我要查看银行 今天或者某时间段所有入账 只用看 给 C 的入账
    要看所有出账 就是看 C 的所有出账 理论上每一笔 加上手续费 计算 汇率转换
    每一笔 也就是每一个统一事务号下所有交易 要符合会计公式

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

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

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

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

    总之有接触过高并发的话,能说的东西挺多,怕说错就只说有把握的部分。
    mooncakejs
        30
    mooncakejs  
       2017-03-01 19:15:01 +08:00
    涉及钱的服务, 只有队列化,用户不相关的交易可以并行处理,用户相关的必须排队处理。
    liprais
        31
    liprais  
       2017-03-01 19:28:36 +08:00 via iPhone
    如何亩产万斤
    jason19659
        32
    jason19659  
       2017-03-01 21:05:30 +08:00
    还有 log 可复查。。
    ijustdo
        33
    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 小室内 可退回 嘿嘿 那么还有更爽的

    个人只见 做金融开发 很蛋疼 不知道这个问题是考程序流程 还是 考架构 没说清楚
    所以这个答案估计很多 得看应聘什么职位 从职位的职能去考虑这件事
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3434 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:29 · PVG 19:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.