# 冪等生產者和事務生產者
* 消息交付可靠性保障
* i.e. Kafka 對 Producer 和 Cosumer 要處理的消息提供什么樣的承諾
* 常見承諾
* 最多一次(at most once):消息可能會丟失,但絕不會重復發送
* 至少一次(at least once):消息不會丟失,但可能重復發送
* 精確一次(exactly once):消息不會丟失,也不會重復發送
* Kafka 默認的可靠性保障為`至少一次`
## Kafka 的 exactly once
* 通過以下兩個機制
* 冪等性(Idempotence)
* 事務(Trannsaction)
## 冪等性
* 數學概念
* 某些操作或函數能夠被執行多次,但每次得到的結果都是不變的。
* CS 概念
* 在命令式 PL 中(e.g. C),若一個子程序是冪等的,那它必然不能修改系統狀態
* 在函數式 PL 中(e.g. Scala),純函數(pure function)天然冪等,不執行任何的 side effect
* 冪等優勢
* 可以安全重試
## 冪等性 Producer
* Kafka 中 Producer 默認不冪等
* V0.11.0.0 之后 可以指定 Producer 的冪等性
* props.put("enable.idempotence", true)
* Kafka 自動幫你做消息的去重
* 具體原理
* 利用空間換時間的優化思路
* 在 Broker 保存一些字段
* 當 Producer 發送了相同呢字段值的消息后,Broker 會在后臺將其丟棄
* 冪等性的作用范圍
* 只能保證單分區上的冪等性,i.e. 一個冪等性 Producer 能夠保證某個 Topic 的一個 Partitio 不出現重復消息
* 只能實現單會話上的冪等性,不能跨會話。i.e. 當重啟 Producer 則不保證冪等性
* 對于多分區 & 多會話上做消息無重復的做法:使用`事務`
## 事務
* Kafka 的事務概念類似數據庫領域的 ACID
* 主要在 read committed 隔離級別上做事情
* read committed: 已提交讀。當讀取數據庫時,只能看到已提交的數據,即無臟讀。
## 事務型 Producer
* 保證消息原子性地寫入到多個分區中
* 不怕進程重啟
* 設置事務型 Producer
* Producer 端參數:enable.idempotence = true
* Producer 端參數:設置 transactional.id
``` Java
producer.initTransactions();
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}
```
* Consumer 端讀取事務型 Producer 發送的消息也需要調整
* 設置 isolation.level 值
* read_uncommitted:默認值,一切都會讀。此處不合適。
* read_committed:Consumer 只會讀取 Producer 成功提交事務寫入的消息。
* 事務型 Producer 性能更差
- 概覽
- 入門
- 1. 消息引擎系統
- 2. Kafka 術語
- 3. 分布式流處理平臺
- 4. Kafka “發行版”
- 5. Kafka 版本號
- 基本使用
- 6. 生產集群部署
- 7. 集群參數配置
- 客戶端實踐與原理
- 9. Consumer 分區機制
- 10. Consumer 壓縮算法
- 11. 無消息丟失配置
- 12. 客戶端高級功能
- 13. Producer 管理 TCP
- 14. 冪等生產者和事務生產者
- 15. 消費者組
- 16. 位移主題
- 17. 消費者組重平衡(TODO)
- 18. 位移提交
- 19. CommitFailedException
- 20. 多線程開發者實例
- 21. Consumer 管理 TCP
- 22. 消費者組消費進度監控
- Kafka 內核
- 23. 副本機制
- 24. 請求處理
- 25. Rebalance 全流程
- 26. Kafka 控制器
- 27. 高水位和 Leader Epoch
- 管理與監控
- 28. Topic 管理
- 29. Kafka 動態配置
- 30. 重設消費者組位移
- 31. 工具腳本
- 32. KafkaAdminClient
- 33. 認證機制
- 34. 云下授權
- 35. 跨集群備份 MirrorMaker
- 36. 監控 Kafka
- 37. Kafka 監控框架
- 38. 調優 Kafka
- 39. 實時日志流處理平臺
- 流處理
- 40. Kafka Streams
- 41. Kafka Streams DSL
- 42. Kafka Streams 金融
- Q&A