## 什么是幂等性
1. 可以借鉴数据库的乐观锁机制;
2. 比如我们执行一条更新库存的SQL语句;
3. 幂等性就是无论执行多少次,结果都是唯一的;
```
update t_reps set count = count - 1 ,version = version + 1 where version = 1; //当两个并发请求过来时,可以通过检查version的版本号来避免count = -1的情况;
```
## 消费端-幂等性保障
在海量订单产生的业务高峰期,如果避免消息的重复消费,消息重复投递;
1. 消费端实现幂等性,就意味着,我们的消息永远不会消费多次,即使我们收到了多条一样的消息;
2. 唯一ID + 指纹码 机制,利用数据库主键去重;
3. 利用Redis的原子性去实现;
## 唯一ID + 指纹码 机制
简单的说就是将处理过的消息入库,并且保证有一个唯一识别的标识,当相同的消息再接收到的时候,先去数据库中查询,如果查询到有这条记录,那么就不进行这条消息的消费而直接丢弃;
1. select count(1) from t_order where id = 唯一ID + 指纹码;
2. 好处:实现简单;
3. 坏处:高并发下有数据库写入的性能瓶颈;
4. 解决方案:跟进ID进行分库分表进行算法路由;
## 利用Redis原子特性实现
因为Redis是单线程的,所以它是原子性的,那么可以使用setex来保证原子性,如果这个值存在,那么就说明此消息被处理过了,则丢弃;
**使用Redis进行幂等,需要考虑的问题:**
1. 我们是否需要进行数据库落库,如果落库的话,关键解决的问题是数据库和缓存如何做到原子性;第一条数据来了,记录到Redis了,结果在入库的时候失败了,那么就造成了数据的不同步;事务是没有办法解决的;
2. 如果我们不进行落库,那么都存到缓存中,如何设置定时同步的策略;数据不可能一直放在缓存中.缓存也是不靠谱的;
- 定义和特征
- 安装
- 基本概念
- 插件管理
- 核心概念
- virtual hosts
- connextion
- exchange
- channel
- queue
- binding
- 工作模式
- simple模式
- work模式
- 订阅模式
- routing模式
- topic模式
- QOS服务质量
- =====分割线=====
- RabbitMQ核心概念
- 初识RabbitMQ
- 什么是AMQP高级消息队列协议
- AMQP核心概念
- RabbitMQ整体架构模型
- 命令行与管控台操作
- RabbitMQ消息生产与消费
- RabbitMQ交换机详解
- 什么是exchange
- direct
- topic
- fanout
- headers
- RabbitMQ绑定,队列,虚拟主机,消息
- RabbitMQ高级特性
- 消息保障100%投递成功
- 幂等性概念及业界主流解决方案
- confirm确认消息
- return返回消息
- 自定义消费者
- 消费端限流策略
- 消费端ack与重回队列机制
- TTL消息
- 死信队列
- RabbitMQ集群架构
