论坛首页 招聘求职论坛

记阿里电话面试的一个遗留问题:淘宝订单如何保证与支付宝订单的同步“?

浏览 59573 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2014-07-28   最后修改:2014-07-28

刚刚接到阿里的一个电话面试,提到这个问题,一时间没回答上来。 

这里对此问题作下分析:

      首先这应该是一个发散性问题,考察面试者的问题分析能力和处理能力。

前提条件:

1:淘宝平台,与支付宝平台必然是解耦的。也就是说在淘宝创建订单过程中不可能是同步调用支付宝创建订单接口(同步调步使用两系统耦合太紧,支付宝创建出错,将导致淘宝订购失败,这无法接受)。

2:虽然是异步调用,但实时性要求很高。(因为大量用户在淘宝订购之后会立即支付)

 

我的思路:

1:淘宝创建订单时,异步调用支付宝的创建订单接口。(或者使用消息中间件,如kafka)。支付宝收到订购消息,则创建订单(这期间会有一定的延迟)。

2:用户选择支付宝支付时,同步调用支付宝创建订单(应为订单有效性检查,这时就必须要求支付宝订单创建成功了,但此时并不会系统造成很大压力,因为已经有大部分订单已创建成功。这里支付宝只须判断,如果订单未创建成功,则创建订单。)

 

这里有一个难题:如何保证支付宝异步创建订单的及时性(用户在淘宝下订,到支付宝订单创建成功的时间),我觉得这个延时最多不能超过2秒钟(此时间是考虑用户在淘宝的操作流程和操作时间间隔)。这里考虑kafka主要是因为其它牛B的性能和消息不易失(消费完还能找回,保存时间长)。

 

就这样。

 

 

 ================================================

补充:考虑到淘宝有货物库存的问题,如秒杀系统,必须严格要求先到的请求优先创建订单,后到请求如果库存不够,则不能创建订单。

由于不可能为秒杀系统单独建立一套订单流程。所以要求:必须保证订单的顺序一致性。

这一点kafka无法满足要求,刚查到的资料:淘宝开源的消息中间件:Metamorphosis (MetaQ) 则可以保证顺序性。

 

完!

 

 

   发表时间:2014-07-28  
顶……沙发
0 请登录后投票
   发表时间:2014-07-29  
楼主你认为调调API就能解决这些问题了吗?
0 请登录后投票
   发表时间:2014-07-29  
backshadow 写道
楼主你认为调调API就能解决这些问题了吗?

话别说一半,请继续。
望赐教。
0 请登录后投票
   发表时间:2014-07-29  
毕竟是淘宝交易的消息系统,量大,要求安全响应及时。
kafka、MetaQ工作原理,内部消息如何存储(存本地还是异地),大数据量情况下集群效果如何,横向扩展怎么样,可伸缩性怎么样,fail over机制等等。
0 请登录后投票
   发表时间:2014-07-29  
backshadow 写道
毕竟是淘宝交易的消息系统,量大,要求安全响应及时。
kafka、MetaQ工作原理,内部消息如何存储(存本地还是异地),大数据量情况下集群效果如何,横向扩展怎么样,可伸缩性怎么样,fail over机制等等。

同意,我上面只考虑了C。另外还要考虑AP.
Web系统通常都会保证AP.我想淘宝的交易系统也不例外。因此C是最难也是最复杂的。

其实淘宝订购这个场景对C的要求挺高的,至少要求在秒级完成最终一致。这对metaQ的要求极高,因此我才设计了步骤2.试图弥补异步调用的不足。
(我最开始想的就是异步调用+后台定时校验任务,后来觉得这不满足时延要求,当时没想到用kafka。所以一时没答上来。)
正常情况下,metaQ支撑平时的流量应该问题不大(否则系统就该扩容了),但流量峰值时就不一定能保证及时性了,步骤2虽然会造成用户体验的下降(支付不太流畅了),但保证了能正常支付。


0 请登录后投票
   发表时间:2014-07-29  
下订单成功,与支付成功是两码事啊。。。

支付才是强一致性的。
0 请登录后投票
   发表时间:2014-07-29  
biaobiao520 写道
下订单成功,与支付成功是两码事啊。。。

支付才是强一致性的。

这位同学可能没看明白问题。
淘宝购物可简单分为两步:
1:淘宝下订单:需要在淘宝平台和支付平台分别创建订单。
2:完成支付:前提必须是在支付平台已成功创建订单,才可能有后续支付环节。
后面确认,退货什么的先不考虑。

这里讨论的是1。
0 请登录后投票
   发表时间:2014-07-29  
james_lover 写道
biaobiao520 写道
下订单成功,与支付成功是两码事啊。。。

支付才是强一致性的。

这位同学可能没看明白问题。
淘宝购物可简单分为两步:
1:淘宝下订单:需要在淘宝平台和支付平台分别创建订单。
2:完成支付:前提必须是在支付平台已成功创建订单,才可能有后续支付环节。
后面确认,退货什么的先不考虑。

这里讨论的是1。



作为曾经就职过规模比京东大的电商的过来人,我觉得,很显然简单问题被你复杂化了,你在淘宝下订单的时候,支付宝根本不care已经生成了你的订单,只有在支付时才保证强一致性。涉及到这种问题的性能考虑,绝不是简单的用什么什么那么简单的,是整个生态圈结构的考虑,不过最终还是 安全、空间、成本、时间 这几个取舍而已。阿里的飞天确实很高大上的感觉。
0 请登录后投票
   发表时间:2014-07-29  
biaobiao520 写道
james_lover 写道
biaobiao520 写道
下订单成功,与支付成功是两码事啊。。。

支付才是强一致性的。

这位同学可能没看明白问题。
淘宝购物可简单分为两步:
1:淘宝下订单:需要在淘宝平台和支付平台分别创建订单。
2:完成支付:前提必须是在支付平台已成功创建订单,才可能有后续支付环节。
后面确认,退货什么的先不考虑。

这里讨论的是1。



作为曾经就职过规模比京东大的电商的过来人,我觉得,很显然简单问题被你复杂化了,你在淘宝下订单的时候,支付宝根本不care已经生成了你的订单,只有在支付时才保证强一致性。涉及到这种问题的性能考虑,绝不是简单的用什么什么那么简单的,是整个生态圈结构的考虑,不过最终还是 安全、空间、成本、时间 这几个取舍而已。阿里的飞天确实很高大上的感觉。


这么说,我可能是没理解面试官想得到什么样的答案。刚听到题目,一时脑子没想出来这个问题该从哪个角度来回答,当时冷场了。(当时问题原话是: 淘宝购物时要创建订单,支付宝也要创建订单,那么怎么保证两个平台订单的一致性?)后面一个问题扯到了用zookeeper来保证分布任务调度和一致性。

挂了电话,后来我想这个问题应该从系统解耦和分布式一致性的角度来答,可能他想知道我是否了解消息中间件.
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics