您现在的位置是:首页 > 正文

分布式-幂等性解决方案

2024-04-01 00:49:59阅读 0

定义

接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了不同结果。在分布式系统中,接口由于有三态(成功、失败、无响应)的问题,为了提高系统的可用性,重试是不可避免的,重试就会引发幂等性问题,这是一个因果关系。

常见幂等性问题

重复下单

在App中下订单的时候,点击确认之后,没反应,就又点击了几次。在这种情况下,如果无法保证该接口的幂等性,那么将会出现重复下单问题。

重复消费

在接收消息的时候,消息推送出现重复。如果处理消息的接口没有保证幂等性,那么重复消费消息产生的影响可能会非常大的。

发送短信

如果APP重复点击调用后台接口,后台重复调用第三方接口,造成用户收到多条短信,一般情况下控制在60s内再重发短信,如果不做控制,每一次调用第三方接口都会收费。

form表单提交

我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。

接口超时重试

项目中为了解决接口超时问题,通常会引入了重试机制。第一次请求接口超时了,请求方没能及时获取返回结果,为了避免返回错误的结果,于是会对该请求重试几次,这样也会产生重复的数据。

天然的幂等操作

查询操作

在数据不变的情况下,查询一次和多次的结果是一样的。

删除操作

删除一次和删除多次的结果是一样的,都是把结果删除,有点多余感觉。

非幂等操作

添加和修改操作,如果不做幂等性处理,有可能每调用一次,都会对数据结果产生影响。

幂等性解决方案

1.数据库添加唯一索引:比如订单号是唯一索引,防止生产重复订单
2.分布式锁:防止应用程序出现并发操作
3.token机制,防止重复提交:提交后台时带token值,先判断token是否存在,存在删除 token,执行业务逻辑
4.数据库通过乐观锁(update table_name set version=version+1 where version=0)
5.JVM锁(Synchronized/Lock)只适用于单机环境
6.数据库悲观锁,通常是通过主键或唯一索引和事务一起实现。

网站文章

  • AppScan 扫描测试策略

    AppScan 扫描测试策略

    使用 AppScan 进行扫描针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan)、执行(Do)、检查(check)、分析(Analysis and Action)。在计划阶段:明确目的,进行策略性的选择和任务分解。明确目的:选择合适的扫描策略了解对象:首先进行探索,了解网站结构和规模确定策略:进...

    2024-04-01 00:49:53
  • 08_C++智能指针(给自己赞一个)

    参考:六大智能指针:auto_ptr\shard_ptr\shared_array\scoped_ptr\scoped_array\week_ptrhttps://blog.csdn.net/zhourong0511/article/details/80315961auto_ptr: https://www.cnblogs.com/litterrondo/p/3187342.htmlV...

    2024-04-01 00:49:27
  • 计算机网卡的总线接口分类有,网卡的详细分类是怎样的?以太网卡有将高层数据转换为比特流的功能吗?...

    随着计算机网络技术的飞速发展,为了满足各种应用环境和应用层次的需求,出现了许多 不同类型的网卡,网卡的划分标准也因此出现了多样化,下面我们就对目前市面上主流的网卡分类情况进行一下浏览。按总线接口类型分...

    2024-04-01 00:49:20
  • 编写一个用户登录的程序,要求使用SharedPreferences实现数据的存取和删除

    编写Layout布局文件

    2024-04-01 00:49:14
  • Docker部署单点Elasticsearch与Kibana

    Docker部署单点Elasticsearch与Kibana

    因为需要部署kibana容器,因此需要让es和kibana容器互联。这里创建一个网络:docker network create es-net # 创建一个网络名称为:es-net。

    2024-04-01 00:49:06
  • 关于shell脚本之——监控脚本

    #!/bin/bash NC=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free|gre...

    2024-04-01 00:48:41
  • 简单解决jupyter notebook没有其它conda环境及访问D,E盘的问题

    本教程是在windows系统上操作 1 解决jupyter notebook没有其它conda环境 1.1打开anaconda prompt, 在base环境下使用命令 conda install n...

    2024-04-01 00:48:30
  • springboot+disruptor再体验

    springboot+disruptor再体验

    Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。disruptor在github网址为:ht...

    2024-04-01 00:48:05
  • mysql max_allowed_packet查询和修改

    mysql max_allowed_packet查询和修改

    2)也可以直接创建 /etc/my.cnf, 或者从你安装的mysql的相关目录中(可能是/usr/include/mysql或/usr/share/mysql)找一个my.cnf 或 my-smal...

    2024-04-01 00:48:01
  • Dialog:手动输入信息

    Dialog:手动输入信息

    模仿"ofo"手动输入自行车ID,界面可能丑了了点,大致功能:1.如果客户输入的id号超过12位提示用户并且不可以再输入2.当字符串为空时,”x“消失,客户点击”x“能清空editText里面的内容3...

    2024-04-01 00:47:54