`
lelong
  • 浏览: 554871 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

淘宝下单高并发解决方案(转载)

 
阅读更多

来自http://www.iteye.com/topic/1123010

 

周末参加了@淘宝技术嘉年华 主办的技术沙龙, 感觉收获颇丰,非常感谢淘宝人的分享。这里我把淘宝下单高并发解决方案的个人理解分享一下。我不是淘宝技术人员,本文只是写自己的理解,所以肯定是会有一些出入的。

在session中牧劳为我们介绍了淘宝下单部分的技术方案变迁,我不介绍变迁,而只对现有系统做介绍。

要优化下单,提高下单的TPS (Transaction per second),我们首先要做的是对下单的逻辑剥离,只保留核心部分,而把附加功能剔除出去。比如说下单要考虑库存量,考虑发短信,要给卖家发旺旺消息通知,要对订单做统计,要做销售额统计等等,这些功能是必要的,但是也是附加的功能,要最大程度提高下单这一步的TPS,就要先不考虑这些东西。

下单必然会涉及到买家查看订单,和卖家查看收到的订单,修改订单价格等,这是下单的核心。 在下单这个操作中有买家和卖家两个密切关联而有不同的视角。牧劳称为两个不同的维度。据牧劳的介绍下单这一步只有5张表,这5张表涵盖了这两个维度的操作。

下单是在一个数据库事务中进行的,要提高数据库的事务并发数,最有效的办法是拆分,拆分有两种,一是对库进行拆分,另一种是在同一个库中对表进行拆分。要做拆分首先就要考虑拆分依据的字段,淘宝是根据订单号做拆分的,而下单中有两个维度,买家和卖家,对订单做拆分之后,必须还是可以通过买家,卖家方便的查询着两个维度的数据。该怎么办呢?这里留个疑问,我先介绍淘宝拆分的规模,淘宝将订单表拆分到16个mysql库中,而在每个库中又将订单表横向拆分为64份,相当于将一个表拆分为1024份。拆分之后事务会分散到1024套表中,这必然会很大程序上增加并发的事务处理能力(这儿我说是必然,但是淘宝在使用这种方案之前是要经过压力测试,实际测试出这种方案的TPS之后,才会逐步采用这种方案的)。上面留了一个疑问,经过拆分之后如何保证买家卖家快速的查询其下的订单呢?最好的办法是保证买家,卖家下的订单在一张表中,如何保证呢?淘宝的做法是将买家的id取模后放到订单号中。假定一个订单号是142424594267664;这个订单号对应的订单该放在哪台服务器上的哪个表中,是根据订单的后四位7667,对1024取模之后决定的;同时7667是买家id的后四位。这样买家在查询其订单时就可以通过其id获得其订单所在库以及表,就可以方便有效的查询买家订单了。这里会带来另外一个问题,卖家查询订单时怎么办?前面我们已经提到卖家和买家被分成两个不同的维度来做表设计,卖家查询时不是直接查订单表,而是通过卖家维度的表来做查询。卖家维度的表的插入,更新是通过在订单插入时发一个消息来通知插入的。同样对于发短信、发旺旺也是通过消息来处理的,这些附加功能不参与到下单的事务中去。

即使这样做了库,表的拆分,依然会有问题。淘宝在双11时的一天的交易量就达到了5000多万,这样几个月过去后,这些拆分后的表中的数据量也会达到很大的一个量,处理速度就会下降。淘宝的做法是把三个月之前的老数据迁移到其他库中,这样就避免了数据量增大导致的系统响应时间降低的问题。但是会带来另外一个问题,用户在查询订单时需要同时查两个库,一个是历史数据表,另一个是近期数据表;这个问题无可避免,就是通过查询两次解决。

也许有的朋友会想到拆分之后对全数据做统计会有问题。如果在拆分后的表上做统计,是肯定会有问题的。怎么做呢?其实很简单,把数据迁移到别的库中去做统计。

表做拆分可以大大的提高TPS,但是也会带来一些问题,需要通过可靠的消息通知机制通知其他模块做非核心处理的事情,需要通过高效的搜索系统保证搜索数据的及时更新。

以上是我个人对淘宝下单高并发设计的理解。这是肤浅的,实际做的时候肯定还需要考虑更多的问题,比如数据库的调优,磁盘IO方式,服务器稳定性;方案的可测试性,可量化等等。

上周六的技术还分享介绍了很多其他方面的精彩内容。感谢主办方,主持人! 期待@淘宝技术嘉年华 更多精彩的技术沙龙。

分享到:
评论
2 楼 lelong 2012-04-26  
swen00 写道
核心业务逻辑拆成1024,这点并没有说,只知道要拆,为什么这样拆,有没有?

这个应该是举例数据吧,但是应该也有原因的。
1 楼 swen00 2012-04-25  
核心业务逻辑拆成1024,这点并没有说,只知道要拆,为什么这样拆,有没有?

相关推荐

    python淘宝下单源码

    9. **淘宝API**:虽然淘宝官方并不公开下单API,但开发者可能通过观察和分析网络请求来模拟这些操作。理解HTTP请求的方法(GET, POST)和请求头(headers)的设置也是必要的。 10. **安全性与合规性**:在使用此类...

    dsqg_淘宝脚本秒杀!_淘宝_淘宝下单_

    _淘宝_淘宝下单_”表明这是一个关于使用Python脚本在淘宝平台上进行自动秒杀的商品的教程或工具。这个标题涉及到的知识点主要包含两个方面:淘宝的自动化操作和脚本编程。 首先,我们要理解淘宝秒杀的基本流程。在...

    最新淘宝天猫聚划算下单秒杀谷歌插件全自动

    总的来说,这款“最新淘宝天猫聚划算下单秒杀谷歌插件全自动”为电商购物爱好者提供了一种智能化的解决方案,借助谷歌浏览器插件的形式,帮助用户在激烈的秒杀活动中抢占先机,确保不会错过任何一次心仪商品的优惠...

    高仿淘宝下单选择页面

    在构建“高仿淘宝下单选择页面”的过程中,我们需要关注多个关键知识点,这涉及到前端界面设计、用户交互体验、数据管理以及后端接口通信等多个方面。下面将详细阐述这些要点: 1. **用户界面(UI)设计**:设计是...

    淘宝定时自动抢购下单脚本

    淘宝定时自动抢购 抢购脚本是通过Selenium来完成调用登陆页面,自己扫码登录,和自动点击的操作的。 Selenium是一个用于Web应用程序测试的工具,Selenium可以直接运行在浏览器中,通过后台控制操作浏览器,完成下单...

    淘宝客API程序接口

    淘宝客API程序接口 从淘宝开放平台下载的,有源代码

    高性能电商秒杀解决方案

    高性能电商秒杀解决方案 秒杀的特点 • 大量用户在秒杀时间点发起购买请求,造成网站流量瞬间激增; • 秒杀的商品一般库存较少,只有少数用户能够购买,要控制好库存,防止超卖; • 整个系统关键在于支撑短时间内...

    高并发业务场景下的秒杀解决方案.docx

    总的来说,高并发业务场景下的秒杀解决方案通过Redis的队列技术和原子操作,能够有效地防止超卖问题,同时通过优化策略提高系统的稳定性和效率。在设计类似系统时,还需要考虑其他因素,如系统的扩展性、容错性和...

    Java秒杀系统方案优化 高性能高并发实战

    ### Java秒杀系统方案优化与高性能高并发实战 在当今互联网时代,随着用户数量的急剧增加,对于服务器的压力也越来越大,特别是在一些特定的场景下,比如抢购、秒杀活动等,系统的高并发处理能力成为了衡量一个应用...

    一键下单MT4插件

    一键下单MT4插件就是为了解决这个问题而生,它简化了下单步骤,使交易者能在几秒钟内完成订单提交,减少了因手动输入可能带来的延迟和错误。 该插件的工作原理是通过预设的参数,如交易量、止损和止盈价位,一键...

    redis 购物超买高并发处理

    在电商领域,购物超买问题是一个常见的挑战,尤其是在大促活动期间,高并发的用户访问可能导致商品库存瞬间被误购超出实际库存。Redis作为一种高性能的键值存储数据库,常用于解决此类问题。以下将详细讨论如何利用...

    下单自带盈损_MT4下单面板_MT4ea下单面版_下单面板_

    标题提到的"下单自带盈损_MT4下单面板_MT4ea下单面版_下单面板_"是指一个专为MT4设计的增强型下单工具,它扩展了MT4的基本功能,增加了自动计算盈亏的功能,使交易者在下单时就能预知潜在的盈利或损失。 MT4下单...

    深入理解高并发下分布式事务的解决方案.docx

    ### 深入理解高并发下分布式事务的解决方案 #### 一、分布式事务定义 分布式事务是指事务参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单来说,分布式事务是由...

    SpringBoot开发的高并发限时抢购秒杀系统

    本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具: IntelliJ IDEA + Navicat + ...

    第三十三课 如何解决重复下单问题.mp4

    第三十三课 如何解决重复下单问题.mp4

    淘宝分销下单助手一个Chrome插件

    淘宝分销下单助手是一款基于Chrome浏览器的插件,其主要功能是优化和提升淘宝分销商家的采购下单流程。作为一款JavaScript开发的工具,它利用了Chrome浏览器的扩展机制,通过JavaScript技术来实现自动化处理分销订单...

Global site tag (gtag.js) - Google Analytics