京东商城交易平台的高可用架构之路

《京东商城交易平台的高可用架构之路》要点:
本文介绍了京东商城交易平台的高可用架构之路,希望对您有用。如果有疑问,可以联系我们。

京东商城

作者:王晓钟

编辑:木环、郭蕾

据腾讯科技报道,6 月 18 日零点,京东全民年中购物节拉开了高潮的序幕.第一个小时的销售额超过去年同期的 250%.从凌晨开始的海量订单让 6 月 1 日就拉开序幕的京东年中购物节奏出最强音,大量用户瞬间涌入,峰值订单被不断刷新.为了应对如此大规模的流量增长,京东研发团队几乎全年都在高筑墙、广积粮,一直着力从技术层面为用户提供流畅的交易体验,以保证在峰值交易时期系统的高可用性.在京东整个电商体系中,交易系统占据着其中的半壁江山,购物车、结算、库存、价格等相关的环节都包含在其中,可以说交易系统的高可用能力基本上决定了整个京东商城的高可用能力.在过去的一年时间里,京东的交易系统做了哪些迭代和优化?今年又有哪些创新?整体的交易系统规划是怎么样的?InfoQ 记者带着这些问题采访了京东商城交易平台高级总监王晓钟.

受访嘉宾介绍

王晓钟,京东商城交易平台高级总监,京东交易黄金流程与智慧营销生态系统的掌舵人,带领的产品与研发团队为京东商城提供了核心交易的系统保证.

InfoQ:能否整体介绍下交易平台目前的架构体系?

王晓钟:交易平台负责商品、价格、用户、库存、订单等电商核心基础信息的中心化管理,以及对购物车、结算页、优惠券 / 礼品卡、订单中心等黄金交易流程的管控和平台化服务.交易平台致力于技术改变生活,打造智慧营销的交易平台.为用户提供黄金交易流程;为客户提供智慧营销解决方案包含促销建议、智能库存定位等智慧营销工具;为研发团队提供稳定、可靠的交易服务.

架构

  1. 渠道 是交易的流量入口来源,目前主要包含几大部分,PC、APP、微信、手 Q 等.目前 APP 入口已经占据了整体流量的 70% 以上.
  2. 组件 完成对现有基础服务的抽象与整合,将现有服务资源以多元化的方式展示给外界,灵活的组织并支持多种协议的交互,最终实现了系统的模块化、服务平台化、功能配置化.组件最大限度的减少外界对内部逻辑的耦合,从而实现对需求快速响应.
  1. 基础服务 位于整个黄金流程的最底层,其扮演者交易平台心脏的角色.其中商品服务、价格服务、库存服务、用户服务、购物车等更是核心中的核心.
  2. 中间件、基础设施 是基础服务的基石,对业务系统提供高性能,高可用的技术支撑.

InfoQ:过去一年,交易平台在保证底层的基础平台稳固方面做了哪些事情?有哪些点读者是可以参考学习的?

王晓钟:除了我们一直在做的、已经形成常规的工作,比如线上压测、性能优化、扩容、故障切换、限流、降级之外,过去一年,我们在系统维稳方面做了一些精细化的工作.

  1. 核心调用链监控.在黄金交易流程中的各个服务入口点和服务相关依赖、调用方等进行联合监控.当服务性能下降、可用率下降时,可以快速的定位到故障点.把监控和故障解决方案联动起来,比如一键切换、服务降级、限流等,可以快速的发现和解决问题.
  2. 自动切换.对于成熟的切换流程,比如数据库、缓存、服务等节点的客户端,当检测到故障时,可以根据策略自动切换到健康的节点,同时在故障节点恢复后自动切换回来,减少人工操作的错误和耗时,提高系统的可用率.
  3. 异步化编程模式.部分服务通过彻底的异步化改造来提升吞吐量,还是有一些效果.但是由于纯异步化对于现有系统的改造还是挺大的,所以目前还在尝试前行阶段.
  4. 共享资源池.提前准备一些资源共享池,各服务混用,平时设置较低的权重.当某个服务的常规资源组不足时,则增加其在共享池中的权重,这样可以快速的使用资源,而不用临时扩容.
  5. 全链路压测.从入口开始模拟用户的行为进行压测,流量通过依赖传递,从浏览、搜索,到提交订单以及最后的生产,自动覆盖到链路中的所有环节.配合上面提到的核心调用链监控,解决以往只是单服务的压测,覆盖面不全的问题.

随着业务的发展,功能的复杂度也在不断增加,定位故障原因变的困难了起来,很多时候线上发生故障大部分的时间都在定位问题,故障的解决只要有预案就可以很快处理.调用链监控就很重要,可以站在全局的角度,快速的定位问题,和故障预案处理结合可以解决我们的痛点.

随着服务的不断扩容,机器数量的增加,出现问题时,故障修复的速度变慢,自动化的故障切换可以使人工解放出来,处理更重要的事情,可以让大家不用总是在半夜起来处理故障.

InfoQ:目前交易平台的服务是依据什么维度进行划分的?

王晓钟:目前交易平台主要依据业务能力来划分服务的:购物车、结算页、促销、价格、库存、商品、用户等,为 PC,手机,微信等渠道提供高可靠的大中台服务.

这种划分模式好处在于:

  1. 架构稳定,因为业务能力相对稳定和相互独立.
  2. 开发团队是自主的,围绕着交付业务价值而不是技术特性来组织.
  3. 服务之间共同合作,松耦合.

InfoQ:能否分别从业务、系统、基础设施三个层面谈谈你们的监控体系方案?

王晓钟:在京东这样的大规模分布式系统面前,每时每刻服务器可能都宕机,网络随时可能都在抖动,大量接口调用量日均过亿,同时具有流量聚集效应的促销每天都会有好几波,如果没有一套强大的监控体系,我们就像睁眼瞎一样.经过多年的努力,京东目前已经形成多套监控系统,建立了比较完善的监控体系,时刻监视着系统的健康状态,并在发现问题时第一时间进行预警:

1)业务层面的监控,主要是核心业务指标,比如实时订单量,并按渠道、省份、运营商、机房、品类、活动等各个维度进行细分,从而在及时发现核心业务指标变化的同时,能够快速定位、排查问题,并做出应急响应.

2)系统层面的监控,主要是方法或代码块的调用量、成功率以及响应时间.同时,不同语言平台有特定的监控指标,例如 Java 应用,我们也非常关心 JVM GC 情况.这些指标我们会按实例、集群、机房等进行逐级汇总计算.对于响应时间,我们更关心的是 TP99 甚至 TP999 任何一指标低于预设阈值都会触发报警.在采集单一接口性能数据的基础上,我们将请求访问链经过的一系列子调用串起来,包括 RPC 服务之间、访问缓存、访问数据库等等,实现调用链条薄弱环节的快速发现,快速解决.

3)基础设施的监控,主要是网络质量和机器健康度的监控,像常规的带宽、丢包率、重传、连通性,CPU、内存、磁盘等等.在网络方面,除了内网,我们也非常关心公网网络质量,一旦发现运营商或者区域故障,就会做立即出预案响应,7*24 小时确保用户购物体验.

在监控指标完善的同时,我们更多在解决监控自身的延时性.京东自身访问量大,所以在提高监控的延时性同时又不能影响业务自身性能,本身就是就一个挑战.目前我们在业务层面、系统层面都做到了秒级粒度,基础设施方面的重要指标也有了秒级数据.在预警方面,除了传统的邮件、短信,我们集成了京东内部 IM 工具,同时还有手机语音呼叫.

在这么多指标,这么精细的数据面前,传统的监控仪表盘也会让我们再度迷失,因此我们开发了天眼系统进一步将各个监控子系统进行集成,结合前述的调用链,在一个大屏上多个核心主流程的各环节、各调用层次的当前健康状况一览无遗,一旦有故障我们可以在短时间内快速响应并恢复.

InfoQ:对于恶意的流量攻击,京东做了哪些准备工作?准备如何预防?

王晓钟:恶意流量攻击,是每个互联网企业都必须面对的难题.目前我们把流量攻击分为两大类:网络协议层和应用逻辑层.

网络协议层的,主要是 SYNFlood、UDPFlood、DNSFlood、HTTPFlood 这些 4 层或 7 层协议的各种流量攻击,主要以带宽或服务资源消耗为主.目前我们通过京东云平台自研的流量分析和清洗系统能够防御主流的恶意流量攻击.除此之外,信息安全部门也会联合外部力量进行上百 G 的流量攻防演练,确保合作和联动等实战能力.

应用逻辑层的恶意流量的范围和影响则比较广泛.狭义上,恶意流量利用应用系统的软件漏洞,做拒绝服务攻击;广义上,能够利用应用的实现逻辑或规则漏洞,非法实现各种商业利益的,无论流量大小,都属于恶意流量攻击.这一大类型攻击由京东的多个部门配合进行整体防御.

1)信息安全部门会通过开展安全自查和外部合作报告漏洞的方式,由各业务研发部门实施安全漏洞消除,比如 SQL 注入、代码执行、水平越权、信息泄露等.    2)风控部门会通过数据分析,建立各种等级的风险控制模型,形成动态的不同风险等级的账户池,供业务系统使用.    3)业务研发部门则根据业务特性、用户风险等级、系统压力等因素,提供不同策略的限流实现.

InfoQ:以商品的实时价格为例,聊聊你们的读逻辑和写逻辑流程?

王晓钟:京东实时价格面临几大挑战:一是数据量大,几十亿的商品;二是调用量大,日峰值上百亿;三是实时性要求高;最后是业务复杂度高,并不是单一的京东价,不仅要综合计算各类促销规则,还要对 PC、手机、第三方合作渠道以及区域进行差异化运营.这里,我们运用读写分离、异步化策略,选择支撑大并发、高性能的开源组件进行设计,确保可水平扩展、高稳定性.

京东

1)写逻辑流程:当采销在后端调整价格或建立促销时,同步写入 MySQL 数据库,然后通过异步任务更新促销主 Redis 数据,并同时更新价格主 Redis 的过期时间戳,通过 Redis 自身复制机制,将数据传播到从节点.2)读逻辑流程:当用户在前端浏览商品列表、详情等页面时,异步访问价格实时服务,此时内嵌 Nginx 的 Lua 程序直接读取本地 Redis(从)中的价格数据,无过期则直接返回用户;若过期或不存在,则回源访问价格实时计算服务,即刻返回最新价格给用户.3)回源写逻辑:价格实时计算服务读取促销主 Redis,在返回最新价格给用户的同时,异步写价格主 Redis 集群,价格主 Redis 同步数据至前置 Nginx 节点的从 Redis 节点.

InfoQ:今年 618 京东的交易平台都做了哪些技术上的改进或者创新,以及未来将会考虑哪些优化和升级方向?

王晓钟:除了上面提到的主要用来维护系统稳定的技术改造之外,今年交易平台也投入了更多的精力在做提升用户体验、提升 GMV 的改进和创新工作.比如利用大数据技术和机器学习模型,来提供千人千价、千人千促的体验.

我们也在尝试利用大数据和机器学习等在系统维稳上做一些工作,比如:

1)SQL 注入和恶意代码执行方面引入了机器学习模型,通过对已有的攻击行为进行学习,训练特征.引入半监督学习,让模型可以通过学习,自动发现新型的攻击.大大提高了攻击的发现效率和新攻击的识别能力.各项指标已经完全超越传统的规则识别.

2)使用有向图模型对恶意攻击进行溯源检测,更加准确快速的进行溯源分析,并且得到了非常好的效果.

下一步,我们会继续尝试在这个方向上做一些创新,比如:

1)在人机行为检测方面进行优化.使用聚类和 nlp 模型对恶意刷单行为进行识别,提高恶意刷单行为的验证级别,从而极大地降低后台接口压力.

2)评论价值评定模型,识别真实评论和刷出来的评论.让评论产生更大的价值.

3)我们将在故障智能预测上进行探索.目前很多监控和预警都是事后的,我们希望能做到事前.通过分析历史性、周期性故障数据,结合当前实时健康度,快速识别出“濒死”的机器、实例,真正做到监控预警智慧化.

原文来自微信公众号:聊聊架构

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


起步 处理器架构,参考 x86是指intel的开发的一种32位指令集 intel和amd早期的cpu都支持这种指令集 AMD比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64 Intel选择了设计一种不兼容x86的全新64为指令集,称之为IA-64,后来支持AMD64的指令集,
pscp pscp -P 22 C:\work\test.txt root@192.168.1.5:/home/data pscp -P 22 root@192.168.1.5:/home/data/test.txt C://work// 检索 find / -name default.config
文件处理 ls -a # 显示所有文件 ls -l # 显示详细信息 ls -d # 显示路径 mkdir /目录名称 # 创建目录 cd /目录名称 # 切换目录 pwd # 显示当前路径 rmdir /目录名称 # 删除目录 cp -rp [目录名称] [目标目录] # 复制目录到目标目录 cp
准备一台电脑(我就用联想拯救者r7000演示) 参考博客制作启动盘 插上U盘,启动电脑,一直按F2 进入如下页面后,将U盘设置为第一启动项,点击exit,保存并退出 之后进入如下页面,选择第三项 进入如下页面,选择第四项 进入如下页面,选择第一项,选中后,先不要点Enter 按e键,将inst.st
认识 Linux系统是参考了UNIX系统作为模板开发的,但没有使用UNIX的代码;是UNIX的一种,但不是衍生版 在Linux内核的基础上开发是发行版 分区 逻辑分区永远从5开始 步骤 挂载:可理解为分配盘符,挂载点即是盘符名;不同之处:Linux中是以空目录名称作为盘符 Hda 第一块硬盘 Hda
文件处理命令 以 . 开头的文件是隐藏文件 以 - 开头表示这是一个文件 以 d 开头表示是一个目录 以 l 开头表示是一个软链接 第一个root是所有者,第二个root是所属组 ls -h 以文件默认大小后缀 显示 ls -i 查看i节点(唯一标识) 所有者:只能有一个,可变更 所属组:只能有一个
参考 01 02 03 前提环境 本地安装VirtualBox,并安装CentOS8,配置网络后,window系统上putty能连接到CentOS8服务器 配置步骤 右键服务器复制 启动复制后的服务器,查看ip和hostname发现和原来的服务器一样,需要修改 hostname # 查看主机名 vi
文件搜索命令 星号匹配任意字符,问号匹配任意单个字符 -iname 根据文件名查找且不区分大小写 -ok 命名会有一个询问的步骤 如果没有找到指定文件,可输入命令:updatedb 更新文件资料库;除tmp目录不在文件资料库收录范围之内 locate -i 文件名 # 检索时不区分大小写 which
安装环境 安装最新版的Virtual Box,点击安装 下载centos8镜像 创建虚拟机,可参考 选择下载到本地的镜像 设置启动顺序 点击启动 启动过程中报错:“FATAL:No bootable medium found!” 1.没有选择iso镜像 2.光驱没有排在第一位置 3.镜像只能选择x8
Linux严格区分大小写 所有内容文件形式保存,包括硬件 Linux不靠扩展名区分文件类型 挂载:将设备文件名和挂载点(盘符)连接的过程 Linux各个目录的作用 bin表示二进制 服务器注意事项 远程服务器不允许关机,只能重启 重启时应该关闭服务 不要在服务器访问高峰运行高负载命令 远程配置防火墙
IDE连接Linux,上传下载文件 参考1 参考2 连接Linux 上传下载文件 本地项目打包后上传 查看是否上传成功,右键下载 补充 后端项目开发完成后,需clean掉临时文件target文件夹,且只推送修改过的文件 前端项目开发的过程中,需要在每个子组件中使用scoped,确保每个子组件中的编码
起步 LTS与普通版本的区别 LTS版本的发布周期更长,更加稳定 安装jdk sudo mkdir /usr/lib/jvm # 在Ubuntu中创建目录 pscp D:\安装包\linux源码包\jdk-8u291-linux-x64.tar.gz chnq@192.168.0.102:/tmp
前言 最近在b站上看了兄弟连老师的Linux教程,非常适合入门:https://www.bilibili.com/video/BV1mW411i7Qf 看完后就自己来试着玩下,正好手上有台空闲的电脑就尝试不使用虚拟机的方式安装Linux系统 安装步骤 制作启动盘 下载ISO镜像,我这里下载的是Cen
新建虚拟电脑 设置内存和处理器 设置硬盘大小 完成 设置 查看光驱 设置启动顺序 点击启动 选择第1项 进入图形安装界面 选择安装位置,开始安装 设置root密码 重启 登录 查看本地文件夹 配置网络,点击设置 查看宿主机ip C:\Users\ychen λ ipconfig 无线局域网适配器 W
源码包安装需手动下载后安装 二进制包则在package目录下 rpm命令管理rpm包 若某个rpm包依赖于某个模块,需要到网站www.rpmfind.net查询该模块依赖的包,安装这个包后自动安装模块,之后就能安装rpm包了 安装升级时使用包全名 查询卸载时使用包名 虚拟机中的Linux系统安装rp
首先进入命令模式,再输入以下命令 命令模式用于输入命令 插入模式可对文件编写操作 编辑模式下的命令是在冒号后输入 :12, 15d # 删除指定范围的行,这里是删除12到15行 :n1,n2s/old/new/g ## 表示从n1行到n2行,old表示旧的字符串 vim使用小技巧:自定义快捷键,如快
使用源码包安装,需要自己指定安装位置,通常是 /usr/local/软件名/ linux中要想启动执行文件,应使用绝对路径 /绝对路径/rpm包名 start ## 执行方式一 service rpm包名 start ## 执行方式二 使用源码包安装后,由于自定义安装路径,就不能使用service命
网络命令 在收邮件的用户中,输入 mail 可查看邮件信息,输入序列号查看详细信息 在mail命令下,输入h 查看所有邮件的列表 输入:d 序列号 # 删除邮件 last # 统计所有用户登录或重启时间,用于日志查询 lastlog # 显示包括未登录用户的登录时间 lastlog -u 用户id
若要使用yum管理,必须能连接网络,首先配置网络IP 进入yum源文件中启动容器 使用yum源头安装rpm包不需要进入package路径,同时也不需要使用包全名,会有yum自动管理 安装软件组
简介 client即是本机安装的docker,相当于git Docker_host相当于centos系统 registry则是docker仓库,相当于GitHub 镜像用于创建docker容器,一个镜像可以创建多个docker容器 容器是由镜像创建的运行实例,(镜像相当于类,容器相当于类创建的对象)