## 什么是冪等性
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集群架構