当前位置: 首页 > news >正文

秋招Day19 - 分布式 - 分布式设计

什么是幂等性?

多次调用的效果和一次调用的效果一样,比如DELETE操作,执行多次的结果和执行一次的结果对数据库的影响是一样的。

有些操作不满足幂等性,比如INSERT操作,用户点击了两次表单,数据库就有两条重复的记录。MQ消费者在读取消息的时候,也有可能读取到重复消息。

在分布式系统里,只要下游服务有写操作(插入、更新),就有可能出现幂等性问题。

怎么保证接口幂等性?

  1. insert 前先 select

在保存数据的接口中,在insert前,先根据requestId等字段先select一下数据。如果该数据已存在,则直接返回,如果不存在,才执行  insert操作。

  1. 加唯一索引

加唯一索引是个非常简单但很有效的办法,如果重复插入数据的话,就会抛出异常,为了保证幂等性,一般需要捕获这个异常。

如果是java程序需要捕获:DuplicateKeyException异常,如果使用了spring框架还需要捕获:MySQLIntegrityConstraintViolationException异常。

  1. 加悲观锁

更新逻辑,比如更新用户账户余额,可以加悲观锁,把对应用户的哪一行数据锁住。同一时刻只允许一个请求获得锁,其他请求则等待。

select * from user id=123 for update;

这种方式有一个缺点,获取不到锁的请求一般只能报失败,比较难保证接口返回相同值。

  1. 加乐观锁

更新逻辑,也可以用乐观锁,性能更好。可以在表中增加一个timestamp或者version字段,例如version:

在更新前,先查询一下数据,将 version 也作为更新的条件,同时也更新 version:

update user set amount=amount+100,version=version+1 where id=123 and version=1;

更新成功后,version 增加,重复更新请求进来就无法更新了。

  1. 建防重表

有时候表中并非所有的场景都不允许产生重复的数据,只有某些特定场景才不允许。这时候,就可以使用防重表的方式。

例如消息消费中,创建防重表,存储消息的唯一 ID,消费时先去查询是否已经消费,已经消费直接返回成功。

  1. 状态机

有些业务表是有状态的,比如订单表中有:1-下单、2-已支付、3-完成、4-撤销等状态,可以通过限制状态的流动来完成幂等。

  1. 分布式锁

直接在数据库上加锁的做法性能不够友好,可以使用分布式锁的方式,目前最流行的分布式锁实现是通过 Redis,具体实现一般都是使用 Redission 框架。

  1. token 机制

请求接口之前,需要先获取一个唯一的 token,再带着这个 token 去完成业务操作,服务端根据这个 token 是否存在,来判断是否是重复的请求。

http://www.lryc.cn/news/601096.html

相关文章:

  • RoPE:相对位置编码的旋转革命——原理、演进与大模型应用全景
  • LChot100--128. 最长连续序列
  • 前缀和-238-除自身以外数组的乘积-力扣(LeetCode)
  • 基于深度学习的图像分类:使用Inception-v3实现高效分类
  • FastAPI入门:demo、路径参数、查询参数
  • GPU运维常见问题处理
  • Vibe Coding | 技术让我们回归了创造的本质
  • 基于深度学习的图像分类:使用Capsule Networks实现高效分类
  • 【HTML】<script>元素中的 defer 和 async 属性详解
  • 前端开发 Vue 结合Sentry 实现性能监控
  • 掌握JavaScript函数封装与作用域
  • LeetCode 895:最大频率栈
  • 【micro:bit】从入门到放弃(六):示例蜂鸣器音乐、摇色子、光照强度、串口调试、麦克风
  • C++/CLI与标准C++的语法差异(一)
  • 大话数据结构之 < 栈>(C语言)
  • Pspice仿真电路:(三十四)如何使用Pspcie进行仿真
  • 每日一题【删除有序数组中的重复项 II】
  • k8s之控制器详解
  • 基于springboot的图书借阅系统
  • mysql-数据表-DDL语句
  • Python爬虫实战:诗词名句网《三国演义》全集
  • Redis C++客户端——通用命令
  • 相机标定相关原理
  • FitCoach AI:基于React+CloudBase的智能健身教练应用开发全解析
  • Ubuntu系统 系统盘和数据盘扩容具体操作
  • S7-200 SMART 数字量 I/O 组态指南:从参数设置到实战案例
  • 6G通感算
  • AI使能的SVD算子:基于深度学习的矩阵分解方法
  • 【计算机组成原理】第一章:计算机系统概述
  • python---元组解包(Tuple Unpacking)