常见技术类缺陷及解决方案

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 常见技术类缺陷及解决方案

好久没写技术类的文章了,整理下最近发现的一些非功能需求类的缺陷及对应的解决方案,仅供参考,技术类的缺陷与技术架构是强相关的,切勿生搬硬套。


01


第一类:接口超时问题。


不论是通过F12分析页面请求,还是查看Skywalking做链路分析,经常会发现接口超时的问题。简单地调用流程图如下:



 

针对这类问题,需要区分不同的业务诉求来做处理,主要分成两类。


源系统对结果实时性要求高的,可以做以下优化手段:

  1. 目标系统要做分页请求拦截,每页在10~200条之间;
  2. 目标系统尽可能避免多层循环嵌套,在循环中避免对数据库批量请求操作;
  3. 目标系统尽可能采用一些缓存机制来确保业务逻辑加速处理;

 

源系统对结果实时性要求低的,可以做以下优化手段:

  1. 通过MQ消息队列进行解耦处理;
  2. 采用异步机制来提升接口的性能和MQ的吞吐量


02


第二类:数据库死锁问题。


在多并发的情况下,由于锁的使用不当,或者事务过大,都会造成数据库锁的问题,进而引发性能问题,常见的大事务引发的问题如:


 

如何定位数据库是否有死锁,如果是Mysql数据库,可通过“show engine innodb status" SQL来查看(需要较大的数据库权限),如果出现如下信息,则说明有锁存在,具体的分析过程请自行查阅相关资料。


解决方案通常有两种:利用好Spring的事务传播机制,共7种,了解它们的使用场景及用法,全局自动提交/回滚事务。

 

另一种是利用java finally块代码执行机制,在代码异常块中手动回滚事务,要注意必须在finally中作处理,如下图;



03


第三类:数据丢失问题。


数据丢失或者变异通常发生在异步处理的场景中,同步场景中几乎不会发生,简单的调用关系如下:



主要有三类情况会发生数据丢失的问题。


源系统调用接口或发送消息时数据丢失,造成这类问题的原因,包含但不限于以下情况:

(1)MQ服务器磁盘空间不足、宕机等;

(2)断网、网络波动等;


常用的解决方案(适用于断网、网络波动、目标系统服务异常时的场景):

(1)源系统调用接口或发送消息时,记录日志到ELK--以后排查问题的时候用

(2)源系统接口调用/发送失败时消息时:如果首次执行失败,每隔10s,再次调用/发送,直到调用/发送成功;连续3次调用/发送失败,将接口调用/发送消息存入本地消息表,通过定时任务补偿机制,在业务空闲时重试;重试执行成功后,维护更新本地消息表中执行状态或清除本地消息表中的数据;

 

数据传输过程中数据丢失造成这类问题的原因,包含但不限于以下情况:

(1)单次调用接口请求/发送消息 数据量过大;

(2)MQ服务器磁盘空间不足、宕机等;

(3)断网、网络波动等;

(4)黑客、软件劫持网络;

上述 2、3、4 为小概率事件,一般情况,主要精力还是投放在程序代码上面。


常用的解决方案:

(1)请求数据分页,每页不超过200条(网络、服务器较差的环境,分页需要拆的更小);

(2)对MQ服务器进行监控;

(3)通过架设高可用的网络,来提高网络质量;

(4)防火墙、WAF等安全设备;

 

目标系统接收到数据,处理过程中丢失数据(重点关注)造成这类问题的原因,包含但不限于以下情况:

(1)目标系统接收数据后急于直接进行业务逻辑处理;

(2)目标系统大事务;

(3)目标系统数据库死锁;

(4)目标系统接口性能问题;

……


常用的解决方案

(1)目标系统收到数据后,记录日志到ELK--以后排查问题的时用

(2)目标系统收到数据后:第一步:将数据落入本地消息表;第二步:然后直接返回源系统已收到数据的请求;第三步:异步处理收到的数据;第四步:调用源系统补偿机制接口告诉数据处理结果;--需要源系统配合提供补偿机制接口,第五步:异步维护本地消息表中的数据处理状态


04


第四类:数据重复问题。


在高并发或者用户快速点击页面的情况下,有时候会造成数据的重复提交,特别是在新增事务的场景中,比如基础数据重复提交、订单重复提交、扫描枪快速多次扫描上报数据等。

 

解决这类问题,可参考秒杀系统设计原理,作如下处理:

1、按钮置灰,禁止用户重复提交请求;

2、TF技术:通过JS在一定时间内只能提交一次请求;

3、Redis标志位策略:首次请求时,在Redis中创建一个标志位,然后执行业务代码;

再次请求时,到Redis上查看这个标志位是否存在,如果存在,拒绝请求;如果业务代码执行完毕,删除Redis中的标志位;

4、 关注接口的幂等性验证测试;


05


相对于功能测试,技术类的缺陷需要测试人员关注业务的技术实现,因为这些问题比较难直观地反馈到页面上,但是出了问题,影响范围又相对会比较广。所以需要测试人员具备一定的技术视野,去了解研发实现,从技术层面提出相对应的测试策略,提升自己的价值。

 

你,平时会注意到这些问题吗?

 

PS:因为涉及保密问题,所以本文所提到的场景均没有给出案例,但思路和解决方案都是可落地的,仅供参考。


共勉。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
机器学习/深度学习 人工智能 算法
以图搜图系统概述
以图搜图系统概述
294 2
以图搜图系统概述
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
733 0
|
存储 缓存 搜索推荐
session 详解:掌握客户端会话管理
session 详解:掌握客户端会话管理
|
12月前
|
开发工具 git
git如何不上传指定的文件或文件夹
【7月更文挑战第9天】平时写代码的时候有很多测试文件或者静态文件,没必要上传到git上,不仅占资源更新还麻烦,以下介绍如何忽略不需要上传的文件或文件夹。
882 8
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的伦理困境与未来发展方向
【8月更文挑战第5天】随着深度学习技术在多个领域的广泛应用,其带来的伦理问题也日益受到关注。本文将探讨深度学习中存在的伦理挑战,包括数据隐私、算法偏见和自动化失业等问题,并提出相应的解决策略。同时,文章还将展望深度学习的未来发展趋势,探讨其在技术创新和社会应用中的潜力与挑战。
157 3
|
NoSQL 安全 Linux
Redis 从入门到精通之内存和CPU配置优化
Redis 是一种基于内存的数据存储系统,因此内存的规划是非常重要的。在配置 Redis 内存时,应该避免物理内存使用过量导致大量使用 Swap,同时需要考虑内存碎片的问题。根据多年的经验整理了一些建议
1246 70
|
机器学习/深度学习 人工智能 搜索推荐
AI在医疗诊断中的应用与前景
AI技术在医疗诊断领域的应用不仅提升了诊断的准确性和效率,还为个性化治疗和预防医学提供了新的可能性。本文探讨了AI在影像分析、疾病预测、个性化治疗和健康管理等方面的实践和未来前景,指出了当前面临的挑战与解决方向。
393 4
|
SQL 存储 druid
浅析SaaS多租户系统数据隔离实现方案
多租户问题,其是一种架构设计方式,就是在一台或者一组服务器上运行的SaaS系统,可以为多个租户(客户)提供服务,目的是为了让多个租户在互联网环境下使用同一套程序,且保证租户间的数据隔离。从这种架构设计的模式上,不难看出来,多租户架构的重点就是同一套程序下多个租户数据的隔离。由于租户数据是集中存储的,所以要实现数据的安全性,就是看能否实现对租户数据的隔离,防止租户数据不经意或被他人恶意地获取和篡改
2013 0
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
164 0
|
存储 分布式计算 NoSQL
大数据编程技术基础实验七:HBase实验——部署HBase
大数据技术基础实验七,.掌握HBase集群安装部署及HBase Shell的一些常用命令的使用。
877 0
大数据编程技术基础实验七:HBase实验——部署HBase