论坛首页 招聘求职论坛

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

浏览 59606 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2014-08-01  
wjt9989 写道
我想可能是这样的,淘宝创建订单之后,携带支付宝需要的信息,打开支付宝的界面 ,用户在支付宝的界面完成付款,界面中出现类似“返回商家界面”之类的按钮。如果用户支付宝付款失败,则用户可以继续回到之前的淘宝界面,点击“付款”,继续。
然则淘宝如何知道支付宝是否付款成功?一种方法可能是通过消息通信同步查询支付宝,另一种可能是支付宝再完成付款之后,通知淘宝。
这个可能和淘宝跳到网银付款原理是一致的,淘宝显示“完成付款”和“付款遇到问题”按钮,网银付款完成之后显示“跳转到商户界面”按钮。
不知道我的理解是否正确。

哥们的头像 貌似是雷峰塔啊
0 请登录后投票
   发表时间:2014-08-02   最后修改:2014-08-02
好眼力!

引用

哥们的头像 貌似是雷峰塔啊
0 请登录后投票
   发表时间:2014-08-03  
wjt9989 写道
好眼力!

引用

哥们的头像 貌似是雷峰塔啊

哈哈  年初去杭州旅游了一次  对那个雷峰塔的大理石印象比较深刻 
0 请登录后投票
   发表时间:2014-08-04  
james_lover 写道。。。。
楼主可以看看 《大型网站系统与java中间件实践》,里面介绍的 服务框架,数据访问设计,消息中间件,以及 软负载 等等,都是阿里系诸多产品的理论基础。
 
 

 

 

 

0 请登录后投票
   发表时间:2014-08-04  
james_lover 写道

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

这里对此问题作下分析:

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

前提条件:

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

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

 

我的思路:

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

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

 

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

就这样。

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

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

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

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

完!

好吧,我没做过像淘宝这样子大的电商系统,也没做过比京东大的系统。我只说说我的想法:

 

支付宝和淘宝必须是解耦的两个系统,简单说用户在淘宝买东西时创建的订单号那是完全归属于淘宝系统的,与支付宝没有任何关系;当用户选择使用支付宝支付并提交支付操作时此时才会与支付宝产生关联关系,这个关联关系就是淘宝系统在调用支付宝支付接口时会带入用户在淘宝平台的购物时的相关参数(支付来源、金额、订单号等等<只是需要注意的时此时这里还有一个统一登录认证的问题,也就是淘宝用户登录状态时使用支付宝支付时是不用再次登陆的>),此时支付宝系统才会根据传入的参数生成支付宝系统的唯一订单号(会有唯一的淘宝订单编号和唯一的支付宝订单编号一一对应),我想这个流程应该是不会变的,唯一可变的我想应该是支付宝系统的唯一订单号是先创建还是后创建问题,这也可以讨论的一个焦点。比如支付宝系统可以根据实际情况系统自动产生唯一订单编号号池,然后淘宝调用时系统进行分配唯一订单编号(此时可以省去支付宝系统创建订单编号的时间),当然也可以是淘宝调用支付宝支付接口网关时支付宝平台产生唯一订单编号。

 

OK,我想在我说清楚了以上创建订单编号流程后再来说说关于实时性的问题。在文中博主说到了关于异步创建以及实时性要求高的问题,这里我的理解是这样子的,在用户从淘宝上发起使用支付宝支付时系统会调用支付宝接口进行网关验证并跳转到支付宝页面,这里的这个逻辑我认为的是同步的,原因是为了给支付来源的订单绑定一个唯一的支付宝系统的订单编号(也就是说如果支付请求方拿不到支付宝平台唯一的订单编号那后续的所有支付流程都无法进行),也就是此时可简单理解为支付宝系统此时会给淘宝的订单生成一个一对一的支付宝订单编号。OK,此时二者的关系就亲密起来了,因为后续你所有的支付操作都将围绕着支付宝订单编号产生了,当完成了所有的支付操作后,在最后最后的时候系统会从支付宝平台跳转到淘宝平台,那么也就是在此时支付宝的订单编号又将再次和淘宝平台的订单编号一起携手返回到淘宝平台。显然从淘宝发起支付到支付宝出现支付页面到支付结束的这整个过程必定是异步和实时性的最关键的体现了。 那这里异步就不说了,来说说实时性吧,支付宝中的每一笔订单都是一个分布式事务,可以说我们看到的支付宝订单编号它在系统里至少应该存储了2个以上的拷贝,同时它需要在最后做支付一致性确认操作。那针对这个分布式事务一致性操作,我想他们最好的处理应该是使用它们的Notify消息中间件了,该中间件具备分布式事务,具备顺序读写,具备fail over,具备负载等等各种优势;同时任何系统使用了消息中间件势必就需要有任务处理系统来及时的处理这些消息,所以可以说如何能做到实时的处理这些消息队列中的消息才是支付宝订单处理实时性的关键。

 

 

PS:针对博主说的到购物车以及秒杀,相信这两个在电商领域都是难题,针对前者购物车相信尚好,毕竟也就是生成有效订单前减库存和生成订单支付时减库存的问题;而针对于秒杀相信要涉及的问题会更多,但是如果是我来做秒杀,相信所有的请求以及库存都会至于一个结果,都会存储在内存中,秒杀的请求会按照唯一高精度时间戳来依次存储,至于秒杀的库存量同样会在内存中进行存放,同时会考虑秒杀的用户需要达到超过库存量多少时结束秒杀。

 

以上为我的理解和思考,欢迎讨论。

 

 

 

0 请登录后投票
   发表时间:2014-08-09  
只能告诉这个地方是同步的
别的脑补吧。。。。
0 请登录后投票
   发表时间:2014-08-15   最后修改:2014-08-15
我假设淘宝的订单和支付宝的订单并不是同一个类型的,
1、淘宝的订单是有商品明细,总价,收货人的信息,支付宝的订单有相关信息吗,应该是只有收款方,金额,订单号之类,那它们之间要同步的信息就只有支付状态了。
2、如果1成立,那就是支付宝在淘宝提交订单时,支付宝并没有创建什么订单,而是到了支付时才创建相关订单,成功后回调淘宝接口或者通过消息中间件发送消息,淘宝收到通知后,更改订单状态,做完扣库存之类的业务然后返回结果,如果支付宝没有收到期望的结果,会以一定时间间隔来继续回调或者发消息,直到收到正常的结果或者累计到一定次数才停止。
0 请登录后投票
   发表时间:2014-08-15  
订单和支付单不会是同步创建的

从订单成功跳到支付宝收银界面基本有1秒-2秒的延迟差,足够异步在支付宝创建出支付单了

支付成功后再回调修改订单状态呗
0 请登录后投票
   发表时间:2014-08-15  
LZ没接过第三方支付系统吧
基本大同小异都是这种流程
0 请登录后投票
   发表时间:2014-08-20  
来结贴:
阿里的应聘已经挂啦。拿到了去哪儿java的offer.
0 请登录后投票
论坛首页 招聘求职版

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