分布式之接口幂等性

前言

什么是幂等性?一次和多次请求某一个资源,对资源本身所产生的的影响均与一次执行的影响相同。

幂等性是系统服务对外的一种承诺,承诺只要调用接口成功了,多次调用对系统的影响是一致的。

幂等性与重复提交比较

幂等性 更多使用的情况是第一次请求知道结果,但是由于网络抖动或连接超时等情况未进行正常返回,在这种情况下系统自动再次发起请求,其目的是确认第一次是否请求完成。

重复提交 更多使用的情况是第一次请求成功或请求结果暂未返回的情况下,人为的进行多次操作。

SQL 语句幂等性

SELECT

SELECT * FROM `user` WHERE id = 1

无论执行多少次都不会对资源造成影响,查询具有天然的幂等性。

UPDATE

UPDATE `user` SET status = 1 WHERE id = 1;

无论执行成功多少次状态都是一致的,这种场景是幂等操作。

UPDATE `user` SET score = score+1 WHERE id = 1;

每次执行的结果都会发生变化,这种场景不是幂等操作。

根据具体场景看能否写成这样的 SQL

UPDATE `user` SET score = score+1 WHERE id = 1 AND score = 59;

无论执行成功多少次分数都是一致的,这种场景是幂等操作。

DELETE

DELETE FROM `user` WHERE id = 1;

无论执行成功多少次数据都是一致的,这种场景是幂等操作。

INSERT

INSERT INTO `user` (`name`, `status`, `score`) VALUES ('tom', 1, 80);

每次执行的结果都会发生变化,这种场景不是幂等操作。

根据具体场景看能否为 name 创建一个唯一索引,或执行类型这样的 SQL

INSERT INTO ... values ... ON DUPLICATE KEY UPDATE ...

// 注意,要使用这条语句,前提条件是这个表必须有一个唯一索引或主键。

实现方案

方案一

下游系统提供相应查询接口。

上游系统在 timeout 后,首先去查询一下,如果查到了,就表明已经做了,成功了就不用做了,失败了就走失败流程。

方案二

将这个查询操作交给下游系统,上游系统只管重试,下游系统保证一次和多次的请求产生的影响是一样的。这时我们就说下游系统提供的接口支持幂等性。

小结

幂等性关注的是多次请求是否对资源产生了副作用,而不是关注的结果。SELECT 语句有可能每次查询的数据不一致,但是它是幂等性的。

关于 实现方案 -> 方案二 的具体实现方案,根据业务的实际情况考虑合适的解决方案,比如:通过 SQL 语句就可以实现幂等,就没必要引入 全局唯一ID 的解决方案。

推荐阅读

  1. 分布式事务之理解篇
  2. 分布式事务之最终一致性实现方案
  3. 分布式之异步通讯组件选择
  4. 分布式之配置中心

新亮笔记
技术的深度和广度只能靠自己努力去发掘,谁也不能替你学习,在这里希望你能有所收获。

日拱一卒

2.9k 声望
1.2k 粉丝
0 条评论
推荐阅读
关于项目中 Repository 层的思考
维护这一层的开发者,可以称为 仓库管理员 ,当使用者需要查询数据的时候,需要告诉仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。

新亮2阅读 1.8k评论 1

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.4k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.6k评论 10

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5k评论 9

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.1k评论 9

日拱一卒

2.9k 声望
1.2k 粉丝
宣传栏