JSF预热功能在企业前台研发部的实践与探索
作者:京东零售 李孟东
00 导读
企业前台研发部包含了企业业务大部分的对外前台系统,其中京东VOP平台(开放平台)适合于自建内网采购商城平台的企业客户。
京东为这类客户专门开发API接口,对接到客户内网的网上商城,将产品SKU直接推送到客户内网,客户内部采购人员可以直接在内网商城进行下单采购,订单信息通过API接口传递到京东后台,由京东安排物流配送服务。VOP模式下,客户内网的数据信息京东并不抓取,从而实现内部采购架构的独立搭建及数据的保密与安全。
随着业务的不断发展过程中,VOP截至目前已经服务于上千家企业Sass商城,其API接口的高并发、高可用、高可靠也就越发的重要。尽管我们如履薄冰的进行上线来尽可能的降低对接口的波动,但是发现,当下我们整个的上线流程中无损下线是没问题(NP层冷备机器直至无流量打进来,JSF层下线JSF服务),但是(自身&服务提供方)上线的瞬时波动都会或多或少引起我们系统的一阵报警。
这对于一个"夜黑风高" 即将回家的我们多大的伤害。毕竟每一次性能或者可用率的报警都牵动着我们作为技术的心血管(牵动着客户的投诉...)。
本文将从JSF1.7.6预热的实践测试报告中,真实的讲述预热给我们平台带来的体验和帮助,供大家参考。
01 背景
应用调用情况
场景一:对外服务,部分接口发布过程中出现了大量的 5xx 超时异常,根据和客户侧研发团队的沟通,大概确定在应用启动后的时间点,会有部分接口的超时请求。
场景二:服务提供者接口发布,机器启动后,会有调用JSF超时请求。
以上两种情况都会影响到服务的稳定性,进而引起我们系统的一阵(TP99/可用率)报警,如下所示:
【补充】这里同步一下检测工具:我们如何得知上下游是否存在部署事件。见:泰山平台故障分析模块,可以智能分析出上下游故障,或历史问题排查。
详细地址:
http://taishan.jd.com/faultAnalysis
帮助文档:
https://cf.jd.com/pages/viewpage.action?pageId=491274317
通过故障分析,我们发现我们所依赖的接口系统正在处于部署状态,也就是说其上线发布影响到了我们接口的稳定性。
02 预热管理实践
问题是显而易见的,那么如何发现问题本质,并找到问题通用性,进而解决问题,推广各平台,最终达到良性循环,是我们着重需要考虑的。
解决思路:JSF1.7.6版本特性三:预热策略动态下发,提升Provider实时治理能力 通过服务器其负载均衡的能力,对于上线需要预热的接口进行流量权重的调整,做到刚上线的应用按照对应所配置的规则进行小流量预热,使用方只需指定预热规则即可按照预期对刚上线的节点进行小流量预热。
当然新功能的引入,小至工具包升级,大至基础服务升级,都需要足够的测试实践和验证回归,一方面测试该功能是否符合我们的诉求,另一方面避免直接引入导致的一些未知异常。因此我们通过针对地址应用及自产自销的JSF接口进行测试实践,并形成以下报告。
机器配置
共计5台服务器 规格:4c8g
四台提供者:11.94.2.225,11.94.13.242,11.94.65.31,11.94.65.45
一台消费者:11.38.181.175
考虑到篇幅的问题,本文主要描述其中一个接口的上线情况,具体实践报告见:
https://joyspace.jd.com/page/LxPqDgcSA3GVjSYQRb73
涉及接口
HTTP接口(消费者):
https://bizapi.jd.com/api/area/getTown
JSF接口(提供者):
com.jd.ka.vop.soa.address.sdk.provider.QueryAddressOpenProvider#queryJdAreaIdList
测试流程
采用压力机,模拟调用对应接口,流量稳定后,模拟上线流程,按照50%的比例发布两台机器进行测试。
未设置预热管理
如下为流量稳定调用的UMP监控:
提供者监控
消费者监控
未设置预热发布上线
发布周期(15:40——15:44)发布机器比例50%
提供者监控
消费者监控
通过上方监控图,我们可以清晰的看出:
- 无损下线过程符合预期,并且下线过程中并没有出现任何报错。
- 报错和性能下降期间处于服务端应用成功启动后且注册成功后。
设置预热管理(流程同未设置预热情况)
配置地址:
http://taishan.jd.com/jsf/protection/index
补充:
- 权重和周期指的是初始权重到目标权重100,在预热周期内线性增长,流量在新节点逐渐增长的过程。(即:小流量预热)
- 在泰山流量防护页面中新增的接口配置,必须是拥有该接口权限才可以直接进行配置。
- 在泰山平台配置后,则直接面向所有消费者有效。当然也可以使用JSF的标签配置进行预热,就仅对自身服务器有效。
- 预热周期最大2min
这里有个小插曲,最初我设置的权重为:预热权重:10 周期:30000ms ,但是在测试结果中发现,效果并不明显,如下:
因此调整配置策略:预热权重1,周期60000ms。以此降低初始权重,增大预热周期。
设置预热发布上线
发布周期(17:36——17:40)发布机器比例50%
提供者监控
效果十分明显,如下:
03 总结
综上,性能波动影响,从直接发布的50%占比机器上看,配置预热后,其中一台影响下降了2.8——15倍左右;另一台机器上线性能波动几乎可以忽略(16ms)。(测试接口本身性能queryJdAreaIdList TP99 11ms左右)
故,经过评估:provider冷启动后的瞬时TP耗时高,调用波动大进而导致请求有损的问题,可以通过自动预热机制解决。
当然,根据目前行业的一些解决方案,无损上线功能远不止于此,期待JSF预热功能的能力与场景不断地大家的实践反馈中逐渐完善与丰富。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深入理解MySQL索引底层数据结构
1 引言 在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQL执行反而会没有变化,本文就从MySQL索引的底层数据结构和算法来进行详细分析。 2 索引数据结构对比 索引的定义:索引(Index)是帮助MySQL高效获取数据的排好序的数据结构。 索引中常见的数据结构有以下几种: Hash表 二叉树 红黑树 B-Tree B+Tree Hash表 通过索引的key进行一次hash计算,就可以快速获取磁盘文件指针,对于指定索引查找文件非常快,但是对于范围查找没法支持,有时候也会出现Hash冲突的情况。 二叉树 二叉树的特点:左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据。如下图所示,如果col2是索引,查找索引为65的行元素,只需要查找两次,就可以获取到行元素所在的磁盘指针地址。 但如果是一个按照顺序递增的值,例如为col1建立索引,不再适合...
- 下一篇
架构师日记-如何写的一手好代码
作者:京东零售 刘慧卿 一 前言 在日常工作中,我经常听到部分同学抱怨代码质量问题,潜台词是:“除了自己的代码,其他人写的都是垃圾,得送到绞刑架上,重构!”。今天就来聊一聊,如何写的一手好代码。要回答这个问题之前,得先弄清楚一个问题,好代码的标准是什么?易阅读,可扩展,高内聚,低耦合,编程范式,设计原则......,要求不少,却很难度量。实则代码和文章一样,正所谓文无第一,武无第二。 这里不打算从规则宝典,最佳实践等方面入手,因为那将陷入到无数的规则细节中去,容易不得要领。这也是很多同学,学了很多当下最新技术,掌握了N门编程语言,却始终没有明显提升的原因。对于技术而言,底层的原理和运行规律是根本,它和编程语言,语法等应用层的重要程度是不一样的,切记不要进入这个误区。 技能的掌握一般需要经历学习、模仿、思考、创新四个过程,下面就分几个阶段来探讨一下,到底该如何快速学习成长。 二 学习出来的代码 学习意识 如果说人生有什么捷径,寻找前人走出来的路,就算是捷径了吧。前人需要花了几年,甚至穷其一生研究的成果,摆在那里,用还是不用?答案应该是肯定的,接下来要做的,只是如何把它们找出来,结合当下的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker安装Oracle12C,快速搭建Oracle学习环境