2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

  • 2016-11-13
  • 本文字数:3804 字

    阅读完需:约 12 分钟

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

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 )关注我们。

2016-11-13 18:005937
用户头像

发布了 26 篇内容, 共 10.1 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

一致性哈希算法实现

老姜

Java 线程池中的线程复用是如何实现的?

武培轩

Java 程序员 后端 线程池 源码解析

用进废退,增加能力熟练度与经验值,让你的技能再次精进。

叶小鍵

「深度解析」AI训练之数据缓存

焱融科技

人工智能 AI 存储 焱融科技 数据缓存

【Python】__name__ 是什么?

Leetao

Python Python基础

week05 学习总结 分布式缓存&消息队列&负载

Z冰红茶

干货 | 如何评估Kubernetes持久化存储方案

焱融科技

Kubernetes 容器 云原生 k8s

计算机操作系统基础(十四)---线程同步之条件变量

书旅

php laravel 操作系统 进程 线程’

第 5 周作业:一致性 Hash 算法

姜 某某

啃碎并发(二):Java线程的生命周期

猿灯塔

数据分析师成长体系漫谈--数据埋点

analysis-lion

数据分析 数据采集 埋点

啃碎并发(三):Java线程上下文切换

猿灯塔

架构师训练营第5周

大丁💸💵💴💶🚀🐟

springBoot集成rabbitmq并实现延时队列

生命在于折腾

RabbitMQ

联想来酷广谱化生存:后疫情时代的"硬核品牌"启示录

Geek_116789

一次非常有意思的 SQL 优化经历: 从 30248.271s 到 0.001s

Java小咖秀

MySQL 面试 后端 经验分享 优化逻辑

一致性hash的理解与实现

dongge

很多人毕业多年以后,还是改不掉学生思维

小智

职场 思维方式 高考

架构师训练营第五周课后总结

Cloud.

游戏夜读 | 关卡设计的难点

game1night

第五周作业

Linuxer

极客大学架构师训练营

这份高考卷,只有程序员能得满分...

程序员生活志

程序员 高考

SpringBoot 中使用 Filter 的正确姿势

Java课代表

女同事问哪吒什么是 Spring 循环依赖?我...

通天哪吒

架构师第5周总结

老姜

超详细!一文带你了解 LVS 负载均衡集群!

JackTian

Linux 负载均衡 运维 LVS 服务器集群

架构师训练营第五周作业

一剑

小师妹学JVM之:cache line对代码性能的影响

程序那些事

JVM 小师妹 性能调优 cache line 签约计划第二季

架构师训练营 - 第 5 课总结 -20200704- 技术选型

👑👑merlan

负载均衡 缓存 分布式数据库 架构设计 消息队列

一致性 hash 算法

Z冰红茶

一致性Hash算法

Ceph数据恢复初探

焱融科技

焱融科技 文件存储 分布式存储 数据恢复 Ceph

如何应对大促?看京东核心中间件团队的高可用实践指南_架构_李东辉_InfoQ精选文章