幂等性:可能你对一件事情进行操作,这个操作可能要执行多次,那么最终操作的结果都是相同的。好像执行一条sql语句,执行多次之后结果都是一致的。
我们可以借鉴数据库的乐观锁的机制:比如我们要执行更新一条库存的sql语句
update T_REPS set count = count-1,verson = verson +1 where verson = 1
就是一开始读取时候,先读取version,写入操作之前先判断version的值 才进行更新 保证不重复执行
消费端--幂等性保证
在海量订单产生的业务高峰期,如何避免消息的重复消费问题
消费端实现幂等性,就意味着,我们消息永远不会被多次消费,即使我们·收到多条一样的消息。
虽然代码可能跑多次,但是写入数据 消费的信息只有一次。
-
唯一id+指纹码机制 利用数据库主键去重
-
利用redis的原子性去实现
指纹码机制一般都是根据业务规则+时间戳拼接实现的,一般不会随机生成的,要保证唯一性,用户可能在一个时间段中多次提交支付请求
,然后就是根据指纹码机制判定。缺点就是 会有数据库瓶颈压力 可以通过哈希算法实现路由,将单个数据库的幂等性转换为多数据幂等性。
第一个问题:如果消息进行入库处理的话,需要考虑的问题就是如何保证数据库和缓存做到原子性,保证数据库和缓存原子性。
你可能会想到加事务,但是两个数据源不能加事务啊,所以可能会出现 数据库写入成功 但是缓存没有写入成功 缓存写入成功但是数据库没有写入成功。
假设数据没有写入成功 缓存写入成功了 第二次相同的消息过来 是否过滤还是写入数据库中
第二个问题就是:如何设置定时同步策略问题。