0727开发问题小结分享

news2024/12/28 3:36:17

Hi,我是阿昌,今天记录分析下关于0727开发问题小结分享的内容。
总结汇总了一些在开发问题,或者需要开发注意点;

一、内容概览

● 问题驱动思维
● 数据库
● javaee & 框架
● 服务治理
● 三方服务 & 迁移操作

二、问题驱动思维

强调在开发功能或解决问题时,首先要思考可能出现的问题,并提前采取措施来避免或解决这些问题。
这种思维方式有助于提高开发过程的效率和质量。

①bug的处理方案通用方法论

  1. 是否可复现
  2. debug
    a. 远程debug
    b. 本地debug
  3. 打日志

②查看是否能够增加请求入参来减少增加接口,减少系统风险【excel导出功能】

导出/test/export

/**
 * 是否特殊货品 1特殊货品;0普通货品
 */
private Integer type;

接口暴露风险

  1. 信息泄露:未经适当的身份验证和授权,攻击者可以通过HTTP接口获取敏感信息,如用户凭据、个人数据等。
  2. 跨站脚本攻击(XSS):攻击者可以通过在HTTP请求中注入恶意脚本,使其在用户浏览器中执行,从而窃取用户信息或进行其他恶意操作。
  3. 跨站请求伪造(CSRF):攻击者可以通过伪造合法用户的请求,使其在用户不知情的情况下执行恶意操作,如修改用户信息、发起转账等。
  4. 拒绝服务攻击(DoS):攻击者可以通过发送大量无效请求或恶意请求,使服务器资源耗尽,导致服务不可用。
  5. SQL注入攻击:攻击者可以通过在HTTP请求中注入恶意SQL语句,从而绕过身份验证和授权,执行未经授权的数据库操作。

③当异步触发任务的时候,考虑服务发布重启后,是否会丢失任务

例如物流预警回调aftersale-web或dts-web的时候如果出现了问题,或服务重启就有可能出现数据丢失&异常
● 解决方案:使用MQ、mysql方案解决…

④尽量不要在公共模型里面添加默认字段,多人协同开发有可能会导致业务错乱,出现业务问题

com.xxx.xxx.common.model.xx.SkuDTO
/**
 * 是否人类 1:是 0:否
 *  */
private Boolean isHuman = Boolean.True;

⑤评估内存情况,避免服务器OOM,excel导入

//一次性倒入
List<Object> dataList = parseData();
ExcelImportUtils.import(dataList);

//分页倒入
int page = 1;
int pageSize = 20;
do{
    List<Object> dataPartList = parseDataPart(page,pageSize);
    if(Collection.isNull(dataPartList)){
        break;
    }
	ExcelImportUtils.import(dataPartList);
    page++;
}while(true);

⑥查询拆分时,注意拆分后出现的重复问题,判断是否可以去重再拆分

● 减少调用

Sets idSet = Lists.toSets(idList);
for (List<Long> list : Lists.partition(idSet, 200)) {}

⑦拆分处理的数据,缓存内存压力,减少等待时间,但是否需要考虑业务操作的原子性

handleA();
for (List<String> tidListPart : Lists.partition(tidList, 200)) {
     handleB(tidListPart);//出现了异常
 }

⑧前端Tab页功能切换,导入旧数据请求问题

⑨核心业务和旁支业务要分离开,可用mq解耦/发布事件

handleA();//主业务

try{
    otherHandleA();//旁支业务
}catch(Exception e){}

⑩注意service逻辑所在的包,让独立的逻辑在自己的service中

在这里插入图片描述

11.mq消息传递用独立的对象,传递不应该传递业务模型,而是传递关键的id信息,不然可能会出现异步数据覆盖的情况

    private User user;
    private Long sysItemId;
    private List<Long> sysSkuIdList;
    /**
     * 货品类型 0-单品 1-组合 2-指定货品转组合
     */
    private Integer sysItemSaveType;
    
    /**
     * 是否保存操作 T是 F不是
     */
    private Boolean isSaveOps;

12.批量拆分不去重,转Map会有可能出现重复数据问题

beanMap = beanResp.getList().stream().
collect(Collectors.toMap(BeanVo::getId, t -> t, (t1, t2) -> t1));

beanMap = beanResp.getList().stream().
collect(Collectors.toMap(BeanVo::getId);

13.大促情况下,注意服务雪崩问题

服务雪崩:指在软件行业中,由于某个服务的故障或不稳定性导致整个系统的服务质量急剧下降或完全瘫痪的现象。
在这里插入图片描述

14.紧急情况下,降级流程

  1. 拉黑用户功能纬度
  2. 拉黑系统纬度
  3. 拉黑sql纬度
  4. 拉黑ip
  5. 杀掉实例机子

三、数据库

1.数据库字段默认尽量不要使用null,使用空串“”

优点

  1. 空串“”可以作为一个有效的值,可以在查询和过滤数据时进行比较和操作。
  2. 使用空串“”作为默认值可以避免在查询和处理数据时出现空指针异常。
    缺点
  3. 使用空串“”作为默认值可能会导致数据的混淆和误解。空串“”可能被误认为是一个有效的值,而实际上它只是一个空值。
  4. 空串“”可能会占用额外的存储空间,尤其是在大型数据库中,这可能会导致存储空间的浪费。
  5. 使用空串“”作为默认值可能会导致数据的不一致性。如果在数据库中有多个字段使用空串“”作为默认值,那么在查询和处理数据时可能需要额外的逻辑来处理这些空串“”。

2.减少select对应的字段,只查询想要的字段

可以减少select对应的字段,只查询想要的字段,从而提高查询效率和减少数据传输的开销。

3.根据索引去使用group by 可以减少扫描的行数,增加sql查询性能

使用索引进行group by操作可以减少扫描的行数,从而提高SQL查询的性能。
当使用group by对某个列进行分组时,数据库需要扫描整个表或者索引来找到相同值的行,并将它们分组。
如果该列上存在索引,数据库可以直接使用索引来定位相同值的行,而不需要扫描整个表,从而减少了IO操作和CPU消耗,提高了查询性能。

4.判断数据库是否可以建立唯一索引,在没做幂等处理的情况下,可报错避免一系列的并发问题

5.数据库ddl更新操作动态set时,评估需要指定set的字段值,减少执行成本

6.分表添加字段遗漏问题

7.sql连表查询时,应注意是否使用上了索引,做到小表驱动大表

8.注意sql执行是的隐式类型转换问题,会导致扫全表

desc update bind_relationship_68 set id = 1 where  user_id= '1222222222';
desc update bind_relationship_68 set id = 1 where user_id = 1222222222;

9.事务里面尽量避免各种count和大查询,导致事务一直阻塞

10.联合唯一索引,只要有一个项为空时,就会索引失效

在数据库中,空值是可以重复的,所以当一个列的值为空时,无法保证与其他列的组合值的唯一性。因此,当联合唯一索引中的任何一个列的值为空时,索引就会失效。
为了避免这种情况,可以在创建联合唯一索引时,对包含空值的列进行限制,例如使用NOT NULL约束来确保列的值不为空。这样可以保证索引的有效性,并确保联合唯一索引的唯一性约束得到正确的应用。

11.前一天执行sql时,评估sql的执行重量度,如果不大可当天执行

12.避免一个请求一个mysql连接,导致连接池连接被打满问题;例如:根据numIid同步业务

13.避免for循环执行io操作,如查询数据库

for (String tid : tidArr) {
	 Object obj = dbComponent.getByTid(tid);
}

14.注意数据库实例之间字符集不同导致出现数据过长无法插入的问题

15.select limit1 和count() ,前者性能更好;

在选择性能方面,SELECT LIMIT 1 比 COUNT() 更好
SELECT LIMIT 1 是用于从数据库中选择一条记录的查询语句。它只返回满足条件的第一条记录,而不需要遍历整个表。因此,它的性能较高,尤其是在大型表中。
COUNT() 是用于计算满足条件的记录数的函数。它需要遍历整个表,并对每一条记录进行计数。在大型表中,这可能会导致性能问题,特别是当表中有大量数据时。
因此,如果只需要获取一条记录,使用 SELECT LIMIT 1 会比使用 COUNT() 更好。

16.创建时间为空时,排序乱序问题,excel导出

17、set字段如果使用updateByPrimaryKeySelective类似的方法时,因为传入模型中存在userId等公共信息,导致set时也会再set一遍userId导致性能损耗

在这里插入图片描述

四、javase & 框架

1.发布系统报错

java.lang.Runtime exit
真实报错:Error: Could not find or load main class org.springframework.boot.loader.WarLauncher
java.lang.Throwable
at com.raycloud.agent.raycloud.hook.safe.RuntimeHook.sendMethod(RuntimeHook.java:24)
at com.raycloud.agent.raycloud.monitor.MonitorUtil.enterMethod(MonitorUtil.java:191)
at java.lang.Runtime.exit(Runtime.java)
at java.lang.System.exit(System.java:971)
at sun.launcher.LauncherHelper.abort(LauncherHelper.java:450)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:508)
Could not find or load main class org.springframework.boot.loader.WarLauncher
解决方案:原因spring项目需要改成jar包启动

2.mapper.xml timeout标签可单独配置改sql查询的超时时间

<select id="selectList" resultMap="BaseResultMap" timeout="30">

3.mybatis中if的int类型判断空串会导致条件失效

List<User> getUsers(@Param("id") int id);
<select id="getUsers" resultType="User">
    SELECT * FROM users
    <where>
        <if test="id != null and id != ''">
            AND id = #{id}
        </if>
    </where>
</select>

4.mysql语法中case-when写法的坑;

update user set 
`password` = case 
WHEN id = 1234577 then '123'
end 
where id = 1234577 or id = 1234576

5.hashmap的get方法取值计算hash值,若业务组装数据匹配会区分大小写

System.out.println("abc".hashCode() % 500);//354
System.out.println("ABC".hashCode() % 500);//78

6.库存上传线程池设置不合理问题new ThreadPoolExecutor(4, 4, 60L, TimeUnit.SECONDS, ItemConstant.slowQueue,new ThreadFactoryBuilder().setNameFormat(“stockUpload-pool-%d”).build()),导致一直单线程跑,出现任务积压

public static final LinkedBlockingQueue<Runnable> slowQueue = new LinkedBlockingQueue<>();

7.线程池之间,应该思考业务是否可以共用队列,以免出现队列堆积或任务共享等问题

五、服务治理

1.避免index-dubbo服务依赖订单服务

预占库存系统设置变更;基础服务应该作为最底层,不应该依赖业务

2.处理缓存服务时,应该让一个服务处理一个服务的缓存信息,对外暴露dubbo服务查询缓存信息

3、服务顺序发布、web可同时发布

dubbo > web / task/下载中心 / consumer …

4、尽量不改变方法传进来入参的引用,你不确定外层业务是否还会使用入参的引用

@Override
public PageResponse selectPage(PageRequest pageRequest,XXXXX xx) {
    return serivce.selectPage(pageRequest);
}

5、nacos开关设置要做好配置中心挂了后有符合业务的默认值返回

    /**
     * permits数量
     */
    public static int getPermits() {
        if (NacosConfig.limit != null &&
                NacosConfig.limit.getDegrade() != null &&
                NacosConfig.limit.getDegrade().getJSONObject("1") != null &&
                NacosConfig.limit.getDegrade().getJSONObject("1").getJSONObject("2") != null &&
                NacosConfig.limit.getDegrade().getJSONObject("1").getJSONObject("2").getInteger("3") != null) {
            return NacosConfig.limitInfo.getDegrade().getJSONObject("1").getJSONObject("2").getInteger("3");
        }
		//返回默认值
        return 3;
    }

六、三方服务 & 迁移操作

1.依赖第三方服务需要评估,如果过度依赖第三方组件很容易出问题,增加项目风险;

2.当依赖第三方服务的数据时,做好npe的返回判断兼容

3.注意平台api的增量/全量接口问题

避免先get来,库存变更为增量,出现每次修改都会库存翻倍

4.使用第三方文件系统oss时,如果不想考虑是否会掩盖,那就每次上传都用新的文件名,如时间戳

//时间戳
String filePath =  System.currentTimeMillis() + ".xlsx";
NewOSSUtils.uploadFile(OSSConfig.OSS_BUCKET_NAME_ERP_ITEM, filePath, inputStream);

5.代码迁移使用复制的方式,在功能未上线期间,如果被改变,上线合并代码时会出现冲突提示,并标上@Deprecated注解

下载中心

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

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

相关文章

北大C++课后记录:自增、自减运算符重载的小Demo

前言 自增、自减运算符有前置&#xff08;x&#xff09;和后置&#xff08;x&#xff09;之分&#xff0c;为了对其进行区分&#xff0c;C规定&#xff1a; 前置运算符作为一元运算符进行重载&#xff1a;&#xff08;注意T1对象和T2对象是有差异的&#xff09; 后置运算符作…

DT 变形学习

弯曲变形 扩张变形 正弦变形 挤压变形 扭曲变形 波浪变形 内外的影响 雕刻 抖动变形 混合变形 晶格变形 包裹变形 线条变形 重置 在测试一个

资本寒冬下,YOUMAGIC单极射频为何吸金过亿?

整个消费社会投融资周期的变化&#xff0c;已经从前几年的升温、火热&#xff0c;来到了如今降温、遇冷的阶段。IT桔子数据显示&#xff0c;今年上半年零售消费相关领域共发生297起融资&#xff0c;而去年同期为662起。不管是融资事件总数还是披露融资金额&#xff0c;都双双大…

在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答

您可以通过集简云数据流程&#xff0c;将语聚AI助手集成到抖音视频评论、抖音私信&#xff0c;实现自动回复用户视频评论、私信问答&#xff0c;大大提升账号互动与运营效率。 效果如下&#xff1a; 自动化流程&#xff1a; ● 抖音普通号评论对接语聚AI&#xff08;点击可一…

idea 常用插件和常用快捷键 - 记录

idea 常用插件 记得下载插件完成后&#xff0c;点击 Apply 和 OK Alibaba Java Coding Guidelines 作用&#xff1a;使用该插件可以&#xff0c;自动提示相关的语法格式问题&#xff0c;格式参考 阿里巴巴代码规范 详情链接&#xff1a; 代码规范之Alibaba Java Coding G…

广度优先搜索算法 BFS

广度优先搜索算法&#xff08;Breadth-First Search, BFS&#xff09; 算法思路 广度优先搜索&#xff08;BFS&#xff09;是一种用于图和树的遍历算法。该算法从一个给定的节点&#xff08;起始节点&#xff09;开始&#xff0c;探索所有该节点的邻居节点。然后对每个邻居节点…

大数据学习06-Spark分布式集群部署

Spark完全分布式部署 前期准备&#xff0c;每台服务器都需要配置安装Scala下载Scala安装包配置环境变量 安装spark解压配置环境修改配置 前期准备&#xff0c;每台服务器都需要配置 配置好IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROX…

iSCSI存储服务器

目录 一、ISCSI是什么&#xff1f; 二、ISCSI产生背景 三、存储分类 四、ISCSI架构 五、ISCSI存储服务搭建案例 一、ISCSI是什么&#xff1f; ISCSI名为互联网小型计算机系统接口又称为IP-SAN&#xff0c;是一种新的远程存储技术&#xff0c;提供存储服务的目标服务器默认使用的…

开启EMQX的SSL模式及SSL证书生成流程

生成证书 首先&#xff1a;需要安装Openssl 以下是openssl命令 生成CA证书 1.openssl genrsa -out rootCA.key 2048 2.openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -subj "/CCN/STShandong/Ljinan/Oyunding/OUplatform/CNrootCA" -out ro…

一站式低代码开发平台iVX初探

在数字化时代的浪潮中&#xff0c;低代码已经逐渐成为一种趋势和潮流。作为国内首个图形化通用无代码编程平台&#xff0c;iVX提供了一款强大、高效、易学的零代码开发语言和全生命周期一站式云原生应用开发工具&#xff0c;无疑为低代码界带来了一场革命。 1、什么是低代码&a…

Spring三级缓存解决循环依赖

Spring三级缓存解决循环依赖 一 Spring bean对象的生命周期 二 三级缓存解决循环依赖 实现原理解析 spring利用singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决的&#xff0c;所说的缓存其实也就是三个Map 先实例化的bean会通过ObjectFactory半…

【浏览器】端数据库存储方案----indexDB、localForage

浏览器存储 localStoragelocalforageIndexDB localStorage 说到本地存储数据&#xff0c;首先想到的是 localStorage&#xff0c;应该很多小伙伴都用过&#xff0c;使用很简单。然而&#xff0c;localStorage 却有下面一些缺点&#xff1a; 存储容量限制&#xff0c;大部分浏…

CocosCreator3.8研究笔记(二)windows环境 VS Code 编辑器的配置

一、设置文件显示和搜索过滤步骤 为了提高搜索效率以及文件列表中隐藏不需要显示的文件&#xff0c; VS Code 需要设置排除目录用于过滤。 比如 cocoscreator 中&#xff0c;编辑器运行时会自动生成一些目录&#xff1a;build、temp、library&#xff0c; 所以应该在搜索中排除…

视频批量智能剪辑分发管理系统----开发

短视频矩阵系统源码开发----视频批量剪辑工具&#xff0c;一键分发 抖音智能剪辑&#xff0c;视频批量发布&#xff0c;多账号管理&#xff0c;抖音搜索排名系统源码搭建 抖音seo&#xff0c;视频剪辑&#xff0c;批量发布&#xff0c;企业号管理&#xff0c;自动询盘锁定客户…

企业架构师,和技术架构师、java架构师有什么区别

一、企业架构师&#xff08;Enterprise Architect&#xff09;&#xff1a; 企业架构师关注于整个企业的战略目标、业务流程、技术体系等&#xff0c;致力于确保企业的各项业务和技术活动能够协调一致、有效运作。他们通常从全局的角度出发&#xff0c;制定和规划企业级的技术…

【UE 材质】模型部分透明

材质节点如下&#xff0c;这里简单解释一下。首先通过“Mask”节点将"Texture Coordinate" 节点中的“G”通道分离出来&#xff0c;然后通过“if”节点进行判断&#xff0c;当值小于0.5时为透明&#xff0c;当颜色不小于5时为不透明。可以通过一个参数来控制模型透明…

开发一个npm包

1 注册一个npm账号 npm https://www.npmjs.com/ 2 初始化一个npm 项目 npm init -y3编写一段代码 function fn(){return 1+2 }exports.hello=fn; </

Linux:Jupyterhub多用户远程登录安装、使用经验

1、安装 首先&#xff0c;打开官网帮助文档&#xff1a; JupyterHub 官方安装帮助文档 一般安装都是参考官方最新版安装文档。 1.1环境条件 本次安装 JupyterHub的软件环境&#xff1a; 基于 Linux Centos系统&#xff1b;Python 3.9或更高版本&#xff1b;安装 nodejs/n…

《王道24数据结构》课后应用题——第二章

文章目录 第二章【2.2】01、02、03、04、05、06、07、08、09、10、11、12、13、14、 【2.3】01、02、03、04、05、06、07、08、09、10、11、 编程题须知&#xff1a; 编程题不限语言。也可以用标准库函数&#xff0c;如C中<vector>&#xff0c;<string>等。编程题…

2023长沙/上海/深圳CSPM-3国标项目管理中级认证招生

CSPM-3中级项目管理专业人员评价&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才职业能力评价和激励机制的要…