​业务背景

“二方包升级难!”

“XXX升级后,项目起不来了!”

“这次就升级了XXX,外网运行就报错了!”

问题解析

推动应用升级二方包困难,应用本身升级困难,这是19年H1在推动中间件二方包升级过程最大的槽点,那么升级过程究竟碰到了什么问题呢?从上面的截图看主要归类为2点

  • 应用编译过程就报错

    • 中间件依赖的二方包和业务依赖二方包的版本冲突,这个被依赖的二方包本身是不兼容升级,比较容易出现这个问题
    • 中间件二方包升级的版本不一致,比如有些功能需要hunter和soa配合升级
    • 中间件二方包的不兼容升级
  • 应用运行后报错
    • 运行期的二方包问题,这种问题会比较难以发现,问题表现为各种FoundError&Exception

我们不妨看看背后类的选择和加载做了什么工作1.对于java应用来说,一般是使用maven来做依赖管理的,maven的特性说明3点

  • 多个版本存在时,采用最短路径原则和优先声明原则,如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用
  • 直接的指定手动创建的某个版本被使用
  • 依赖树可以直接通过mvn dependency:tree命令或者更方便的pom dependency analyzer查看

2.完成类的选择,类是如何加载的呢?

class字节码通过ClassLoader被转换成内存中的对象,这个转换过程采用按需加载的原则,即用到该类才加载

JVM运行实例会存在多个ClassLoader,这些ClassLoader是如何加载类的呢?

  • JVM内置3个重要的ClassLoader

    • BootstrapClassLoader
    • ExtensionClassLoader
    • AppClassLoader
  • ClassLoader加载类遵循双亲委派模型

所以,二方包升级过程碰到的ClassNotFoundException、NoClassDefFoundError、NoSuchMethodError、ClassCastException、LinkageError问题都可以解释了,加载了非预期的二方包导致的各种冲突和异常

二方包稳定性测试

有了上面的铺垫,回归主题,二方包稳定性测试特性在哪里呢?一样的方面就不再赘述了如研发单测、监控手段等

兼容性融入测试流程

我们已经了解了二方包在升级过程中存在的问题,那么有什么方法来降低升级的成本,提前测试二方包的兼容性呢

  • 运行前
  • 白盒静态检查
    • 采用了基于javassist的开源工具japicmp,静态检查本次升级的二方包的改动,包括new+modify+delete的class、method、constructors
    • 将静态检查过程已经通过moon融入到测试流程中,帮助测试识别潜在的风险
  • 版本依赖检查
  • maven的依赖树非常好用,确认升级的各个中间件版本一致
  • 运行期
  • 前面提到,有些兼容性问题只有运行期才会发现,暂时没有一劳永逸的方法,提高接口测试的覆盖度,通过接口测试来触达可能的潜在问题

上面提到的测试手段,本质并不能解决中间件二方包和业务二方包冲突的问题,因此中间件团队已经在调研实现类隔离的方法,从本质上解决这个问题

探究二方包测试覆盖率

业界主流的测试覆盖率工具jacoco用于应用的测试覆盖率的收集,这个能不能收集二方包的测试覆盖率呢?答案是可以的!此处感谢@石塘一起验证二方包覆盖率过程

  • 方法

    • 原理清楚了,需要做的是把对应的二方包数据整合
    • 准备三件套
  • 将二方包测试覆盖率已经通过moon融入到测试流程中
  • 理想是丰满的,现实然并卯,运营运营

性能测试

会有同学疑问,二方包是怎么做性能测试的,二方包性能测试的关注点在哪里?这个问题可以从一个P0故障开始说起...

  • 首先需要说明,中间件的二方包使用是基于应用的,所以性能测试也是基于应用的。目前在做的二方包的性能测试主要是soa和hunter,测试应用是网关site & 被测应用soatest
  • 测试路径
  • 测试指标

重点需要关注内存,进程内存和机器内存的使用情况,内存使用逻辑非常复杂。如果在测试发现问题,需要根据问题具体分析,这里说的是二方包性能测试,就需要关注有没有因为二方包引起类似这个故障的内存泄露问题

  • 性能基线

    • 由于基础设施的问题,像网关这样大并发的性能基线暂时不能自动化,手工测试的过程也比较复杂,好在网关也不是隔山差五的升级版本
    • 应用的中间件性能测试是可以做到的,因此专门建立了一个二方包测试repo用于各种中间件的测试,融入发布流程

故障演练

  • 演练目标

    • 测试rds集群/es集群/redis集群发生不可抗拒故障时和故障恢复后,tddl/es client/rops中间件层面行为是否可靠
    • 测试rds集群/es集群/redis集群故障恢复后,应用的自动恢复情况
    • 针对rds集群/es集群/redis集群不可抗拒故障,产出对应BP,帮助用户缩短定位问题的时间,提高解决问题的能力
    • 测试rds集群/es集群/redis集群发生不可抗拒故障时和故障恢复后,tddl/es client/rops中间件层面告警详情

业务同学实际故障演练时,可以review对应的测试结果,参考故障发生时的解决方案(重要,重要,重要!)

redis依赖包_解决痛点:二方包稳定性测试实践相关推荐

  1. 用实战项目经验告诉你什么是二方包!

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在整合各种的系统,在这个过程中遇到了各种的问 ...

  2. 一方包,二方包,三方包的区别

    一方包(也称一方库): 本工程中的各模块的相互依赖 二方包(也称二方库): 公司内部的依赖库,一般指公司内部的其他项目发布的jar包 三方包(也称三方库): 公司之外的开源库, 比如apache.ib ...

  3. 一方包、二方包、三方包是什么?

    一方包(也称一方库).二方包(也称二方库).三方包(也称三方库)说明: 一方包:本工程中的各模块的相互依赖 二方包:公司内部的依赖库,一般指公司内部的其他项目发布的jar包 三方包:公司之外的开源库, ...

  4. 一方包、二方包和三方包的概念

    在看一些技术文档的时候经常会看到有二方包这种名词,这里来记一下概念. 一方包(一方库) 本工程中的各模块的相互依赖. 二方包(二方库) 公司内部的依赖库,一般指公司内部的其他项目发布的jar包. 三方 ...

  5. java二方包Maven脚本

    #!/bin/bash# 发布的版本号 VERSION="$1" # 发布的模块名,为null时,deploy整个工程,不为null时,deploy指定的模块及模块依赖的模块 MO ...

  6. 开发一个二方包,优雅地为系统接入ELK(elasticsearch+logstash+kibana)

    去年公司由于不断发展,内部自研系统越来越多,所以后来搭建了一个日志收集平台,并将日志收集功能以二方包形式引入各个自研系统,避免每个自研系统都要建立一套自己的日志模块,节约了开发时间,管理起来也更加容易 ...

  7. 安装fitz报错_解决python 虚拟环境删除包无法加载的问题

    项目开发一直在docker的虚拟环境上,遇到了一个问题,就是把虚拟环境的包删掉(rm -rf xxx)之后,再重新拷贝一个(跟原来包一模一样的文件夹)进去发现pycharm再也找不到这个包了,后来在同 ...

  8. python给矩阵赋值_解决Python二维数组赋值问题

    解决Python二维数组赋值问题 当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值.因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个 ...

  9. 制作mysql rpm包_一步步制作RPM包

    一.RPM制作步骤 我们在企业中有的软件基本都是编译的,我们每次安装都得编译,那怎么办呢?那就根据我们的需求制作RPM安装包吧.先来说说基本布骤: 1.Planning what you want   ...

  10. fiddler everywhere手机抓包_基于移动端抓包使用Fiddler模拟弱网测试

    随着移动互联网的发展,移动端测试工作也提上日程,那移动互联网测试与web测试有什么不一样?首先它们架构不一样,再者基于的场景不一样,PC端网络基本固定宽带,而移动互联的网络测试一般分为:2G.3G.4 ...

最新文章

  1. 18、java中的泛型
  2. java 虚拟内存不够,java虚拟内存不足
  3. 图片垂直居中的CSS技巧
  4. Python基础之set集合与函数
  5. Python验证码识别:利用pytesser识别简单图形验证码
  6. 利用MapabcAPI实现基于浏览器的地理定位
  7. ansible 远程启动程序ansible结束后程序也被关闭
  8. Mathematica三维画图一些技巧
  9. 夏普Sharp AR-M207 一体机驱动
  10. 百度用AI“唤醒”历史,中国文化名片与科技名片相互成就
  11. CRC循环冗余校验(计算机网络)
  12. HNU软件能力实训2-17. 小A的计算器
  13. y=asin(wx+φ)的对称中心_函数y=Asin(wx+φ)图像和性质
  14. 计算机毕业设计Java阿博图书馆管理系统(源码+系统+mysql数据库+lw文档)
  15. 《医疗器械唯一标识系统规则》解读
  16. OSI七层模型和TCP/IP五层模型
  17. C#项目绩效考核实战提升(四)
  18. 给Word文档中的公式自动编号的方法
  19. Linux 的各种 signal
  20. 人月神话 - 人与月

热门文章

  1. 64位程序core分析
  2. react 怎么获取表格_React之表格操作
  3. python2异步编程_Python3异步编程
  4. tensorflow Dataset操作
  5. java泛型方法实现数值类型加法
  6. mysql提高count_mysql count提高方法总结
  7. android动画水波纹外扩,Android实现水波纹扩散效果
  8. sqlmap无法使用-r、-l命令问题原因没有携带请求参数即注入点
  9. 禅道报表中关闭bug统计图_如何生成动态统计图,这款BI教你定义炫酷
  10. 64位程序怎么判断指针是否有效_和微信大佬聊了一夜,他告诉我为什么指针被誉为 C 语言灵魂?...