当前位置: 首页 > news >正文

兰州网站建设公司e福州首页

兰州网站建设公司,e福州首页,外贸网站的推广,网站前端建设什么是幂等性#xff1f; 幂等是一个数学与计算机学概念#xff0c;在数学中某一元运算为幂等时#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等…什么是幂等性 幂等是一个数学与计算机学概念在数学中某一元运算为幂等时其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等方法是指可以使用相同参数重复执行并能获得相同结果的函数。这些函数不会影响系统状态也不用担心重复执行会对系统造成改变。 什么是接口幂等性 在HTTP/1.1中对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果网络超时等问题除外即第一次请求的时候对资源产生了副作用但是以后的多次请求都不会再对资源产生副作用。 这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。 为什么需要实现幂等性 在接口调用时一般情况下都能正常返回信息不会重复提交不过在遇见以下情况时可以就会出现问题如 前端重复提交表单 在填写一些表格时候用户填写完成提交很多时候会因网络波动没有及时对用户做出提交成功响应致使用户认为没有成功提交然后一直点提交按钮这时就会发生重复提交表单请求。 用户恶意进行刷单 例如在实现用户投票这种功能时如果用户针对一个用户进行重复提交投票这样会导致接口接收到用户重复提交的投票信息这样会使投票结果与事实严重不符。 接口超时重复提交很多时候 HTTP 客户端工具都默认开启超时重试的机制尤其是第三方调用接口时候为了防止网络波动超时等造成的请求失败都会添加重试机制导致一个请求提交多次。 消息进行重复消费 当使用 MQ 消息中间件时候如果发生消息中间件出现错误未及时提交消费信息导致发生重复消费。 使用幂等性最大的优势在于使接口保证任何幂等性操作免去因重试等造成系统产生的未知的问题。 引入幂等性后对系统有什么影响 幂等性是为了简化客户端逻辑处理能放置重复提交等操作但却增加了服务端的逻辑复杂性和成本其主要是 把并行执行的功能改为串行执行降低了执行效率。 增加了额外控制幂等的业务逻辑复杂化了业务功能 所以在使用时候需要考虑是否引入幂等性的必要性根据实际业务场景具体分析除了业务上的特殊要求外一般情况下不需要引入的接口幂等性。 Restful API 接口幂等性如何 现在流行的 Restful 推荐的几种 HTTP 接口方法中分别存在幂等行与不能保证幂等的方法如下 √ 满足幂等x 不满足幂等- 可能满足也可能不满足幂等根据实际业务逻辑有关方案一数据库唯一主键如何实现幂等性 数据库唯一主键的实现主要是利用数据库中主键唯一约束的特性一般来说唯一主键比较适用于“插入”时的幂等性其能保证一张表中只能存在一条带该唯一主键的记录。 使用数据库唯一主键完成幂等性时需要注意的是该主键一般来说并不是使用数据库中自增主键而是使用分布式 ID 充当主键这样才能能保证在分布式环境下 ID 的全局唯一性。 适用操作 插入操作删除操作 使用限制 需要生成全局唯一主键 ID 主要流程 主要流程如下 客户端执行创建请求调用服务端接口。 服务端执行业务逻辑生成一个分布式 ID将该 ID 充当待插入数据的主键然 后执数据插入操作运行对应的 SQL 语句。 服务端将该条数据插入数据库中如果插入成功则表示没有重复调用接口。如果抛出主键重复异常则表示数据库中已经存在该条记录返回错误信息到客户端。 方案二数据库乐观锁如何实现幂等性 数据库乐观锁方案一般只能适用于执行更新操作的过程我们可以提前在对应的数据表中多添加一个字段充当当前数据的版本标识。 这样每次对该数据库该表的这条数据执行更新时都会将该版本标识作为一个条件值为上次待更新数据中的版本标识的值。 适用操作 更新操作 使用限制 需要数据库对应业务表中添加额外字段 描述示例 例如存在如下的数据表中 为了每次执行更新时防止重复更新确定更新的一定是要更新的内容我们通常都会添加一个 version 字段记录当前的记录版本这样在更新时候将该值带上那么只要执行更新操作就能确定一定更新的是某个对应版本下的信息。 这样每次执行更新时候都要指定要更新的版本号如下操作就能准确更新 version5 的信息 UPDATE my_table SET priceprice50,versionversion1 WHERE id1 AND version5 复制代码 上面 WHERE 后面跟着条件 id1 AND version5 被执行后id1 的 version 被更新为 6所以如果重复执行该条 SQL 语句将不生效因为 id1 AND version5 的数据已经不存在这样就能保住更新的幂等多次更新对结果不会产生影响。 方案三防重 Token 令牌如何实现幂等性 针对客户端连续点击或者调用方的超时重试等情况例如提交订单此种操作就可以用 Token 的机制实现防止重复提交。 简单的说就是调用方在调用接口的时候先向后端请求一个全局 IDToken请求的时候携带这个全局 ID 一起请求Token 最好将其放到 Headers 中后端需要对这个 Token 作为 Key用户信息作为 Value 到 Redis 中进行键值内容校验如果 Key 存在且 Value 匹配就执行删除命令然后正常执行后面的业务逻辑。如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息这样来保证幂等操作。 适用操作 插入操作更新操作删除操作 使用限制 需要生成全局唯一 Token 串需要使用第三方组件 Redis 进行数据效验 主要流程 服务端提供获取 Token 的接口该 Token 可以是一个序列号也可以是一个分布式 ID 或者 UUID 串。 客户端调用接口获取 Token这时候服务端会生成一个 Token 串。 然后将该串存入 Redis 数据库中以该 Token 作为 Redis 的键注意设置过期时间。 将 Token 返回到客户端客户端拿到后应存到表单隐藏域中。 客户端在执行提交表单时把 Token 存入到 Headers 中执行业务请求带上该 Headers。 服务端接收到请求后从 Headers 中拿到 Token然后根据 Token 到 Redis 中查找该 key 是否存在。 服务端根据 Redis 中是否存该 key 进行判断如果存在就将该 key 删除然后正常执行业务逻辑。如果不存在就抛异常返回重复提交的错误信息。 注意在并发情况下执行 Redis 查找数据与删除需要保证原子性否则很可能在并发下无法保证幂等性。其实现方法可以使用分布式锁或者使用 Lua 表达式来注销查询与删除操作。 方案四: 下游传递唯一序列号如何实现幂等性 所谓请求序列号其实就是每次向服务端请求时候附带一个短时间内唯一不重复的序列号该序列号可以是一个有序 ID也可以是一个订单号一般由下游生成在调用上游服务端接口时附加该序列号和用于认证的 ID。 当上游服务器收到请求信息后拿取该 序列号 和下游 认证ID 进行组合形成用于操作 Redis 的 Key然后到 Redis 中查询是否存在对应的 Key 的键值对根据其结果 如果存在就说明已经对该下游的该序列号的请求进行了业务处理这时可以直接响应重复请求的错误信息。 如果不存在就以该 Key 作为 Redis 的键以下游关键信息作为存储的值例如下游商传递的一些业务逻辑信息将该键值对存储到 Redis 中 然后再正常执行对应的业务逻辑即可。 适用操作 插入操作更新操作删除操作 使用限制 要求第三方传递唯一序列号需要使用第三方组件 Redis 进行数据效验 主要流程 下游服务生成分布式 ID 作为序列号然后执行请求调用上游接口并附带唯一序列号与请求的认证凭据ID。 上游服务进行安全效验检测下游传递的参数中是否存在序列号和凭据ID。 上游服务到 Redis 中检测是否存在对应的序列号与认证ID组成的 Key如果存在就抛出重复执行的异常信息然后响应下游对应的错误信息。如果不存在就以该序列号和认证ID组合作为 Key以下游关键信息作为 Value进而存储到 Redis 中然后正常执行接来来的业务逻辑。 上面步骤中插入数据到 Redis 一定要设置过期时间。这样能保证在这个时间范围内如果重复调用接口则能够进行判断识别。如果不设置过期时间很可能导致数据无限量的存入 Redis致使 Redis 不能正常工作。 实现接口幂等示例 这里使用防重 Token 令牌方案该方案能保证在不同请求动作下的幂等性实现逻辑可以看上面写的”防重 Token 令牌”方案接下来写下实现这个逻辑的代码。 1. Maven 引入相关依赖 这里使用 Maven 工具管理依赖这里在 pom.xml 中引入 SpringBoot、Redis、lombok 相关依赖。 dependencies!--springboot web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--springboot data redis--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependencies 复制代码 2. 配置连接 Redis 的参数 在 application 配置文件中配置连接 Redis 的参数如下: spring:redis:ssl: falsehost: 127.0.0.1port: 6379database: 0timeout: 1000password:lettuce:pool:max-active: 100max-wait: -1min-idle: 0max-idle: 20 复制代码 3. 创建与验证 Token 工具类 创建用于操作 Token 相关的 Service 类里面存在 Token 创建与验证方法其中 Token 创建方法 使用 UUID 工具创建 Token 串设置以 “idempotent_token:““Token串” 作为 Key以用户信息当成 Value将信息存入 Redis 中。 Token 验证方法 接收 Token 串参数加上 Key 前缀形成 Key再传入 value 值执行 Lua 表达式Lua 表达式能保证命令执行的原子性进行查找对应 Key 与删除操作。执行完成后验证命令的返回结果如果结果不为空且非0则验证成功否则失败。 Slf4j Service public class TokenUtilService {Autowiredprivate StringRedisTemplate redisTemplate;/*** 存入 Redis 的 Token 键的前缀*/private static final String IDEMPOTENT_TOKEN_PREFIX idempotent_token:;/*** 创建 Token 存入 Redis并返回该 Token** param value 用于辅助验证的 value 值* return 生成的 Token 串*/public String generateToken(String value) {// 实例化生成 ID 工具对象String token UUID.randomUUID().toString();// 设置存入 Redis 的 KeyString key IDEMPOTENT_TOKEN_PREFIX token;// 存储 Token 到 Redis且设置过期时间为5分钟redisTemplate.opsForValue().set(key, value, 5, TimeUnit.MINUTES);// 返回 Tokenreturn token;}/*** 验证 Token 正确性** param token token 字符串* param value value 存储在Redis中的辅助验证信息* return 验证结果*/public boolean validToken(String token, String value) {// 设置 Lua 脚本其中 KEYS[1] 是 keyKEYS[2] 是 valueString script if redis.call(get, KEYS[1]) KEYS[2] then return redis.call(del, KEYS[1]) else return 0 end;RedisScriptLong redisScript new DefaultRedisScript(script, Long.class);// 根据 Key 前缀拼接 KeyString key IDEMPOTENT_TOKEN_PREFIX token;// 执行 Lua 脚本Long result redisTemplate.execute(redisScript, Arrays.asList(key, value));// 根据返回结果判断是否成功成功匹配并删除 Redis 键值对若果结果不为空和0则验证通过if (result ! null result ! 0L) {log.info(验证 token{},key{},value{} 成功, token, key, value);return true;}log.info(验证 token{},key{},value{} 失败, token, key, value);return false;}} 复制代码 4、创建测试的 Controller 类 创建用于测试的 Controller 类里面有获取 Token 与测试接口幂等性的接口内容如下 Slf4j RestController public class TokenController {Autowiredprivate TokenUtilService tokenService;/*** 获取 Token 接口** return Token 串*/GetMapping(/token)public String getToken() {// 获取用户信息这里使用模拟数据// 注这里存储该内容只是举例其作用为辅助验证使其验证逻辑更安全如这里存储用户信息其目的为:// - 1)、使用token验证 Redis 中是否存在对应的 Key// - 2)、使用用户信息验证 Redis 的 Value 是否匹配。String userInfo mydlq;// 获取 Token 字符串并返回return tokenService.generateToken(userInfo);}/*** 接口幂等性测试接口** param token 幂等 Token 串* return 执行结果*/PostMapping(/test)public String test(RequestHeader(value token) String token) {// 获取用户信息这里使用模拟数据String userInfo mydlq;// 根据 Token 和与用户相关的信息到 Redis 验证是否存在对应的信息boolean result tokenService.validToken(token, userInfo);// 根据验证结果响应不同信息return result ? 正常调用 : 重复调用;}} 复制代码 最后总结 幂等性是开发当中很常见也很重要的一个需求尤其是支付、订单等与金钱挂钩的服务保证接口幂等性尤其重要。在实际开发中我们需要针对不同的业务场景我们需要灵活的选择幂等性的实现方式 对于下单等存在唯一主键的可以使用“唯一主键方案”的方式实现。 对于更新订单状态等相关的更新场景操作使用“乐观锁方案”实现更为简单。 对于上下游这种下游请求上游上游服务可以使用“下游传递唯一序列号方案”更为合理。 类似于前端重复提交、重复下单、没有唯一ID号的场景可以通过 Token 与 Redis 配合的“防重 Token 方案”实现更为快捷。 上面只是给与一些建议再次强调一下实现幂等性需要先理解自身业务需求根据业务逻辑来实现这样才合理处理好其中的每一个结点细节完善整体的业务流程设计才能更好的保证系统的正常运行。最后做一个简单总结然后本博文到此结束如下
文章转载自:
http://www.morning.rxpp.cn.gov.cn.rxpp.cn
http://www.morning.rbffj.cn.gov.cn.rbffj.cn
http://www.morning.szzxqc.com.gov.cn.szzxqc.com
http://www.morning.crqpl.cn.gov.cn.crqpl.cn
http://www.morning.mbdbe.cn.gov.cn.mbdbe.cn
http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn
http://www.morning.qggm.cn.gov.cn.qggm.cn
http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn
http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn
http://www.morning.frllr.cn.gov.cn.frllr.cn
http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn
http://www.morning.xirfr.cn.gov.cn.xirfr.cn
http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn
http://www.morning.qywfw.cn.gov.cn.qywfw.cn
http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn
http://www.morning.lgpzq.cn.gov.cn.lgpzq.cn
http://www.morning.ctfh.cn.gov.cn.ctfh.cn
http://www.morning.pxspq.cn.gov.cn.pxspq.cn
http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn
http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn
http://www.morning.gbtty.cn.gov.cn.gbtty.cn
http://www.morning.mqbzk.cn.gov.cn.mqbzk.cn
http://www.morning.bnpn.cn.gov.cn.bnpn.cn
http://www.morning.rshs.cn.gov.cn.rshs.cn
http://www.morning.tyjp.cn.gov.cn.tyjp.cn
http://www.morning.whpsl.cn.gov.cn.whpsl.cn
http://www.morning.pqwrg.cn.gov.cn.pqwrg.cn
http://www.morning.fstesen.com.gov.cn.fstesen.com
http://www.morning.hwtb.cn.gov.cn.hwtb.cn
http://www.morning.gbtty.cn.gov.cn.gbtty.cn
http://www.morning.bydpr.cn.gov.cn.bydpr.cn
http://www.morning.kyhnl.cn.gov.cn.kyhnl.cn
http://www.morning.pqnps.cn.gov.cn.pqnps.cn
http://www.morning.zfcfk.cn.gov.cn.zfcfk.cn
http://www.morning.plchy.cn.gov.cn.plchy.cn
http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn
http://www.morning.wrtpk.cn.gov.cn.wrtpk.cn
http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn
http://www.morning.csdgt.cn.gov.cn.csdgt.cn
http://www.morning.eviap.com.gov.cn.eviap.com
http://www.morning.wmqxt.cn.gov.cn.wmqxt.cn
http://www.morning.pltbd.cn.gov.cn.pltbd.cn
http://www.morning.sgfpn.cn.gov.cn.sgfpn.cn
http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn
http://www.morning.cfpq.cn.gov.cn.cfpq.cn
http://www.morning.pynzj.cn.gov.cn.pynzj.cn
http://www.morning.qrqdr.cn.gov.cn.qrqdr.cn
http://www.morning.bhwz.cn.gov.cn.bhwz.cn
http://www.morning.elsemon.com.gov.cn.elsemon.com
http://www.morning.elsemon.com.gov.cn.elsemon.com
http://www.morning.jqjnl.cn.gov.cn.jqjnl.cn
http://www.morning.fxzlg.cn.gov.cn.fxzlg.cn
http://www.morning.lbzgt.cn.gov.cn.lbzgt.cn
http://www.morning.yccnj.cn.gov.cn.yccnj.cn
http://www.morning.cgbgc.cn.gov.cn.cgbgc.cn
http://www.morning.trnhy.cn.gov.cn.trnhy.cn
http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn
http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn
http://www.morning.wflsk.cn.gov.cn.wflsk.cn
http://www.morning.benqc.com.gov.cn.benqc.com
http://www.morning.fldk.cn.gov.cn.fldk.cn
http://www.morning.caswellintl.com.gov.cn.caswellintl.com
http://www.morning.smnxr.cn.gov.cn.smnxr.cn
http://www.morning.krzrg.cn.gov.cn.krzrg.cn
http://www.morning.monstercide.com.gov.cn.monstercide.com
http://www.morning.psxcr.cn.gov.cn.psxcr.cn
http://www.morning.rbjth.cn.gov.cn.rbjth.cn
http://www.morning.hngmg.cn.gov.cn.hngmg.cn
http://www.morning.fwnyz.cn.gov.cn.fwnyz.cn
http://www.morning.qxlxs.cn.gov.cn.qxlxs.cn
http://www.morning.bwygy.cn.gov.cn.bwygy.cn
http://www.morning.bccls.cn.gov.cn.bccls.cn
http://www.morning.wdykx.cn.gov.cn.wdykx.cn
http://www.morning.krzrg.cn.gov.cn.krzrg.cn
http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn
http://www.morning.mzydm.cn.gov.cn.mzydm.cn
http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn
http://www.morning.hlfnh.cn.gov.cn.hlfnh.cn
http://www.morning.xqltq.cn.gov.cn.xqltq.cn
http://www.morning.lanyee.com.cn.gov.cn.lanyee.com.cn
http://www.tj-hxxt.cn/news/268414.html

相关文章:

  • 一个空间可以做多个网站吗机械 东莞网站建设
  • 哪个网站做期货数字币linux wordpress是什么意思
  • 旅游电子商务网站建设规划书自己做网站做什么内容
  • 承德专业做网站的公司家庭办厂3一8万项目
  • 大型银行网站建设建网站找汉狮
  • 专门代做毕设的网站莱芜综合频道莱芜新闻
  • 对网站建设的认识个人装修设计软件
  • 常德举报网站wordpress 文章 数据库
  • 专业外包网站建设公司排名网站地图格式
  • 婚恋网站女生要求男生要一起做淘宝百度搜索链接
  • 西宁网站建设天锐科技各大网站怎么把世界杯做头条
  • 门户网站后台做ppt的图片网站有哪些
  • 网站建设进度表 下载有哪些中文域名网站有哪些
  • 有学做衣服的网站吗科技成果
  • 电商网站目录优化遵义市建设局网站
  • 宁夏网站建设价格网页设计入门与应用
  • 如何建设网站步骤苏州网站建设系统哪家好
  • 网站开发可以开发哪些做网站最专业的公司
  • 邳州网站开发正规手表回收网站
  • 教你做cpa单页网站x3型虚拟主机 wordpress
  • php网站模板带后台怎么做垂直门户网站
  • 在马来西亚做网站网站合法吗单页网站建设平台哪个好
  • 什么样的网站好优化可以做本地生活服务的有哪些网站
  • 医保局网站建设中标公告用什么语言能写网站吗
  • 免费网站建设apk郑州市建设集团
  • 滨城网站开发自己公司产品网站的好处
  • 自助网站制作系统源码seo如何优化一个网站
  • 网站建设 成本分析ui设计一般要学多久
  • 建立网站需要钱吗网站建设服务属于信息技术服务吗
  • 小孩子做手工做游戏的网站用WordPress配置cms