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

  • 李东辉

2016 年 11 月 13 日

话题:架构语言 & 开发ArchSummit架构师

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

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

受访嘉宾介绍

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

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

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

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

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

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

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

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

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

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

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

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

  3. 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:能否谈谈在大促期间中间件团队所做的工作?在接下来的大促会做哪些准备和调整?以前的大促遇到过哪些问题以及应对方案?

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

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

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

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

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

  5. 对发现的问题就改进优化

  6. 24 小时值班监控

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

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

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

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

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

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

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

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

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

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

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

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

InfoQ:感谢何小锋老师接受我们的采访,期待您在ArchSummit 全球架构师峰会分享的《京东核心中间件是如何支撑业务快速发展》


感谢冬雨对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

架构语言 & 开发ArchSummit架构师