【程序大侠传】异步架构应用回调数据接收接口偶发NPE

news2024/11/17 15:47:52

前序

在这片浩瀚的代码江湖中,各大门派林立,各自修炼独门绝技,江湖中的侠士们分别担任着开发、测试、产品和运维的角色,共同守护着这片数字化的疆域。

开发门派:代码剑宗
代码剑宗的弟子们精通各种编程语言,擅长写出优雅而高效的代码。每一个函数、每一行代码都如同剑招,精准无比,直击要害。他们不断钻研新的技术,追求极致的性能和用户体验。

  • 绝技:算法剑法
    通过优化算法,提高系统的响应速度和处理能力。
  • 绝技:架构心法
    设计出高扩展性和高可维护性的系统架构。

测试门派:断点神教
断点神教的弟子们以严谨和细致著称,他们通过各种测试手段,确保每一行代码的质量。他们的绝技如同内力,能够发现隐藏的漏洞和瑕疵,保障系统的稳定性和可靠性。

  • 绝技:白盒测试术
    通过了解代码内部结构,进行全面的测试。
  • 绝技:黑盒测试术
    从用户视角出发,进行功能和性能测试。

产品门派:需求派
需求派的弟子们擅长从用户需求出发,设计出符合市场需求的产品。他们如同江湖中的智者,洞察用户心理,预见市场趋势,为开发门派提供明确的方向。

  • 绝技:用户画像术
    分析用户行为,构建用户画像,指导产品设计。
  • 绝技:需求拆解法
    将复杂的需求拆解成可执行的任务,确保开发顺利进行。

运维门派:守护盟
守护盟的弟子们负责系统的维护和保障,如同江湖中的护法,确保系统的稳定运行。他们精通各种运维工具和技术,能够迅速应对突发问题,保障系统的高可用性。

  • 绝技:自动化部署术
    通过自动化工具,实现高效的系统部署和更新。
  • 绝技:监控预警法
    实时监控系统运行状态,及时发现并解决问题。

项目管理门派:天工阁
在这片浩瀚的代码江湖中,天工阁是一个专注于项目管理的门派。天工阁的弟子们以严谨的流程和科学的方法论著称,他们如同江湖中的策划大师,统筹全局,确保每一个项目都能顺利完成。

  • 绝技:立项心法
    准备项目背景、项目目标(含OKR目标)、项目周期、投入产出分析和产品/技术方案。
  • 绝技:目标牵引术
    通过明确项目目标,牵引运营、产品和研发各相关方达成共识。

江湖现状
在这片江湖中,各大门派互相竞争又互相协作,共同面对来自外部的挑战。开发门派、测试门派、产品门派和运维门派的弟子们通过不断修炼和切磋,提升自身的技艺,为江湖的繁荣和稳定贡献力量。

21世纪的某一天,代码剑宗的阿强正坐在洞府的蒲团上沉浸式库库思考需求派小汝提出来的一个棘手的需求落地方案而眉头紧锁,此时断点神教小美突如其来的传音“阿强,快来看看你们门派中的弟子A在参与“异步回调接口处理数据”的任务中时候偶发出现npe异常了”把阿强从精神世界中拉入现实。阿强有点无奈地摇摇了头地心里想道:“npe这种小问题,看来又是需要本座略微施展实力的时候到了”…

第一章:小问题而已

洞府外,阿强见到了阿美,阿美见到阿强就迫不及待地描述了一下受伤弟子A的内伤情况,10分钟之后,阿强已经知道基本情况,大致就是:业务系统A雇佣了弟子A去保护其安全和提供发展助力,弟子A在开发业务系统A地一次任务时偶发的发生npe异常(A系统是此次弟子所保护的系统),此任务是需要三方系统进行交互的,其中与三方系统交互是采用的异步方式。从数据层面看,A系统去请求三方系统的接口会返回一个唯一Id,A系统会根据这个唯一id记录此次的请求,此时的请求的记录状态是一个中间态,而三方处理完业务逻辑之后会通过回调A系统暴露给三方的接口去更新A系统里面的对应的那条请求记录状态至终态。大致流程图如下:
在这里插入图片描述

阿强很熟练地从兜里拿出了门派每个人都有的法器IDEA(此法器能够收录所有的系统发布的任务过程),并通过法器天书(能够记录出问题的堆栈信息)分析了整个过程,阿强最终定位到是repository获取数据为空导致:

//回调接口处理核心逻辑
public Map<String, Object> callBack(Map<String, Object> params) {
			//do something......
			//thirdId 跟 innerId 都是三方系统维护的字段
            AEntity aEntity = aRepository.selectDataByThirdIdAndInnerId(thirdId, innerId); 
           //根据堆栈,下面这行代码是异常抛出行
           String status = aEntity.getStatus();
            //do something......          
        return resultMap;
    }

而其中repository数据的录入到a系统的操作是在第一次跟三方系统进行交互的时候:

public void thirdApply(ApplyContext applyContext) {
	//do something......
	//通过http请求框架调用三方接口
	Response response = httpClient.doPost(params);
	if(response.success()){
		AEntity aEntity = new AEntity();
		//通过返回结果,组装状态参数
		aRepository.insert(aEntity);
	}
	//do something......
}

此时的阿强对于处理这个npe还是信心满满的,因为repository获取问题导致npe,无非就两种情况,要么是数据没有正常录入到数据库,要么是查询数据的条件无法在数据库中查询到数据。为了更加清晰的还原这个问题,也是为了找到偶发npe发生的根因,他通过自己的法器idea回溯当时的一次回调请求,发现并没有发生npe的异常。但是门派中记录的当时三方回调请求链路库中表示当时的一次请求发生了npe的异常。阿强此时开始在脑海里面开始头脑风暴,考虑各种造成这种现象的原因。

10分钟之后,阿强信心满满地又重新分析了一下弟子A的代码,果然,他在thirdApply这个接口中发现了一丝猫腻,系统A的记录落库是在调用三方系统之后,那考虑一种场景,如果三方系统在处理完自己逻辑并回调系统A时,A系统还没有将请求记录落库,这个时候在回调接口中会拿不到记录数据然后应用就会抛出npe的异常,与此同时,异常抛出之后,记录数完成了落库操作,三方系统再次回调就不会发生npr异常。阿强此时脑海中的画面如下:
在这里插入图片描述

第二章:小问题如何解决?

为了验证自己的想法,阿强在门派弟子A写的代码里面修改了一部分代码如下:

public void thirdApply(ApplyContext applyContext) {
	//do something......
	//通过http请求框架调用三方接口
	AEntity aEntity = new AEntity();
	//组装其他参数
	aRepository.insert(aEntity);
	Response response = httpClient.doPost(params);
	if(response.success()){
		//根据返回结果设置记录状态
		aRepository.update(aEntity);
	}
	//do something......
}

修改完之后,应用A的回调接口再没有出现过npe异常,但是随之而来的一个问题是,系统A里面的状态会出现回溯。阿强又开始了新一轮的头脑风暴,此时他的脑海中的画面如下:
在这里插入图片描述
阿强此时又开始动用他的知识库去思考解决方案,他又改了一版代码:

public void thirdApply(ApplyContext applyContext) {
	//do something......
	//通过http请求框架调用三方接口
	AEntity aEntity = new AEntity();
	//组装其他参数
	aRepository.insert(aEntity);
	Response response = httpClient.doPost(params);
	if(response.success()){
	    	LockUtil.lock(thirdId,2000){
		    	AEntity aEntityFromDb = aRepository.selectDataByThirdId(thirdId);
		    	//B是更新后的状态值
		    	if(aEntityFromDb.getStatu().equals('A')){
				    //根据返回结果设置记录状态
					aRepository.update(aEntity);
	     		}
	    	}   
	}
	//do something......
}
//回调接口处理核心逻辑
public Map<String, Object> callBack(Map<String, Object> params) {
			//do something......
			//thirdId 跟 innerId 都是三方系统维护的字段
			LockUtil.lock(thirdId,2000){
			     AEntity aEntity = aRepository.selectDataByThirdIdAndInnerId(thirdId, innerId); 
           //根据堆栈,下面这行代码是异常抛出行
              String status = aEntity.getStatus();
             //do something......  
	     	}eles{
	     	    //do error scene
	     	}         
        return resultMap;
    }

阿强改完这版之后,系统A基本上没有发生过状态问题,阿强心里也清楚,如果再出现问题,那只能是在系统负载较高的场景下了。

此时,已经过去了2个小时,阿强作为一个对可知错误无法容忍的人,他又开始了新的一轮头脑风暴,突然,阿强脑子的灵光一闪而过。他从思考角度上面重新对这个问题做了一番考量,如果让三方系统配合做一个回调的重试机制是不是就可以完美解决这个问题了呢?正当阿强想把这个新思路好好地梳理一遍的时候,天工阁小凯着急的传音随之而到,“阿强,小汝给你提的那个需求,目前的技术方案出来了吗?尽快给出这个需求的排期!!”。阿强此时对小凯的打扰非常不喜,语气不喜地录入让小凯乖乖地等他想完这个回调处理方案的传音,阿强正打算传过去时,突然想到了什么似的摇摇了头,最终取消了发送传音的想法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新款奔驰GLE350升级原厂空气悬挂系统有哪些功能

奔驰 GLE350 升级原厂空气悬挂带来了一系列显著的优势和功能&#xff1a; 1. 舒适性提升 • 能够根据不同的路况和驾驶模式自动调节悬挂硬度和高度&#xff0c;有效过滤路面颠簸&#xff0c;为驾乘者提供更加平稳、舒适的行驶体验。 2. 行驶高度调节 • 驾驶者可以手动或自…

网络攻防题录集

文章目录 第一章 网络攻防概述第二章 密码学第三章 网络协议脆弱性分析第四 自测题三第五章 自测题五第六章 自测题六第七章 自测题七第八章 自测题八第九章 自测题九第十章 自测题十第十一章 自测题十一第十二章 自测题十二第十三章 自测题十三 第一章 网络攻防概述 第一代安…

文心一言 VS 讯飞星火 VS chatgpt (293)-- 算法导论21.4 2题

二、证明&#xff1a;每个结点的秩最多为 ⌊lgm⌋ 。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在数据结构和算法中&#xff0c;当我们谈论“结点的秩”时&#xff0c;这通常与某些特定的数据结构&#xff08;如B树或B树&#xff09;相关&#xff0c;其中每…

vant ( weapp ) - - - - - van-tabs组件选中下划线初始位置异常

这里写自定义目录标题 1. 当前效果展示2. 官方解释 & 方案 1. 当前效果展示 明显可以看到框内的光标位置偏移了&#xff0c;但当切换一次之后就会显示正常。 只有初次打开的时候&#xff0c;才会出现上述问题。 代码如下&#xff1a; <van-popup show"{{ makeSho…

【超级简单】植物大战僵尸杂交版V2.1,手机上最简单的安装方法~!

大家好&#xff0c;我是坤坤黑科技&#xff01;之前给大家分享了植物大战僵尸杂交版手机的安装方法&#xff0c;但是很多朋友还是因为操作难度大所以没有玩到。今天发现一个更加简单的在手机上玩植物大战僵尸杂交版的方法&#xff0c;直接安装就可以玩到最新的2.1版本~ 植物大…

【python】最新版抖音s逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

SaaS增长:小型SaaS企业可以使用推荐奖励计划吗

在SaaS&#xff08;软件即服务&#xff09;行业的激烈竞争中&#xff0c;如何快速有效地增长用户数量是每个企业都面临的挑战。对于小型SaaS企业来说&#xff0c;资源有限&#xff0c;如何最大化利用现有资源实现用户增长成为了一个重要议题。在这样的背景下&#xff0c;推荐奖…

解决 npm intasll 安装报错 Error: EPERM: operation not permitted

Node.js安装及环境配置完成之后 npm install express -g 安装全局的模块报错提示没有权限operation not permitted mkdir 错误编号4048&#xff1a; 其原因是当前用户操作该目录权限不足&#xff0c;当以管理员身份运行cmd&#xff0c;再执行npm install express -g 是不会报权…

JELR-G150F可调漏电继电器 面板安装 30~300mA 约瑟JOSEF

一、应用 JELR系列漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压为660V.至1140V电压系统中,频率为50Hz,电流15~4000A线路中做有无中性点漏电保护. 该继电器可与带分励脱扣器或失压脱扣器的断路器、交流接触器、磁力启动器等组成漏电保护装置&#xff0c;作…

Vue3 登录成功,浏览器存在toke,再次访问/login路由到/index 首页页面

文章目录 目录 文章目录 流程 小结 概要流程技术细节小结 概要 首先需要清楚知道浏览器localstorage和Session storage的区别 localStorage 和 sessionStorage 是 HTML5 提供的两种客户端存储数据的方法&#xff0c;它们在使用和生命周期上有一些区别&#xff1a; 1. 生命周期…

视频共享交换平台LntonCVS视频融合共享平台搭建智慧园区视频监控平台应用方案

智慧园区作为现代化城市发展的重要组成部分&#xff0c;不仅承载着产业升级的使命&#xff0c;更是智慧城市建设的重要体现。随着产业园区竞争的激烈化&#xff0c;越来越多的关注点集中在如何打造完善的智慧园区上。 在智慧园区规划的初期阶段&#xff0c;面临诸多挑战。如何选…

刷代码随想录有感(122):动态规划——最长子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int lengthOfLIS(vector<int>& nums) {if(nums.size() < 1)return nums.size();vector<int>dp(nums.size(), 1);int res 0;for(int i 1; i < nums.size(); i){for(int j 0; j < i; j)…

生信新包|Mellon·量化单细胞表型景观中的细胞状态密度

分化是支持所有多细胞生物发育和功能的动态过程。了解细胞如何沿着分化轨迹分布对解析驱动分化的机制、找出关键调控因素以及表征疾病中的失调至关重要。细胞状态密度是这种细胞分布的表现&#xff0c;受到基本生物过程的影响。增殖会增加某一状态下的细胞数目&#xff0c;从而…

倒装COB显示屏与传统SMD显示屏安装方式有哪些不同?

COB显示屏与传统SMD显示屏是商业显示领域中非常重要的两种载体&#xff0c;在前面的文章当中我们为大家阐述了倒装COB显示屏的技术特点&#xff0c;今天跟随COB显示屏厂家深圳市中品瑞科技一起来看看&#xff0c;COB显示屏的安装与传统LED显示屏的安装有哪些不同&#xff1f; 一…

Dev++软件连接Sqlite

Dev中的C语言使用连接sqlite数据库 1.下载sqlite3.dll和sqlite3.h sqlite3.dll类似于.c文件&#xff0c;封装了函数的原型。 sqlite3.h库文件声明函数。 官网地址下载&#xff1a;sqlite sqlite-amalgamation-3460000.zipsqlite-dll-win-x64-3460000.zip 2.新建c项目 1. …

es学习初步总结

看api看麻了不知道意义在哪里&#xff0c;所以就简单总结点我觉得有用的东西 基本数据结构解析 分为了文档&#xff0c;索引和映射 索引可以理解为一张表&#xff0c;映射描述了索引的数据结构&#xff0c;而文档就是一个个具体的行 所以一般我们需要在申明索引的时候同时申…

STC8/32 软硬件I2C通讯方式扫描I2C设备地址

STC8/32 软硬件I2C通讯方式扫描I2C设备地址 📄主要用于检测挂载在I2C总线上的设备。在驱动I2C设备之前,如果能扫描到该设备,说明通讯设备可以连接的上,在提前未知I2C地址的情况下,可以方便后面的驱动代码的完善。 🔬扫描测试效果:(测试mpu6050以及ssd1306 i2c oled )…

Java源码实现《植物大战僵尸》

前言 学Java的朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款 植物大战僵尸源码&#xff0c;看图: 视频演示 java植物大战僵尸 环境JDK1.8 类继承UML图 源码实现 我们先从main函数看起&#xff0c;继承了javafx.application.Application。JavaFx是Java图形…

3d里面减小模型大小的键是什么意思?---模大狮模型网

在3D建模和动画制作中&#xff0c;调整模型的大小是常见的操作&#xff0c;但这并不仅仅意味着简单地改变模型的尺寸。特别是当我们谈论到"减小模型大小的键"时&#xff0c;涉及到更深层次的技术和工作流程。让我们深入探讨这一话题&#xff0c;理解在3D环境中如何有…