京东,作为全国买买买炮火的主要目标,架构师、码农们一边承担着全国人民打折购物的殷切期望,一边承受着老板东哥如芒在背的犀利目光。
总之,一旦出现闪失,后果不堪设想。
那么,究竟架构师们如何万无一失地完成这样“不允许失败”的任务呢?
在今天的 SDCC 中国软件开发者大会上,京东商城总架构师、基础平台负责人刘海锋为现场观众介绍了今年保卫京东双十一的“五大法宝”。
【京东商城总架构师、基础平台负责人 刘海锋】
好钢留在刀刃上:资源规划
说到底,双十一最大的挑战就是访问和业务激增。如果能够提供无限的带宽和计算资源,那么双十一和其他日期不会有任何可以感知的区别。
然而,资源永远是有限的。这就好像一个人往往不能又买房又买车还天天吃大餐。从这个角度来说,资源规划就变得非常重要。
每当各种电商节来临之前,各路部门都变成了嗷嗷待哺的雏鸟。恨不能张口就要十倍于平时的资源。
不过刘海锋说:
大家都觉得资源充分才不会出问题。但是事实证明,有些部门多准备一些 CPU,心理上可能轻敌,在代码上就放松了警惕,这样未必可以活下;相反资源不那么充足的情况下,反而未必死掉。
那么,有限的 CPU 究竟分给谁呢?
【前端用户下单方法调用双十一峰值达到了平均值的16倍,而机房内网络流量峰值只有平均值的1.5倍】
根据刘海锋的研究,京东商城前端的访问系统在零点之前的十几秒负载达到峰值。几秒内就可以达到平均值的16倍。这是因为大家都已经选好了想要的商品,只等零点之前刷新下单。但是,这样狂飙的访问量在系统内部却没有表现得如此恐怖。在系统内部,访问量可能只有平时的 1.5倍。
我们把各个系统分为两类:平稳型系统和毛刺型系统。
平稳型系统,包括商品的详情页、价格页面、库存信息等等;
毛刺型系统,包括下单、秒杀页面、抢购页面等等。
做了细致的研究之后,对于资源的分配就有了依据。这样就可以在保证核心流程充分扩容的基础上,再来满足锦上添花的功能需求。
“逼”内存做存储:夯实基础架构
基础架构是京东商城的基础。而在巨大访问中一旦基础架构出现了问题,会影响无数附加其上的应用。为了保证这个庞大的基础架构,京东做了一些重点动作。
多数据中心
刘海锋说,一个机房的安全系数永远不够,一旦出问题将会造成不可估量的损失。所以京东采用了多数据中心的策略。
这种冗余策略存在于包括电商在内的很多服务中。是一种通用的手段,当然京东也不例外。
全面容器化
京东从2014年开始,对系统进行 Docker 容器化改造。
通俗来说,“容器化”就是把系统的各项资源进行虚拟化,可以更加自由地分配给各个服务。
这种改造有一个巨大的优势,那就是极大地加快了资源交付和速度,更小地细分了资源的粒度。刘海锋说,2014年之前,大促时各个系统分资源还在分物理机,而现在大家可以直接分 CPU,系统在后台直接把 CPU 的计算能力分配给需要的部门。
“逼”内存做磁盘
在京东的构架中,内存可以被用作存储器,而不是缓存。刘海锋说,这就是所谓的 JIMDB(以内存为中心的存储)。
众所周知,硬盘是在电子化的 IT 架构中,唯一一个还在使用机械结构的元件。它的效率之低令人发指。所以在大促的时候,订单内容和实时护具不会回到后台存储,直接在内存中被调用。这样就大大提缩短了系统响应时间。
为此,京东的内存容量储备达到了 260T。
大促的时候,99%的访问请求最高延迟都小于 5 毫秒。
刘海锋说。
消息平台 JMQ
在京东的体系中,最重要的可能就是订单和运单数据。而这些数据需要在许多系统内部实时同步。
很多下游系统关心订单信息。按照传统的思路,所有下游系统都想要获得订单信息,必须通过订单系统,调用其他的接口才能实现。这样就会给订单系统带来极大的压力。
针对这个矛盾,京东开发了消息平台 JMQ。JMQ 的工作原理很简单,大致相当于信息统筹的秘书。订单系统只需要把数据交给 JMQ,其他系统只需要调用 JMQ 就可以查看信息。这在客观上大大缓解了订单系统的压力。
预测取消订单:增强智能
双十一,所有系统资源全部被调动起来。人工智能,这个正在井喷的高科技也可以在这个时候“帮工”。
不过,刘海锋告诉雷锋网(公众号:雷锋网),这并不是什么虚头巴脑的大概念,而是一些接地气的小功能。所以他更愿意把它叫做“增强智能”。
增强智能在京东商城的体系内应用场景不少,例如:客服机器人、库存优化、信息合规校验、智能物流仓储等等。刘海锋举了两个有趣的例子。
【替用户冷静的“订单冷静管道”】
订单冷静:冲动购物的后悔药
如果我看到别人在大促的当天买了一部手机送给女朋友。我一冲动,一次购买了两台,冷静下来想想, 我还没有女朋友。这个时候,我可能会选择退货。
刘海锋说。
然而,京东的很多产品都是自营,在下单之后几分钟内就已经开始分拣打包。然而, 系统订单是在几小时内都支持取消的。
这时,如果用户选择了取消订单,那么打包工作就浪费了。这对于双十一期间资源相对宝贵的京东来说,就是一种资源浪费。
这时,就到了人工智能显示威力的时候。
如果系统探测到下单买两部 iPhone 的用户,经常买奢侈品送给(不同的)女朋友,那么没事。如果探测到这个用户以前购买的最贵的商品就是200块钱的食用油,并且通过大数据分析,这位用户可能没有女朋友。那么就在后台自动把订单“冷静”10-20分钟。如果用户没有后悔取消订单,再继续大宝流程。这有助于减少浪费的成本。
订单预测:从下单到送到只需 12 分钟
在双十一当天,凌晨第一单从下单到出库到用户签收仅仅用了12分31秒。这个看起来有点假的成绩是怎么取得的呢?
如果从下单开始,才从最大的仓库备货,12分钟也许都不够用来分拣。能够做到这么快,要归功于“订单预测系统” 。
【订单预测系统工作原理】
刘海锋讲解了订单预测系统的工作原理:
一个商圈,将会在双十一购买多少手机、电池、尿布、啤酒这类标准品,是可以通过大数据来预测的。而京东的库房是分级的。有后端的仓储和前端的仓储。通过预测,京东会提前把一些商品前置到前端仓(FDC),这样在用户下单之后就可以瞬间从仓库发出,就近送到用户手里。
“自残式”演习:大规模故障模拟演练
验证技术团队可靠性的最好方式,莫过于真枪实弹的技术演习。
Chaos Monkey,是很多平台都在使用的故障演习模式,简单说来就是随即关闭生产环境中的实例,然后检查系统是否能经受故障考验。
刘海锋把这个英语词汇改成了更接地气的中文名称——响尾蛇。
总之,就是在双十一真正的考验来临之前,用一种“自残”的方式来检查系统的可靠性。
刘海锋介绍,京东的“响尾蛇”行动玩法如下:
把运维人员分为两组,一组资深的运维工程师在会议室里,负责模拟故障。而在会议室外面,是负责解决问题的小组。对于将要出现什么问题,会议室外面的小组是毫不知情的。模拟故障五花八门,从机器到网络,到模块,到服务,到中间件和数据库,甚至整个机房消失。应急小组都必须给出合理的处置方法,拼死保证业务不出现问题。
刘海锋说,“由于这种演练具有一定的破坏性,所以我们都是在半夜一点到三点之间进行。”
军演机器人:全链路压力测试
所谓压力测试,就是在真实模拟无数人访问京东并作出各种请求的情况下, 测试系统能否正常运作。
虽然各个环节的工程师都会对自己的系统进行压力测试,但是毕竟这种测试是分散的,导致最终容易在各个业务的接口处产生问题。而且,普通的压力测试,很难模拟真实用户的访问行为。
为此,刘海锋专门让团队开发了“军演压力测试机器人”。
这个机器人,就是模拟我们雇佣一亿人同时访问我们网站的行为。这套程序分布在全国各地,对我们的业务做全链路的读写混合压力测试。
如同军演一样,全链路的压力测试并不如想象般容易实现。例如,这样的演习不能使用真正的银行支付,不能影响真正的库存数量,不能动用真的物流。所以,和演习相关的所有上下游业务,都要设计一套虚拟系统。
在这套“军事演习”里,最重要的步骤就是“黄金链路压力测试”。所谓黄金链路,就是普通用户使用京东的“标准流程”,包括:登录,搜索,浏览,购物,结算,支付。这个链路,是双十一用户体验的最主要体现。京东的工程师们不断对这个链路进行测试,就可以发现很多存在的问题。
【黄金链路压力测试流程】
以上,就是京东保障正在看文章的你“剁手顺利”的五大法宝。仅仅是24小时的买买买,背后却涉及无数风险控制手段和资源调度模型。
正如刘海锋所说,
双十一是电商企业整体技术能力的一个缩影,各个电商在保障的过程中都会有一些插曲,正是这些小问题,让中国的电商行业不断地成长。