flink 卡夫卡_卡夫卡–一次语义学
flink 卡夫卡
在分布式環境中,故障是很常見的情況,可以隨時發生。 在Kafka環境中,代理可能崩潰,網絡故障,處理故障,發布消息時失敗或無法使用消息等。這些不同的場景引入了不同類型的數據丟失和重復。
失敗場景
A(確認失敗):生產者成功發布了消息,重試> 1,但由于失敗而未收到確認。 在這種情況下,生產者將重試相同的消息,可能會引入重復消息。
B(生產者進程在批處理消息中失敗):生產者發送了一批失敗的消息,但發布的成功很少。 在這種情況下,一旦生產者重新啟動,它將再次批量重新發布所有消息,這將在Kafka中引入重復消息。
C(觸發并忘記失敗)生產者發布的消息,重試= 0(觸發并忘記)。 如果失敗,發布的消息將不知道并發送下一條消息,這將導致消息丟失。
D(批處理消息中的消費者失敗)消費者從Kafka接收到一批消息,并手動提交其偏移量(enable.auto.commit = false)。 如果消費者在提交給Kafka之前失敗,則下次消費者將再次使用相同的記錄,這些記錄將在消費者端復制副本。
精確一次語義
在這種情況下,即使生產者嘗試重新發送消息,它也導致消息將被消費者發布和消費一次。
為了在Kafka中實現Exactly-Once語義,它使用以下3個屬性
啟用冪等(enable.idempotence = true)
冪等傳遞使生產者可以在單個生產者的生命周期內,將消息僅一次寫入Kafka到主題的特定分區,而不會造成數據丟失和每個分區的訂單。
“請注意,啟用冪等性要求MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION小于或等于5,RETRIES_CONFIG大于0且ACKS_CONFIG為'all'。 如果用戶未明確設置這些值,則將選擇合適的值。 如果設置了不兼容的值,將拋出ConfigException”
為了實現冪等性,Kafka在生成消息時使用唯一的ID(稱為產品ID或PID和序列號)。 生產者在發布的每個消息上保持遞增的序列號,這些消息具有唯一的PID。 代理始終將當前序列號與前一個序列號進行比較,如果新序列號不比上一個序列號大+1,則它會拒絕,這會避免重復;如果消息中丟失了更大的序列號,則會拒絕同時顯示
在失敗的情況下,代理將序列號與先前的序列號進行比較,如果序列不增加,+ 1將拒絕該消息。
交易(isolation.level)
事務使我們能夠自動更新多個主題分區中的數據。 事務中包含的所有記錄將被成功保存,或者沒有保存成功,它允許您在同一事務中提交消費者補償以及已處理的數據,從而允許端到端的一次精確語義。
生產者不等待將消息寫入到kafka那里,生產者使用beginTransaction,commitTransaction和abortTransaction(在失敗的情況下)消費者使用隔離級別。read_committed或read_uncommitted
- read_committed:使用者將始終僅讀取已提交的數據。
- read_uncommitted:按偏移順序讀取所有消息,而無需等待事務提交
如果具有Isolation.level = read_committed的使用者到達尚未完成的事務的控制消息,則它將直到該生產者提交或中止該事務或發生事務超時之前,不會再從該分區傳遞任何消息。 事務超時由生產者使用配置transaction.timeout.ms(默認為1分鐘)確定。
生產者和消費者中的確切時間
在正常情況下,生產者和消費者是分開的。 生產者必須具有冪等性并同時管理事務,以便消費者可以使用isolation.level讀取read_committed來使整個過程成為原子操作。 這樣可以確保生產者將始終與源系統同步。 即使生產者崩潰或事務中止,它也始終是一致的,并且一次將消息或一批消息發布為一個單元。
同一用戶一次將收到消息或一批消息。
在Exactly-Once中,語義生產者與消費者一起將作為原子操作出現,它將作為一個單元進行操作。 要么發布一次就被消耗掉,要么中止。
在Kafka Stream中恰好一次
Kafka Stream消耗來自主題A的消息,處理并將消息發布到主題B,并在發布后使??用commit(commit主要在后臺運行)將所有狀態存儲數據刷新到磁盤。
Kafka Stream中的“一次寫入”模式是一次“讀取-處理-寫入”模式,可確保將這些操作視為原子操作。 由于Kafka Stream可以滿足生產者,消費者和交易的需求,因此Kafka Stream帶有特殊的參數processing.guarantee,它可以完全地_once或at_least_once使得不單獨處理所有參數變得容易。
Kafka Streams原子地更新使用者偏移量,本地狀態存儲,狀態存儲changelog主題和生產,以一起輸出所有主題。 如果這些步驟中的任何一個失敗,則所有更改都將回滾。
processing.guarantee:確切地自動提供以下參數,您無需明確設置
翻譯自: https://www.javacodegeeks.com/2020/05/kafka-exactly-once-semantics.html
flink 卡夫卡
總結
以上是生活随笔為你收集整理的flink 卡夫卡_卡夫卡–一次语义学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 医疗生产备案号查询(医疗生产备案)
- 下一篇: linux 系统 有哪些(linux的系