写点什么

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

  • 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:005500
用户头像

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

关注

评论

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

AI时代要用俄罗斯套娃思考模式

FN0

AIGC

如何高效清洗数据?试试这款神器

博文视点Broadview

为了减少延迟和卡顿,我对 MySQL 查询做了这些优化处理...

Java你猿哥

MySQL sql ssm MySQL优化 优化SQL

如何将微前端项目部署在同一台服务器同一个端口下

京东科技开发者

微前端 京东云 企业号 4 月 PK 榜

成立数科公司之余,央国企推进数智化转型还需要底座支撑

用友BIP

JetCache 缓存开源组件设计精要

阿里技术

缓存 JetCache

阿里P8架构师3年心血终成的453页神级Java系统分析与架构设计文档

做梦都在改BUG

Java 架构设计 系统分析

Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践上——使用篇

江湖十年

k8s 后端 #Kubernetes# Go 语言

流程图哪个软件好用?10款好用的流程图软件推荐:boardmix、Visio、Miro…

彭宏豪95

效率工具 职场 工具 流程图 在线白板

浏览器缓存清理:Cookie for Mac6.9.0激活版

真大的脸盆

Mac Mac 软件 缓存清理 清理缓存 缓存处理工具

展心展力 metaapp:基于 DeepRec 的稀疏模型训练实践

阿里云大数据AI技术

机器学习 算法 稀疏模型

安全测试前置实践1-白盒&黑盒扫描

京东科技开发者

京东云 安全测试 企业号 4 月 PK 榜

一文了解MySQL中的多版本并发控制

京东科技开发者

MySQL 京东云 企业号 4 月 PK 榜

火了!阿里资深架构师总结的春招Java岗核心笔记,GitHub标星20k

Java你猿哥

Java ssm 面经 Java工程师 java核心知识

Java概述与基础知识

timerring

Java

五面阿里巴巴拿offer后定级P6:分享Java面经及答案总结

Java你猿哥

Java 面试 面经 春招 Java八股文

技术同学如何做好向上管理

老张

职场新人 向上管理

Spring 之依赖注入底层原理

Java你猿哥

spring ssm 架构师 Java工程师 spring ioc

这份Java面试八股文让329人成功进入大厂,堪称2023最强

Java你猿哥

Java 面试 面经 春招 Java八股文

DevOps infra | 互联网、软件公司基础设施建设(基建)哪家强?

laofo

DevOps 研发效能 持续交付 infra 平台工程

潮起风来,政企DICT “跃升”之乘风破浪篇

鲸品堂

DT IT 企业号 4 月 PK 榜 ct

华为运动健康服务Health Kit 6.10.0版本新增功能速览!

HMS Core

HMS Core

线上问题排查异闻录

小小怪下士

Java 程序员 后端 堆内存管理

MySQL主从复制原理剖析与应用实践

做梦都在改BUG

Java MySQL 数据库 主从复制

IT架构师全栈成长路线,13张架构图一次说明白

Java你猿哥

Java 面试 架构师 面经 Spring全家桶

一文吃透Arthas常用命令!

程序员大彬

Java JVM

MySQL自增ID用完了怎么办?4种解决方案!

Java你猿哥

Java MySQL sql 后端 ssm

MySQL主从复制原理剖析与应用实践

vivo互联网技术

负载均衡 高可用 主从复制 数据备份 Binary Log

“成本刺客”防不胜防,如何应用亚马逊云科技驾驭云成本

Lily

Redis一主二从环境搭建

京茶吉鹿

nosql redis

包装了三年工作经验的我,被同事发现居然连这些Maven的操作都不懂

Java你猿哥

maven ssm 架构师 Java工程师

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