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

前序

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

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

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

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

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

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

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

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

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

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

  • 绝技:立项心法
    准备项目背景、项目目标(含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.rhkb.cn/news/366010.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【性能优化】Android冷启动优化

文章目录 常见现象APP的启动流程计算启动时间Displayed Timeadb dump 启动优化具体策略总结参考链接 常见现象 各种第三方工具初始化和大量业务逻辑初始化&#xff0c;影响启动时间&#xff0c;导致应用启动延迟、卡顿等现象 APP的启动流程 加载和启动应用程序&#xff1b; …

PTFE铲子聚四氟乙烯物料特氟龙铲粉料铲耐酸碱塑料药铲

四氟铲子主要适用于药厂、药企、医药行业专用&#xff0c;用于粉末状及颗粒物状样品的铲取和搅匀等。因为粉料物料对铲子材质要求无污染、本底值低&#xff0c;所以四氟材质成为选择。 其主要特点有&#xff1a; 1.外观纯白色。 2.耐高低温性&#xff1a;可使用温度-200℃&am…

docker 部署jitsi meet

1. 部署环境&#xff1a; 1.1 vm 虚拟机 安装的 centos 7 1.2 centos7安装docker 和 docker-compose 2.docker命令 官网部署文档地址&#xff1a;&#xff08;文档地址有可能失效&#xff09; Self-Hosting Guide - Docker | Jitsi Meet 2.1Download and extract the late…

基于yolo的物体识别坐标转换

一、模型简介: 1.1、小孔成像模型简图如下:不考虑实际相机中存在的场曲、畸变等问题 相对关系为: 为了表述与研究的方便,我们将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的 相对关系为: 二、坐标系简介: **世界坐标系(world coo…

旋转变压器软件解码simulink仿真

1.介绍 旋转变压器是一种精密的位置、速度检测装置&#xff0c;尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。旋转变压器在使用时并不能直接提供角度或位置信息&#xff0c;需要特殊的激励信号和解调、计算措施&#xff0c;才能将旋转变压…

Element UI搭建使用过程

本章内容基于上一篇---Vue-cli搭建项目基础版 Vue-cli搭建项目----基础版-CSDN博客 官网地址:Element - The worlds most popular Vue UI framework 介绍:完全基于Vue.js ,用于快速搭建用户界面. 第一步:安装ElementUI 在终端输入 npm i element-ui -S 在main.js输入 …

Golang-map理解

golang-map语雀笔记整理 map的底层实现hmapbmap map是如何做到O(1)的复杂度的&#xff1f;map扩容策略 师兄问题回答 map的底层实现 hmap hmap的结构体核心字段有&#xff1a;buckets 桶数组地址&#xff0c; B 定位值&#xff0c;桶的数目是2^B个&#xff0c; count 当前map的…

一个 API 客户端和一份 TS 学习手册

第75期&#xff1a; Insomnia&#xff1a;超好看的 API 客户端 项目介绍&#xff1a; 一款适用于 GraphQL、REST、WebSockets 和 gRPC 的开源 API 客户端&#xff0c;颜值超高。 跨平台&#xff0c;支持 Mac、Windows 和 Linux。但不支持网页版&#xff0c;需要下载客户端。…

【AI编译器】triton学习:矩阵乘优化

Matrix Multiplication 主要内容&#xff1a; 块级矩阵乘法 多维指针算术 重新编排程序以提升L2缓存命 自动性能调整 Motivations 矩阵乘法是当今高性能计算系统的一个关键组件&#xff0c;在大多数情况下被用于构建硬件。由于该操作特别复杂&#xff0c;因此通常由软件提…

【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现【附完整Matlab代码】 2.改进点 非线性收敛因子 WOA 主要通过控制系数向量 A 来决定鲸鱼是搜索猎物还是捕获猎物&#xff0c;即系数向量 A 可…

七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3

前言 llama 3出来后&#xff0c;为了通过paper-review的数据集微调3&#xff0c;有以下各种方式 不用任何框架 工具 技术&#xff0c;直接微调原生的llama 3&#xff0c;毕竟也有8k长度了 效果不期望有多高&#xff0c;纯作为baseline通过PI&#xff0c;把llama 3的8K长度扩展…

应用案例 | 如何监测高价值货物在物流运输过程中受到的振动和冲击?全面保障货物安全

一、货物运输 不同种类的货物对运输的要求不同&#xff0c;钢铁、煤炭、矿石等大宗物资通常对运输要求较低&#xff0c;而电子产品、IT 产品、家电等高价值敏感类货物则更强调运输的安全性和时效性&#xff0c;往往希望能尽可能安全和快速送达这类货物&#xff0c;使之尽快进入…

SpringBoot:SpringBoot中调用失败如何重试

一、引言 在实际的应用中&#xff0c;我们经常需要调用第三方API来获取数据或执行某些操作。然而&#xff0c;由于网络不稳定、第三方服务异常等原因&#xff0c;API调用可能会失败。为了提高系统的稳定性和可靠性&#xff0c;我们通常会考虑实现重试机制。 Spring Retry为Spri…

Django 一对多关系

1&#xff0c;创建 Django 应用 Test/app9 django-admin startapp app9 2&#xff0c;注册应用 Test/Test/settings.py 3&#xff0c;添加应用路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(admin/,…

uniApp获取实时定位

通过你获取的key放到项目manifest.json里面&#xff0c;对应填写你所需要的key值&#xff0c;还有高德用户名 用户名&#xff1a; key值的位置&#xff1a; 代码&#xff1a; html: <view class"intList pdNone"><view class"label">详细地…

使用 nvm 管理 Node 版本及 pnpm 安装

文章目录 GithubWindows 环境Mac/Linux 使用脚本进行安装或更新Mac/Linux 环境变量nvm 常用命令npm 常用命令npm 安装 pnpmNode 历史版本 Github https://github.com/nvm-sh/nvm Windows 环境 https://nvm.uihtm.com/nvm.html Mac/Linux 使用脚本进行安装或更新 curl -o- …

AI大模型日报#0701:Meta发布LLM Compiler、扒一扒Sora两带头人博士论文

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff01;《AI大模型日报》今日要点&#xf…

Kotlin/Android中执行HTTP请求

如何在Kotlin/Android中执行简单的HTTP请求 okhttp官网 okhttp3 github地址 打开build.gradle.kts文件加入依赖 dependencies {implementation("com.squareup.okhttp3:okhttp:4.9.0") }在IDEA的Gradle面板点击reload按钮便会自动下载jar

【STM32】温湿度采集与OLED显示

一、任务要求 1. 学习I2C总线通信协议&#xff0c;使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集&#xff0c;并将采集的温度-湿度值通过串口输出。 任务要求&#xff1a; 1&#xff09;解释什么是“软件I2C”和“硬件I2C”&#xff1f;&#xff08;阅读野火配…

HTTPS是什么?原理是什么?用公钥加密为什么不能用公钥解密?

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP的安全版本&#xff0c;它通过在HTTP协议之上加入SSL/TLS协议来实现数据加密传输&#xff0c;确保数据在客户端和服务器之间的传输过程中不会被窃取或篡改。 HTTPS 的工作原理 客户端发起HTTPS请求&…