"618"作为京东一年最重要的大促之一,每年6月18日京东将遭遇记录历史级别的流量挑战。如何成功保障交易平台高并发高性能已经成为包括京东在内的众多电商念念不忘的念想,而京东作为国内电商领军企业之一,在架构积累上成就了如何领先的技术底蕴?
2016年7月15-16日, ArchSummit全球架构师峰会 将在深圳举行。本届大会,我们邀请了京东商城交易平台架构师李尊敬,前来分享 《京东交易系统618保卫战》 的内容,讲述的是京东数次架构升级的实践内容和期间遭遇了怎样的技术教训,以及更多地将讨论如何面对一年更胜一年的大促流量和阐述为此深耕多年的架构核心。
现在我们就来采访李尊敬老师,让我们看看京东给这个架构世界带来了怎样的惊喜吧?
李尊敬,京东商城交易平台架构师,负责京东商城购物车、结算页、订单中心等核心系统架构设计和重构工作。先后负责和参与过订单中间件系统去IOE、订单中心架构重构、多中心交易系统中订单交易系统设计和改造工作。对大流量高并发系统性能瓶颈诊断、架构重构和高可用方面有丰富的经验。
李尊敬:交易平台为京东商城提供交易平台化的服务,涉及到购物车、结算页、订单中心、促销价格、商品、库存等一系列平台化的服务,PC、APP、微信手Q都依赖交易平台提供的服务。我主要负责订单交易相关环节的技术保障、架构升级和性能优化等工作。
李尊敬:我接触过的系统中瓶颈点大致有以下几类:
木桶短板:CPU、网络、磁盘IO瓶颈通常都可以通过单纯增加资源、升级设备解决,但是数据库连接数容易形成木桶的短板。目前我们主要通过服务隔离和解耦、数据库垂直拆分、分布式数据库集群来解决连接数问题。
目前我们是通过全链路压力+全链路监控来实现快速发现系统瓶颈的,全监控链路实现对各层应用瓶颈点监控。
李尊敬:2014完成独立秒杀系统,将秒杀和交易主流程彻底解耦,解决了秒杀影响交易主流程的问题;2015开始诺亚方舟计划和多中心交易项目,分别实现了突发流量下系统弹性扩容和交易系统同城多活。
多中心交易项目核心功能需要实现MySQL数据库、Redis的多机房写的问题。在解决多写的问题上我们关注了开源社区的实现,例如Linkedin的Databus、阿里的Otter,在这些基础上自主实现了适合京东交易系统的组件。
架构升级改造经验和教训:架构升级最大的风险是业务风险,通常单纯的架构升级是不改变原有业务流程的,但是架构升级势必涉及到代码变更,因此架构升级后的系统功能性测试非常重要。交易平台多个系统架构升级采用基于用户流量比对测试方法,完成系统升级安全切换。
李尊敬:订单中间件系统是订单生产环节核心系统,早期存储用的Oracle,随着订单量的突飞猛进,Oracle数据库连接数和IO出现明显瓶颈。
我们去IOE的方式是将Oracle等商业存储设备换成MySQL集群方式。去IOE在架构上最大的工作量是SQL转换,Oracle和MySQL的SQL语法有差异,而且Oracle单机性能远好用单台MySQL,之前在Oracle跑的很好的SQL到MySQL会很慢。解决这个问题的方法是优化和拆分SQL,将压力分摊到客户端。
大量变更SQL业务风险很大,因此需要全方位的功能和性能测试。在这个项目中我们首次尝试将用户流量完整copy到升级后的集群,将订单生命周期全过程回放到新集群,然后通过比对新老集群响应结果进行性能和功能测试,很大程度上缩减了去IOE工作量。
目前交易核心业务都实现去IOE,立足点是满足业务的需求,同时节约成本,发挥最大的效率。这也是京东一直保持业务与技术双向驱动的态度:业务发展推动企业规模,进而规模的扩展推动技术成长;另一方面,技术创新的成果能够更有效地保证业务发展,甚至引领业务的发展,这一直是京东所遵从的原则。
李尊敬:去年"618"当天京东商城的订单量突破1500万单,实时价格、商品等核心接口峰值调用量达到上千万/分钟。去年"618"按照10倍流量标准备战,经过多次军演和预案演练,当天系统表现稳定。订单交易系统对数据一致性要求极高,像订单号、下单核心系统都是采用不带缓存的无状态化架构设计,采用水平扩展的方式对抗线上的流量。
对于订单中心等应用采用最终一致性原则来保障数据一致性。大促当天主要工作就是预案的执行,通过执行清洗恶意流量、分流和限流预案,降低系统负载,保障整个交易系统的高可用。
李尊敬:无状态化架构设计是指各服务之间完全独立,地位均等,不存在状态化数据交互和同步。无状态化最典型的例子就是WEB服务器。
无状态化的架构优点:天然高可用,可以水平扩展,底层依赖的数据不需要相互同步,无状态的架构是系统高扩展性的基石。交易平台订单号服务,接单服务等都是采用无状态化架构设计。
以接单服务集群为例,各个接单服务独立运行,数据完全独立,一台服务或者数据库宕机后会从服务中自动下掉,整个服务保持高可用。
无状态具体实现上的挑战是需要根据业务将系统拆解成底层数据相互独立的单元。要求SOA化的时候服务的力度要足够细,另外在有些场景下服务必须是有状态的,因此并不是所有系统都可以做到无状态。
李尊敬:每年"618"在春节后就会启动技术备战,通过完整的预案和演练来应对"618"的压力。架构层面我们准备的工作分成以下几点:
今年"618"和去年大促技术上准备有很大的不同,本次"618"交易系统全面接入到弹性云docker平台,诺亚方舟机房全面启用。接入弹性云后系统扩容和缩容变得更加简单和便捷。
为了保障从物理机到弹性云安全切换,我们在弹性云环境做了大量压力测试,针对弹性云环境做了参数调优和性能优化工作。今年也会启用多中心交易二期项目,多机房热备,同时承担用户流量。
在预测方面,我们通过最近单量的分布情况,以及促销力度和数量,结合机器学习算法实现对"618"当天单量以及核心系统调用量和性能预测。
李尊敬: 今年"618"交易系统面临的挑战有以下两点:
成倍增长的访问量对交易系统的挑战
交易平台核心交易系统按照20倍日常流量的规模来备战,通过全链路压测模拟在20倍流量的压力下系统的表现,事先找出系统薄弱点,提前做好系统的优化和扩容准备工作。对来自非正常用户的恶意流量将建立风险分级策略。
弹性云
今年"618"交易系统首次全面接入弹性云,为了保障交易系统在弹性云环境下安全稳定运行,我们在弹性云环境做了多轮全面压力测试,对于较难实现的部分通过写流量压测、采用憋单演练的泄洪的方式,用真实的用户订单来考验弹性云下的订单交易系统。
对应大促期间的洪峰访问,有几个基本技巧:
李尊敬:多中心交易系统设计类似实体商超:多个交易中心按用户分流,每一个交易中心建在不同地区,用户直接访问本地区的交易中心。多中心交易系统不仅响应速度快,用户体验更好,并且每个中心服务一定数量的用户,用户则不用跨地域访问数据中心,水平扩展性好,进一步降低单个中心的数据压力。多中心交易系统能支撑更大的交易规模,可支持异地容灾,进而降低灾难的影响和风险,更加安全。
数据一致性是实现多中心交易系统最大的挑战,数据写错了无法恢复。其次要保障用户从进入京东商城到浏览商品,到访问数据库,该全链路的路由规则都是完全一致的。
今年多中心架构在性能、可视化等多方面进行了较大的改进,而今年多中心交易主要有三个目标:
感谢陈兴璐对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们。