1. 什么是幂等?
幂等是一个数学与计算机科学概念。
计算机科学中,幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同
2.SQL的幂等性
SELECT * FROM USER WHER ID = 1; // 无论执行多少次重复请求,都不会改变状态,是天然的幂等。
UPDATE USER SET STATE = 1 WHERE ID = 1; // 无论执行多少次重复请求,都不会改变状态,也是幂等操作。
UPDATE USER SET AGE = AGE + 1 WHERE ID = 1;// 每次执行的结果都会发生变化,这种就不是幂等的。
HTTP方法的幂等性是指在多次执行相同请求的情况下,服务器的状态不会改变。以下是以表格形式展7GET、POST、PUT、DELETE方法是否满足幂等性:
3.什么是接口幂等性?
接口幂等性简单来说,就是需要确保一个操作无论执行多少次,其结果和对系统状态的影响都与执行一次相同。换个维度,也可以理解为对于相同的请求,无论请求多少次,都应该返回相同的结果。(即重复请求获得相同的响应,而不应该产生额外的副作用)。
注:幂等性的概念并不局限于分布式系统,它同样适用于单机架构。幂等性是一种设计原则,确保了操作的一致性和可预测性。
4.什么场景需要幂等设计?
一般对数据要求比较高的场景,如:金钱交易、数据一致性至关重要的业务场景:
在线支付:当用户发起支付请求时,避免重复扣款。
银行交易:确保同一笔交易不会因网络重试等原因被执行多次。
票务系统:在线购票平台在用户购票时,检查所选座位是否已被重复预订。
通信服务:如短信或通话服务,系统会检查是否已为相同内容的请求计费。
用户注册:防止因重复提交表单而导致用户信息被创建多次。
4.如何产生幂等问题?
产生幂等性问题的原因主要有:
网络请求重试:网络波动或超时,客户端可能会重复发送相同的请求。
用户界面重复提交:用户在用户界面上可能会不小心重复点击按钮,导致相同的请求被发送多次。
消息队列重试机制:使用消息队列(如Kafka、RabbitMQ)时,消息可能会被重复消费。
数据库并发操作:数据库的插入、更新和删除操作多个事务同时修改同一条记录,而没有使用适当的锁机制或事务隔离级别。
外部系统API接口重试:对外提供的API接口可能由于调用方的重试逻辑,导致数据库操作被重复调用。
6.如何保证幂等?
7.幂等方案(防重令牌)的原理
①. 服务端提供获取TOKEN的接口;
②. 客户端向服务端发起请求前,第一步先获取TOKEN,将该TOKEN存入REDIS后并将TOKEN返回给客户端;
③. 第二步,客户端在HEADER中携带该TOKEN向服务端发起业务请求;
④. 服务端接收请求从HEADER中解析TOKEN,并在REDIS中查找该TOKEN;
⑤. 如果TOKEN存在,则删掉该TOKEN,继续执行下面的业务操作;
⑥. 如果TOKEN不存在,说明第一次请求已将TOKEN删除,当前的请求并不是第一次请求,则返回重复操作的信息。