如何设计营销 网站建设,wordpress搬家 中文图片,做网站要多少,html简单一套网页源代码现在这个时代大家可能最关心的就是钱了#xff0c;那么有没有想过你银行转账给你没有一次是转多的#xff0c;要么失败#xff0c;要么成功#xff0c;为什么不能失误一下多转一笔呢#xff1f;醒醒吧年轻人#xff0c;别做梦了#xff0c;做银行的能那么傻x吗#xff…现在这个时代大家可能最关心的就是钱了那么有没有想过你银行转账给你没有一次是转多的要么失败要么成功为什么不能失误一下多转一笔呢醒醒吧年轻人别做梦了做银行的能那么傻x吗
今天我们就来谈一谈为什么银行转账不能多给我转一笔关乎到钱的问题小伙伴们打起精神
要想要理解上述的疑惑不得不提的一个概念就是幂等性至于什么是幂等性如何通过代码实现幂等性下面将会详细讲述。 什么是幂等性
所谓幂等性通俗的将就是一次请求和多次请求同一个资源产生相同的副作用。用数学语言表达就是f(x)f(f(x))。
维基百科的幂等性定义如下
幂等idempotent、idempotence是一个数学与计算机学概念常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等方法是指可以使用相同参数重复执行并能获得相同结果的函数。这些函数不会影响系统状态也不用担心重复执行会对系统造成改变。 例如“setTrue()”函数就是一个幂等函数,无论多次执行其结果都是一样的更复杂的操作幂等保证是利用唯一交易号(流水号)实现.
为什么需要幂等性
在系统高并发的环境下很有可能因为网络阻塞等等问题导致客户端或者调用方并不能及时的收到服务端的反馈甚至是调用超时的问题。总之就是请求方调用了你的服务但是没有收到任何的信息完全懵逼的状态。比如订单的问题可能会遇到如下的几个问题
1. 创建订单时第一次调用服务超时再次调用是否产生两笔订单
2. 订单创建成功去减库存时第一次减库存超时是否会多扣一次
3. 订单支付时服务端扣钱成功但是接口反馈超时此时再次调用支付是否会多扣一笔呢
作为消费者前两种能接受第三种情况就MMP了哈哈哈这种情况一般有如下两种解决方式
1. 服务方提供一个查询操作是否成功的api第一次超时之后调用方调用查询接口如果查到了就走成功的流程失败了就走失败的流程。
2. 另一种就是服务方需要使用幂等的方式保证一次和多次的请求结果一致。 HTTP的幂等性
GET只是获取资源对资源本身没有任何副作用天然的幂等性。
HEAD本质上和GET一样获取头信息主要是探活的作用具有幂等性。
OPTIONS获取当前URL所支持的方法因此也是具有幂等性的。
DELETE用于删除资源有副作用但是它应该满足幂等性比如根据id删除某一个资源调用方可以调用N次而不用担心引起的错误根据业务需求而变。
PUT用于更新资源有副作用但是它应该满足幂等性比如根据id更新数据调用多次和N次的作用是相同的根据业务需求而变。
POST用于添加资源多次提交很可能产生副作用比如订单提交多次提交很可能产生多笔订单。 幂等性的实现方式
对于客户端交互的接口可以在前端拦截一部分例如防止表单重复提交按钮置灰隐藏不可点击等方式。但是前端进行拦截器显然是针对普通用户懂点技术的都可以模拟请求调用接口所以后端幂等性很重要。
后端的幂等性如何实现将会从以下几个方面介绍。
1. 数据库去重表
在往数据库中插入数据的时候利用数据库唯一索引特性保证数据唯一。比如订单的流水号也可以是多个字段的组合。
实现比较简单读者可以自己实现看看这里不再提供demo了。 2. 状态机
很多业务中多有多个状态比如订单的状态有提交、待支付、已支付、取消、退款等等状态。后端可以根据不同的状态去保证幂等性比如在退款的时候一定要保证这笔订单是已支付的状态。
业务中常常出现读者可以自己实现看看不再提供demo。
3. TOKEN机制
针对客户端连续点击或者调用方的超时重试等情况例如提交订单此种操作就可以用Token的机制实现防止重复提交。
TOKEN机制如何实现简单的说就是调用方在调用接口的时候先向后端请求一个全局IDTOKEN请求的时候携带这个全局ID一起请求后端需要对这个全局ID校验来保证幂等操作流程如下图
主要的流程步骤如下 1. 客户端先发送获取token的请求服务端会生成一个全局唯一的ID保存在redis中同时把这个ID返回给客户端。
2. 客户端调用业务请求的时候必须携带这个token一般放在请求头上。
3. 服务端会校验这个Token如果校验成功则执行业务。
4. 如果校验失败则表示重复操作直接返回指定的结果给客户端。
通过以上的流程分析唯一的重点就是这个全局唯一ID如何生成在分布式服务中往往都会有一个生成全局ID的服务来保证ID的唯一性但是工程量和实现难度比较大UUID的数据量相对有些大此处陈某选择的是雪花算法生成全局唯一ID