如何应对大促?看京东核心中间件团队的高可用实践指南

标签:中间件

访客:6136  发表于:2016-12-12 09:56:07

每次大促都是考验各电商架构的最好时机,然而一般电商大促时,我们可能更关注系统架构如何降级如何限流等经典手段。而京东作为中国互联网电商主角之一,我们看看中间件技术如何撑起京东每一场大促的。

2016年12月2日-3日,ArchSummit全球架构师峰会将在北京国际会议中心举行。本次大会设置了《电商专题:系统架构如何应对业务爆发式增长》和《阿里双11技术架构突破》专题来深入解读双11等大促背后的技术故事,其中邀请了京东商城中间件负责人何小锋老师前来分享《京东核心中间件是如何支撑业务快速发展》,我们借此机会采访了何小锋老师,他为我们带来有关中间件的演进思路,希望可以为大家带来启发,如果读者想了解更多京东中间件的技术细节,欢迎报名参加ArchSummit北京站并与何小锋老师进一步交流。

受访嘉宾介绍:

何小锋,京东商城中间件负责人,拥有18年的研发经验,喜欢技术,追求卓越。2011年加入京东,目前在京东商城负责中间件技术部门。入职京东后,担任了京东两届架构委员会常委,先后带领团队自主研发高性能的消息平台,落地基于Docker的国内最大的弹性云。在京东期间支持过多次的618和双11大促,见证了京东的技术演进过程,在弹性计算、中间件、大并发分布式系统等方面积累了丰富的实战经验。

InfoQ:您拥有18年的研发经验,能否介绍这段时间自己的程序员经历?是否面临过几次关键选择?

何小锋:18年,一直没有脱离Coding,积累了很多的系统架构经验,在2011年加入京东,被京东面临的技术挑战所吸引。整个coding生涯中有过2次关键选择:

从传统的电子政务行业转到互联网行业;

选择了京东,给自己一个挑战发挥的平台。

由于自己很喜欢技术,而且喜欢中间件、高并发分布式和弹性计算这三大领域本身带来的技术挑战,目前这些技术已经是公司的核心支撑系统,是京东抗大流量的关键。

另外这几大领域需要掌握软件、操作系统、硬件和网络等多方面的知识才能更上一层楼,并且有很多需要专研的地方,需要长时间的专注才能做好。

InfoQ:中间件技术部门承担了怎样的任务和职责?落地基于Docker的弹性云给部门带来怎样的影响?

何小锋:中间件技术部门承担中间件研发和运维支持工作,确保现有系统稳定,持续优化满足业务需求,跟进业界技术发展,孵化新的中间件产品解决业务问题。

目前京东中间件最核心的3大产品如下:

JSF,自主研发高性能分布式的RPC微服务框架,是京东服务化、开放化的技术标准;

JIMDB,自主研发高性能分布式的缓存,基于Docker架构,具有弹性伸缩、快速故障迁移等能力;

JMQ,自主研发的高性能分布式的消息队列

弹性云落地对中间件研发架构有很大的促进,JIMDB基于Docker实现弹性伸缩能力。另外中间件还要适应容器的环境,如准确获取CPU数量便于控制线程数,避免频繁的线程切换。流量均匀也是后续要改善的方向,容器的规格小,前后申请不一致,物理机硬件配置不一样,造成每个实例的承载能力不一样,需要中间件能自动负载均匀。

InfoQ:目前京东微服务框架JSF调用规模在日常和大促时分别处于什么量级,JSF的主要核心部件如何实现高可用?

何小锋:JSF日常调用在千亿规模,大促期间会翻2-5倍。


如何应对大促?看京东核心中间件团队的高可用实践指南

实现高可用方面,以注册中心为例,注册中心以异步持久化到数据库中,通过本地全量缓存来提升性能,节点直接通过事件总线同步,可以做到横向扩容。如果数据库宕机,可以通过缓存继续提供读取服务。

另外每个机房都会部署若干节点,客户端通过目录服务优先拿到本机房的注册中心节点列表,后续通过定时更新注册中心列表。

当服务有变化的时候,注册中心回调客户端,推送变化给客户端,客户端会在内存中缓存一份服务地址,在本地会存储一些备份文件。如果注册中心连接不上,客户端可以依赖本地缓存继续调用。

监控中心提供的是JSF服务,数据直接通过ES存储。

实现高可用过程中为了深挖单实例性能,我们做了优化序列化协议,传输数据进行压缩,并且通过RingBuffer进行组提交,采用NIO/EPOLL,优化线程模型,提升并发能力。

InfoQ:JSF目前是否还存在瓶颈?

何小锋:JSF到目前已经很成熟,性能、稳定性和易用性都很高。

JSF提供了强大的服务治理功能,包括常见的分组、上下线、黑白名单、路由等,也做到了例如动态分组、同机房优先、配置下发、调用限流、授权调用等等功能,并且开放了部分服务治理API,供开发者自行调用。

JSF未来会持续在治理和监控上进行改进,完善分布式跟踪,便于快速定位问题。另外HTTP网关会通过支持HTTP/2协议来优化性能。

InfoQ:目前京东消息中间件从开源软件的JQ、ActiveMQ发展到自研的JMQ,能否简述这段演进过程?基于怎样的判断和背景会开始对下一代的筹备?

何小锋:JQ严格意义上来说还算不上一个消息中间件,它基于数据库实现,当时的用户也比较少。

随着公司SOA化工作开展,迫切需要成熟的高可用消息中间件来支持,我们采用开源的ActiveMQ来作为第一代分布式消息平台。在其基础上做了一系列的平台化改造,包括应用治理、监控报警、分布式客户端、归档、重试、存储复制,我们对这些功能也进行了优化和更新。

随着业务量的快速增长,它的性能成了很大的瓶颈,存储逻辑复杂,消息积压后对性能影响很大,已经很难进行优化。通过积累的研发和运营经验,我们决定自助研发JMQ。JMQ在存储、网络通信、消息处理、数据复制等方面进行了很大的优化改进。另外在升级的过程中,考虑了兼容性,例如JMQ兼容AMQ客户端协议,做到了平滑过渡。

为什么没有一步到位?每一代消息中间件都是基于业务的发展需要的,京东这些年发展之快,业务又有其不确定性,所以我们在这过程中也是不断的探索,不断的重构。

至于何时开始下一代消息中间件的筹备,我们会主要基于高可用、性能和自动化运维瓶颈等方面考量。JMQ我们目前正在做兼容Kafka协议,大幅提升自动化运维能力,减少备战工作。

InfoQ:以您的判断来看,互联网企业是否会逐渐摆脱开源软件的依赖,走向自主研发以获得彻底的掌控力?

何小锋:这个是根据业务发展的需要的,成熟稳定的开源系统还会持续支撑,满足不了需求的开源软件会逐步被自研替换。我的建议是控制好收益,加强内外交流,最后要回馈开源社区。

InfoQ:JMQ在大促时能处理多少的写入、投递高峰?后端消费不稳定的情况下如何保证消息投放稳定?

何小锋:JMQ在大促时单个分片同步复制和刷到磁盘,能达到写入1K消息,TPS可以超过4万每秒。针对日志等场景,通过配置异步复制和刷盘还可以大幅度提升性能。我们预计整个平台,双11当天消息投递量会达到千亿规模。

消费者采用拉模型,处理速度完全由消费者控制,如果处理速度慢,消息会保留在服务端,保留时间为2天。由于大促的需要,每个系统都会进行大流量压测军演,不会存在2天都消费不了的消息。

JMQ的存储模型,消息积压在服务端,对写入和消费性能没有影响。积压了会给用户进行报警,如果存储空间不够了,会停用当前实例的写入,进行扩容。

InfoQ:能否谈谈在大促期间中间件团队所做的工作?在接下来的大促会做哪些准备和调整?以前的大促遇到过哪些问题以及应对方案?

何小锋:中间件会成立专门的项目来推荐大促的备战工作,主要包括如下几块工作

系统梳理工作:整理现有部署架构,核心客户,每日巡检;

部署扩容:资源评估、核心客户扩容、容灾部署;

应急预案:整理和评估应急预案;

压测演练:模拟故障演练,性能压测;

对发现的问题就改进优化;

24小时值班监控

每次大促发现的问题都会作为后续研发改进的需求,例如AMQ性能不好,后续自研JMQ。

面对以后的大促,我们会大幅提升自动化运维来满足大促的需求,包括弹性扩容,更丰富的监控报警,更迅速可控的故障切换、自动化容灾、核心客户物理隔离等等。

另外随着业务的发展,如何更好地支持业务海量数据缓存需求,我们也在规划新版的JIMDB。

InfoQ:能否简单概述自动扩容缩容中数据迁移的技术原理?中间件实现快速故障切换和弹性伸缩能力的难点在哪里,最后如何解决的?

何小锋:JIMDB提供基于Docker的弹性伸缩能力。目前JIMDB一个分片有2G内存数据,当需要迁移时,节点会先把已有的数据按照一定的规则全量复制一份到新的shard上,在全量复制过程中会有增量的数据产生,这部分数据另外保存一份到指定的缓冲区中,当全量复制完成后马上同步缓冲区中的数据,当缓存区中需要同步的数据比较少时,会阻塞待分裂节点的写入直到增量数据也同步完成。

快速故障切换和弹性伸缩能力的难点主要如下:

1.准确及时的故障定位,包括软件宕机、网络、硬件等方面的故障。我们通过Agent秒级采集监控数据,对新出现的故障通过录入关键词来自动学习,宕机/网络不通则采用多个决策者投票决定。

2.资源的合理调度,包括容灾,确保资源调度均匀、并发控制,核心业务做到隔离,相关的具体实践有:

应用接入的时候要完善信息,能识别是否是核心业务,是否需要隔离,业务的吞吐量需求等等;

通过资源标签来匹配满足业务的资源;

通过识别机房、机架信息来满足容灾的需求;

通过资源乐观锁来实现对相同资源的并发控制。

评论(0)

您可以在评论框内@您的好友一起参与讨论!

<--script type="text/javascript">BAIDU_CLB_fillSlot("927898");