架构体系-黑马学习2:-业务幂等性技术架构体系(1)

news2024/11/25 12:39:17

 25min

以下涉及到的都是一人操作时候,多次点击造成的并发,对幂等性问题的影响。

大多适用场景,都是单表。没有兼顾数据库分库分表分区场景。

幂等性定义:无论对某一个资源操作了多少次,其影响都应该是相同的。换句话说,在接口重复调用的情况下,对系统产生的影响是一样的,但是返回值允许不同,如查询。

1)幂等性的概念

        幂等性不仅仅只是一次或者多次操作对资源没有产生影响,也包含第一次操作产生影响后,以后多次操作不会再产生影响。并且幂等性关注的是  是否对资源产生影响,而不关注结果。

2)接口幂等性方案-----------------------------

在增删改查中,一般是增会产生幂等性问题,需要去规避。

前端,防止幂等性的做法总结:

        防止重复提交,加遮罩;防止刷新页面或者前进后退导致页面重复提交,利用重定向成功后转向一个成功提交页面

 

 

后端方案:token机制

给客户端一个token,两种细节方案:1.redis存token,客户操作时候验证redis是否有token,有的话操作业务然后删除redis中的token,但是对两个操作需要加锁,防止错误;2.借助redis单线程和incr的原子性,这次redis中存储以token为key的键值对,对值自增,第一次获取token,值是1,第二次操作业务的时候,如果返回值只能是2的时候,允许操作业务。另外一种有问题的场景需要避免,是可能执行业务的时候超时或者异常,于是采用的是先删除token,再执行业务,业务有问题,客户重新去获取token执行新的操作。

缺点:多次交互,执行一次业务操作,需要多次交互,资源浪费大;单线程并发量有限,但是能满足大多数性能要求了

思考:这种幂等性的代码,遍布在每个功能中,导致代码重复度很高,有没有一劳永逸的办法?

  

 55min

怎么不用token,也能达成效果,降低浪费?

1h03min

 提取公共的业务:拦截器,认证token,并且删除token

3)服务幂等性方案-----------------------------

1.防重表,(多建立一张表,对一个字段或者多字段建立唯一索引)只适用于数据新增的情况,缺点:不适用于分库分表的场景        

2.select+insert操作,mysql乐观锁应对比较简单的方式,(搜索到了,提示重复;搜索不到,进行业务操作;数据库必须设置唯一索引,利用了乐观锁思想,查询默认没有被修改,修改时候利用数据库表的行锁机制)缺点:只适合并发量不高的操作。

注意:更多的是防止个人调用的时候多次点击,

 

注意: 数据库必须设置唯一索引,只适用于单表;分库分表分区后不再适用。

锁失效:方法上syconizeded 和@transtaction  一起使用出现失效

transaction操作的是方法对象的代理对象。锁  锁住的是方法本身。导致两个操作的不是同一个对象

解决办法:

乐观锁的定义

重点:读的时候,认为无人修改;改的的时候,锁住表

悲观锁:读的时候,也会锁住表。

 

乐观锁的使用,适用于修改场景,如库存减少的并发场景

版本号控制方式也只使用修改,不好使用添加,因为添加的版本每次是0;版本号不需要自增,版本号达不到控制的效果了。

高并发下的减库存(update)出现幂等性问题,数据不一致,怎么解决?

syconnizsed 加在方法上,不行,会失效。原因:当前synchonized会和方法上的注解Tranaction有不统一, Transaction会有代理类,代理对象,而synchronized锁定的是当前方法对象,所以两个操作了不同的对象,synchronized失效.

解决方法:

            1.表字段加version。前端传递过来参数version是确定的,比如0,事务执行完毕以后version变成1,并发执行的的请求带的是0,在dao层,update table where version =#{version}都不符合了。优点缺点:控制了多并发情况下只能有一个成功的场景,拍卖;减库存,库存量不止一个的情况。

            2.减库存,更合适的方案,不发生超卖就是合适的:在dao层,update table set amount = amount - #{num} where amount - #{num}>=0

总结:乐观锁保证并发问题,只适用于修改场景,不适用于新增场景

        

数据库表 有行锁,多个修改,默认会排队;

不使用版本号,直接修改数据库数据也是可以的。

聚簇索引 和非聚簇索引的的区别?意义?

乐观锁控制服务间的幂等性

2h19min

feign重试问题,导致重复下单   在减库存问题中该怎么解决??

3.zookeeper

----

幂等性操作:接口重复调用的情况下,对系统产生的影响是一样的,但是返回值允许不同。

通过zookeeper实现幂等性。怎么实现?

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

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

相关文章

Kepserver EX6配置opc ua服务端 以及客户端

一.Kepserver EX6下载 链接:https://pan.baidu.com/s/1zNr-J0vmBdu9qmI1GtXxrw 提取码:wqcl 二.Kepserver EX6安装 点击安装包》选择“简体中文语言包”》一直默认下一步就可以直到结束安装 下载包中有破解补丁的详细使用说明这里就不多做说明了 下面…

《联邦学习实战—杨强》之使用Python从零开始实现一个简单的横向联邦学习模型

文章目录前言环境准备完整代码配置文件(conf.json)获取数据集(datasets.py)获取PyTorch中自带深度学习网络预训练模型(models.py)客户端(client.py)服务端(server.py)main.py运行知识点补充argparse基本用法tensor.copy_()[Python dict() 函数](https://www.runoob.com/python/…

Redis——》数据类型:zset(有序集合)

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型:zset(有序集合)一、…

基于SpringBoot的在线点餐系统【附源码】

功能模块设计 技术概要 前端技术:JQuery,Thymeleaf, CSS 后端技术:SpringBoot,SpringMVC,mybaits 数据库:mysql 主要功能 首页实现 主页也是网址的入口处,一般包括了:LOGO、导航、Banner、…

C指针之初始化(三)

一、引言 C/C语言中引入了指针,使得程序能够直接访问内存地址,使得很多复杂的操作变得简单,同时也提高了程序的运行效率。指针即是地址,但是地址却是通过指针变量来存储的。因此我们通常所说的指针在很多时候说的都是指针变量。指…

AzkabanExecutorServer自动注册分析

启动AzkabanExecutorServer发现会自动注册,但是active默认为0,需要修改为1,否则 SELECT id, host, port, active FROM executors where activetrue查询不到记录,导致 AzkabanWebServer启动时候还是失败。 因此azkaban的正确启动…

MySQL的行锁和表锁

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题&am…

复现黑客在后门中藏匿后门

PHP实现在后门中藏匿后门 在攻击渗透的时候会传入shell后门方便进行远控。其中的后门包括多种类型,大马是功能最全的直接提供了可视化的界面方便攻击者进行提权、扫描、上传等一系列的操作。 但有很多hacker不讲武德,在写好的大马中藏入自己的后门&…

Java#28(集合进阶1---单列集合)

目录 一.Collection---------单列集合-------一次只能添加一个元素,如: 小明 1.Collection的常用方法 2.Collection的遍历 迭代器遍历 增强for遍历 Lambda表达式 3.List集合的特有方法 List集合的5种遍历方式 ArrayList集合 泛型 4.Set的方法和遍历方式 HashSet集合 …

如何用看板工具做轻量级项目管理

本文分享一下,怎么用看板工具做轻量级项目管理。 说起管理项目,会遇到各种各样的事情,我们多多少少有些头疼,人员任务分配不均,对接不及时,沟通过不及时等等。 我们包括采购、人力资源、销售、市场都在用…

【深度学习】torch.squeeze()移除维度函数 | torch.unsqueeze()增加某一维度函数 | pytorch

文章目录前言一、torch.squeeze()函数二、torch.unsqueeze()函数前言 这两个函数在pytorch框架下的深度学习经常用到,这次把它们记录一下。 一、torch.squeeze()函数 torch.squeeze()用来“挤”掉某一个维度为1的维度,或者所有维度为1的维度。&#x…

Unity3D教程:布娃娃系统

首先,将你3Dsmax的角色和Bipes汇出成FBX档,设定如下即可。(注意不可以有中文路径喔否则无法正确汇出) 打开Unity3D, 可以看见我的场景内只有:摄影机、人物(Man)、灯光、地板。 在Hierarchy视窗内将人物(Man)的Bip01所有标签打开&a…

WebRTC学习笔记一 简单示例

一、捕获本地媒体流getUserMedia 1.index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-e…

基于预训练模型的Unet【超级简单】【懒人版】【Pytorch版】

基于预训练模型的Unet【超级简单】【懒人版】【Pytorch版】 在本项目开始前&#xff0c;首先给大家保证&#xff0c;本次项目只是一个最简单的Unet实现&#xff0c;使用现成的代码&#xff0c;不需要手写代码&#xff0c;使用预训练模型&#xff0c;不需要标注数据集和训练。所…

NTFS及文件共享

一&#xff0c;NTFS安全权限概述 1、给文件和文件夹设置权限&#xff0c;通过设置权限&#xff0c;实现不同的用户访问不同文件和文件夹的权限。 2、分配了正确的访问权限后&#xff0c;用户才能访问对应资源。 3、设置权限防止资源被篡改、删除。 二、文件系统概述 文件系统…

[附源码]Python计算机毕业设计SSM旅游服务平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Whistle 前端抓包

whistle文档&#xff1a;http://wproxy.org/whistle/install.html 1.确保电脑安装了node node -v如果能正常输出Node的版本号&#xff0c;表示Node已安装成功 2.安装whistle npm install -g whistlewhistle安装完成后&#xff0c;执行命令 whistle help 或 w2 help&#xf…

Spring——三级缓存解决循环依赖详解

三级缓存解决循环依赖详解一、什么是三级缓存二、三级缓存详解Bean实例化前属性赋值/注入前初始化后总结三、怎么解决的循环依赖四、不用三级缓存不行吗五、总结一、什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形态的三个Map集合&#xff0c;如下&#xff1a; // 一…

IPv6进阶:IPv6 过渡技术之 NAT64(IPv6 节点主动访问 IPv4 节点-地址池方式)

实验拓扑 PC1是IPv4网络的一个节点&#xff0c;处于Trust安全域&#xff1b;PC2是IPv6网络的一个节点&#xff0c;处于Untrust安全域。 实验需求 完成防火墙IPv4、IPv6接口的配置&#xff0c;并将接口添加到相应的安全域&#xff1b;在防火墙上配置NAT64的IPv6前缀3001::/64&…

cpu设计和实现(数据访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在cpu设计当中&#xff0c;数据访问是比较重要的一个环节。一般认为&#xff0c;数据访问就是内存访问。其实不然。我们都知道&#xff0c;cpu访问…