天天看點

Kafka -- 幂等生産者 + 事務生産者

  消息傳遞可靠性保障:Kafka對Producer和Consumer要處理的消息所提供的承諾常見的承諾最多一次(at most once):消息可能會丢失,但絕不會被重複發送至少一次 (at least once):消息不會丢失,但有可能被重複發送精确一次(exactly once):消息不會丢失,也不會被重複發送Kafka預設提供的傳遞可靠性保障:至少一次隻有Broker成功送出 消息且Producer接到Broker的應答才會認為該消息成功發送如果Broker成功送出消息,但Broker的應答沒有成功送回Producer端,Producer隻能選擇重試最多一次Kafka也可以提供最多一次 傳遞可靠性保證,隻需要讓Producer禁止重試 即可,但大部分場景下并不希望出現消息丢失精确一次消息不會丢失,也不會被重複處理,即使Producer端重複發送了相同的消息,Broker端也能自動去重兩種機制:幂等性 、事務

  幂等性

  幂等原是數學中的概念:某些操作或者函數能夠被執行多次,但每次得到的結果都是不變 的幂等操作:乘1,取整函數;非幂等操作:加1計算機領域在指令式 程式設計語言(如C)中,如果一個子程式是幂等的,那它必然不能修改系統狀态在函數式 程式設計語言(如Scala、Haskell)中,很多純函數 天然就是幂等的,不執行任何的Side Effect幂等性的好處:可以安全地重試 任何幂等性操作

  幂等性Producer

  在Kafka中,Producer預設不是幂等的 ,在0.11.0.0 版本引入了幂等性Producer預設情況下 ,Producer向Broker發送資料時,可能會出現同一條消息被發送多次,導緻消息重複更新為幂等性Producer

  props.put("enable.idempotence", true)

  props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true)

  基本原理空間換時間 ,在Broker端多儲存一些字段當Producer發送了具有相同字段值的消息後,Broker能夠自動發現這些重複消息,然後默默丢棄作用範圍幂等性Producer隻能保證單分區 上的幂等性即隻能保證某個主題上的一個分區上不出現重複消息,無法實作

二手遊戲賣号平台

多個分區的幂等性幂等性Producer隻能實作單會話 上的幂等性,不能實作跨會話的幂等性會話:Producer程序的一次運作 ,如果重新開機Producer程序,将丢失幂等性保證如果要實作多分區 或者多會話 的消息無重複,可以采用事務Producer

  事務

  資料庫事務提供了ACID 的安全性保障:Atomicity 、Consistency 、Isolation 、DurabilityKafka在0.11 版本開始提供了對事務的支援,目前主要在Read Committed 的隔離級别上做事情保證多條消息原子性地寫入目标分區 ,同時也保證Consumer隻能看到事務成功送出的消息

  事務Producer

  事務Producer能夠保證一批消息原子性地寫入多個分區 ,這批消息要麼全部寫入成功 ,要麼全部寫入失敗事務Producer允許程序重新開機 ,Producer重新開機後,Kafka依然保證它們發送的消息的精确一次處理更新為事務Producer

  props.put("transactional.id", "my-transactional-id")

  record1和record2會被當作一個事務統一送出到Kafka,要麼全部送出成功,要麼全部寫入失敗即使寫入失敗,Kafka也會把它們寫入到底層日志 中,即Consumer還是會看到這些消息是以在Consumer端,讀取事務Producer發送的消息,需要設定isolation.level 參數read_uncommitted預設值,Consumer能夠讀取到Kafka寫入的任何消息 ,不論事務Producer送出事務還是終止事務read_committedConsumer隻會讀取到事務Producer成功送出事務寫入的消息 ,也能讀取到非事務Producer寫入的所有消息

  producer.initTransactions();

  try {

  producer.beginTransaction();

  producer.send(new ProducerRecord<>(TOPIC, KEY, VALUE + 1));

  producer.send(new ProducerRecord<>(TOPIC, KEY, VALUE + 2));

  //

  producermitTransaction();

  } catch (KafkaException e) {

  producer.abortTransaction();

  }

  小結

  幂等性Producer和事務Producer都是Kafka社群為了實作精确一次 處理語義所提供的工具,隻是作用範圍 不同而已幂等性Producer隻能保證單分區、單會話 上的消息幂等性;而事務Producer能夠保證跨分區、跨會話 的幂等性事務Producer與幂等性Producer相比,性能更差