首页 > 其他分享 >浅谈幂等设计

浅谈幂等设计

时间:2023-09-04 17:55:05浏览次数:40  
标签:浅谈 并发 token https 操作 设计 执行 ID

1 幂等性

一句话,幂等就是一个执行操作,无论执行多少次,产生的效果和返回的结果都是一样的。

2 为什么要实现幂等性?

如今随着互联网技术快速发展,业务越来越复杂,系统的高并发和关键数据的场景越来越多。

在分布式系统中,机器宕机和消息丢失也是需要重点关注的问题,其中的一个典型就是幂等性问题。

想想看,一个对外暴露的接口会面领很多次请求,如果不能保证幂等性会带来什么样的后果?

微信进行一次扣款操作,应该只扣用户一次钱,当遇到网络故障或系统bug,如果没有实现幂等性扣多了你会不会直接“C语言”投诉?

当然,有些接口是天然保证幂等性的,比如查询操作、删除操作。有些对数据的修改是一个常量,无其他操作,也是具有幂等性的。修改操作可能幂等可能不幂等。

SELECT col1 FROM tab1 WHERE col2 = 2UPDATE tab1 SET col1 = 1 WHERE col2 = 2UPDATE tab1 SET col1 = col1 + 1 WHERE col2 = 2

这三个sql只有第三个不是幂等的。

POST请求天生就不是一个幂等操作,每次调用都会在系统中产生新的资源,想要幂等就必须在业务中实现。

需要避免的是,幂等性和并发安全不是一回事。当同一笔订单即使你不停的提交支付,如果扣了不止一次钱,就说明该操作不幂等。

而有多笔订单同时进行支付,最后扣除的金额不是这么多笔金额的总和,说明该操作有并发安全问题。这是两个维度的问题,应该分开讨论解决。

3 如何实现幂等性?

(1)数据库防重

利用数据表唯一索引的特性,当并发时新增报错时,再查询一次,数据已经存在,就避免了脏数据的新增。但注意,不要将uuid作为索引字段,其大小和类型对于索引而言都会导致速度非常慢。

常见的场景,比如博客/微博系统点赞,一个用户对一个微博点赞,就把用户id与该博文id绑定,后续该用户再对该博文点赞就无法插入。再比如金融账户,可以通过在账户表中增加唯一索引来存储用户id,即使重复操作一个用户也只能拥有一个账户。

(2)token令牌机制

token机制是适用范围最广泛的一种幂等设计。虽然实现方式有很多种,但核心思想就是每次操作都生成一个唯一token凭证,服务器通过这个唯一凭证确保同样的操作不会被执行多次。

具体可以分为两个阶段,获取token和使用token。每次接口请求前先获取一个token,然后在下次请求时在请求的header体中加上这个token,后端进行校验,如果验证通过则删除token,下次请求再次判断token。如果在redis缓存的帮助下,流程图如下:

(3)分布式锁

数据库防重表可以通过分布式锁代替,相比去重表,将放并发做到了缓存中,效率更高。局限性都是同一时间只能完成一次请求。

比如某些业务处理流程很长,要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁。

4 幂等的优缺点

优点:

业务需要

缺点:

(1)客户端处理逻辑得以简化,但服务端控制幂等逻辑变得更加复杂;

(2)把并发执行变成改为串行执行,降低了执行效率。

5 扩展

分布式自增ID可以借鉴Snowflake算法,优点是高性能、低延迟、按时间有序;缺点是需要独立的开发和部署。

其结构如下:

  • 最高位是符号位,始终为0,不可用。
  • 41位的时间序列,精确到毫秒级,41位的长度可以使用 (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年。时间位还有一个很重要的作用是可以根据时间进行排序。注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) 后得到的值,这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的。
  • 10位的机器标识,10位的长度最多支持部署1024个节点。
  • 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。

加起来刚好64位,为一个Long型。这个算法很简洁,但依旧是一个很好的ID生成策略。

参考文献:

[1] 分布式系统互斥性与幂等性问题的分析与解决

https://zhuanlan.zhihu.com/p/22820761

[2] 高并发下接口幂等性解决方案

https://blog.csdn.net/u011635492/article/details/81058153

[3] 幂等性问题和解决方法

https://blog.csdn.net/qq_32020035/article/details/105448889

[4] 雪花算法

https://www.cnblogs.com/grasp/p/12309726.html

[5] 聊聊开发中幂等问题

https://segmentfault.com/a/1190000018808510

作者:京东零售 李泽阳

来源:京东云开发者社区 转载请注明来源

标签:浅谈,并发,token,https,操作,设计,执行,ID
From: https://www.cnblogs.com/jingdongkeji/p/17677722.html

相关文章

  • Python接口编程:理解、设计和实现
    在当今的软件开发世界中,接口(API)是应用程序之间进行数据交换和通信的关键方式。这种通信可以在同一应用程序的各组件之间,也可以在完全不同的系统和平台之间进行。Python作为一种功能强大的编程语言,因其易用性和丰富的库而广泛用于开发接口。理解接口在计算机科学中,接口通常是一种定......
  • 应用可视化流程设计,实现提质增效流程化办公!
    如果想要实现提高办公效率的目的,显然采用传统的办公方式是无法实现的。如今,在低代码技术平台深入无纸化办公的当下,应用可视化流程设计软件,可以借助其灵活、易操作、可视化、轻量级等优势特点,助力广大用户实现流程化办公,进入数字化转型新时代。在众多软件服务商中,流辰信息是一支有......
  • 网络规划设计师真题解析--交换机(一)(STP选择过程)
    下图所示是一个园区网的一部分,交换机A和B是两台接入层设备,交换机C和D组成核心层,交换机E将服务器群连接至核心层。如图所示,(2014年真题)如果采用默认的STP设置和默认的选举过程,其生成树的最终结果为(1),ABCD这时候交换机B上的一台工作站,想要访问交换机E上的服务器的路径是(2),A.B-D-E......
  • JAVA-基本程序设计结构(控制流程、数组)
    1.控制流程1.块作用域1.块(即复合语句)由若干条Java语句组成,并用一对大括号括起来。2.块确定了变量的作用域。3.一个块可以嵌套在另一个块中。但是不能在嵌套的两个块中声明同名的变量。2.顺序控制顺序控制:程序从上到下逐行地进行,中间没有任何判断和跳转Java中定义成员变量时......
  • 设计模式- 单例模式
    单例模式是一种创建型设计模式,可以保证一个类型有且只有一个实例存在单例模式的适用于什么场景当一个类在程序运行期间只需要一个实例的时候,就可以考虑将其做成单例模式例如一些全局的配置,用来储存程序运行期间全局的共享配置,或者可以做一个简单的消息管道,程序中所有......
  • 起盟生活APP系统开发设计和部分远源代码分享
    起盟生活也是一种卷轴模式,卷轴模式从趣步模式开始到现在,不断有新的项目出来,如果说2023年商业模式项目做个排行,我想有一半的项目是卷轴模式的项目,它的特点也很明显,互联网生意讲究免费,羊毛出在猪身上狗来买单的逻辑.免费,让所有人都能参与进来玩,免费,让系统本身具备分销裂变的属性,可以......
  • 3数据库设计
    设计过程:需求分析:数据流图、数据字典需求说明书概念结构设计:ER模型(概念模型)逻辑结构设计:关系模型,转换规则、规范化理论物理设计:硬件OS特性,DBMS特性(索引,内模式) 概念结构设计:ER E实体R联系实体  属性 联系联系也有属性 两个不同实体集之间联系:一对一  一个......
  • 2023年超爆火的15款AI设计软件
    随着人工智能技术的快速发展,数字插画之外的“泛设计”行业的从业者也开始在AI中逐渐受益。可能很多设计师还停留在“AI设计软件只能做一些动漫风格插画”的认知中,实际上受到行业需求提升的刺激,软件厂商已经开始积极研究并发布更多针对特定行业和场景的软件产品。接下来的文章中,我们......
  • 浅谈Mysql读写分离的坑以及应对的方案 | 京东云技术团队
    一、主从架构为什么我们要进行读写分离?个人觉得还是业务发展到一定的规模,驱动技术架构的改革,读写分离可以减轻单台服务器的压力,将读请求和写请求分流到不同的服务器,分摊单台服务的负载,提高可用性,提高读请求的性能。上面这个图是一个基础的Mysql的主从架构,1主1备3从。这种架构是客户......
  • 系统架构设计1
    为什么会出现架构?从软件开发过程的角度上来看系统分析(需求分析)偏向业务,而系统设计又偏向技术,中间过程存在“鸿沟”,出现了架构。这里所说的架构虽然说是系统架构大多数指的是软件架构,又叫做软件体系结构(SoftwareArchitecture)简称SA。需要注意的是结构化分析也简称‘’SA",需要结......