IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 记录一次reactive模型接口问题 -> 正文阅读

[开发测试]记录一次reactive模型接口问题

表现

生产环境一百多台机器,某接口全面返回http错误码590。

接口相关的业务功能不可用,且不能自己恢复,后紧急下线相关功能配置,重启后恢复。

Bug引入

微服务使用netty的reactive模式进行开发,请求返回体为completableFuture<XXResponse>。

接口处理函数中,新建一个completableFucture,作为返回值。

completableFuture中有代码实现判空不到位,导致抛空指针异常,导致无法走到complete(XXResponse)执行。

从外部看,比如使用postman调用的时候,表现为接口一直阻塞,不响应。

定位过程

尝试在本地环境复现:

1)使用postman runner模拟高频请求。

postman runner本身是不支持并发请求的。

有个小技巧,可以通过修改postman setting里的超时时间,不用上一个等返回就发起下一个。

2)jvisualVM查看内存使用,对内存和线程进行dump。

发现内存并没有明显泄漏。看各个线程池也没发现有特别异常的。

相关知识点:

1)Netty的reactive请求处理模型

https://servicecomb.apache.org/references/java-chassis/zh_CN/general-development/reactive.htmlJava CompletableFuture 详解https://servicecomb.apache.org/references/java-chassis/zh_CN/general-development/reactive.html

请求网络数据到达后,请求会写到channel中,这个过程很快。

进入eventloop1的处理:

vertex线程池对eventloop select到的已经就绪的请求进行处理。这个过程包括:走比如熔断、限流等过滤器,再走到业务代码。

进入异步线程池的处理:

业务代码创建comletableFuture,在线程池中异步执行,在异步线程中通过complete带回结果,主线程直接返回future。

此时注册到另一个eventloop中,当响应完成时会在这里就绪,另一个线程会select到就绪的返回结果,再写回连接数据。

vert.x线程不能阻塞。业务异步线程要保证complete效率,否则会导致被调堆积。

如果在业务线程中涉及IO,调用其他的微服务,也使用响应式编程,返回一个future,就释放当前线程到下一个任务。通过eventloop去获取调用返回。

nio的核心思想就是去除因为io阻塞的线程,转换为多路复用,这个有点像操作系统的io中断、中断响应,搞过嵌入式开发的同学应该很熟悉。

实际上当接口中会调用其他接口的时候,使用响应式编程可以将这些一断一断串起来,最大化效率

2)接口熔断

底层还是hystrix,hystrix隔离模式目前有两种方式:信号量模式和线程池模式。

reactive模型下,hystrix通常使用信号量模型。信号量并不支持超时, 早先的一批请求可能长时间无法得到响应。

hystrix两种隔离模式分析 - 指针怒草内存栈 - 博客园

Hystrix 信号量机制实现资源隔离_littleAusna的博客-CSDN博客_hystrix信号量隔离

原因分析

1)线程中抛异常后,未在线程内catch,而是在线程外catch,导致没有给future返回值。

2)Netty的reactive请求处理模型下,无返回值的future会维持在NioEventLoop中。

3)hystrix的信号量不是否,触发了hystrix的隔离机制,导致快速失败返回590。

待确认:

是否future不返回会导致内存泄漏。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:17:03  更:2022-01-14 02:18:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 4:33:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码