當前位置:編程學習大全網 - 編程語言 - Kafka消息傳遞語義的詳細解釋

Kafka消息傳遞語義的詳細解釋

消息傳遞語義是消息系統中常見的問題,主要包括三種語義:

讓我們分別從發送方和使用方的角度來解釋這三種消息傳遞語義。

從生產者的角度來看,最多壹次是指生產者發送消息後,不會確認消息是否傳遞成功。這樣,從制作者的角度來看,消息只發送壹次,存在發送者丟失的可能。

從生產者的角度來說,至少壹次是指生產者發送消息後,會確認消息是否發送成功。如果生產者沒有收到來自代理的ack確認消息,它將繼續嘗試發送消息。這意味著該消息可能會發送多次,並且有可能會重復發送。

從生產者的角度來看,恰好壹次意味著生產者消息是冪等的。這意味著無論消息重傳多少次,最後都只有壹條數據沒有重復。

Kafka默認的生產者消息傳遞語義是至少壹次,這意味著我們不需要任何配置就可以實現至少壹次消息語義。

通過配置生產者的以下配置項,我們最多可以實現壹次語義:

準確壹次是Kafka從0.11版本開始提供的高級功能。通過配置Producer的以下配置項,我們可以實現恰好壹次語義:

Kafka本身支持至少壹次消息傳遞語義,所以實現消息發送冪等性的關鍵是在代理端實現消息去重。為了實現信息發送的冪等性,卡夫卡引入了兩個新概念:

代理端已經在緩存中保存了這個序列號。對於收到的每條消息,如果它在代理緩存中的序列號大於1,它將被接受,否則將被丟棄。這樣就可以實現消息的重復提交。然而,只有壹個生產商可以保證相同的

從消費者的角度來看,最多壹次是指消費者最多消費壹次消息,因此可能會出現消息消費失敗,但仍提交偏移量的情況。考慮以下情況:使用者首先讀取消息,然後提交偏移量,最後處理消息。在處理消息的時候,消費者就下去了,這個時候,offset已經提交了,讀消息的時候會讀下壹條消息,最多是壹次消費。

從消費者的角度來看,至少壹次意味著消費者可能會多次消費壹條消息。考慮以下情況:使用者首先讀取消息,然後處理消息,最後提交偏移量。成功處理消息後,消費者下去,此時offset還沒有提交,下壹次仍然會讀取消息,那麽再次執行處理消息的邏輯,至少是壹次消費。

從消費者的角度來看,恰好壹次意味著消息消費處理邏輯和offset的提交是原子性的,即消息消費成功後offset發生變化,如果消息消費失敗也可以回滾offset。

通過手動提交偏移量,可以實現消費者至少壹次的語義。

通過自動提交offset,將定期提交的時間間隔設置得很小,可以實現消費者最多提交壹次的語義。

恰好壹次的常見使用場景是:當我們訂閱壹個主題,然後將數據寫入另壹個主題時,我們希望這兩個操作是原子的,也就是說,如果寫消息失敗,那麽我們希望讀消息的偏移量可以回滾。

這可以通過卡夫卡的交易特征來實現。Kafka在0.11版本之後開始提供交易功能。我們可以把消費者讀取的數據和生產者寫入的數據放到同壹個事務中,在事務成功結束之前,這個事務中包含的所有消息都被標記為未提交。只有在事務成功執行後,所有消息才會被標記為已提交。

我們知道,補償信息作為消息存儲在代理的__consumer_offsets主題中。因此,在事務開始並且使用者讀取消息之後,所有的偏移消息都是未提交的。生產者編寫的所有消息也是未提交的。

使用者可以通過配置isolation.level來確定未提交的消息對使用者是否可見。Isolation.level有兩個可選值:read_committed和read_uncommitted。默認值為read_uncommitted。

當我們將isolation.level配置為read_committed時,事務的所有未提交數據對消費者都是不可見的,從而實現了Kafka的事務語義。

  • 上一篇:加工軸型部件需要註意哪些問題?
  • 下一篇:手工課教學教案10篇
  • copyright 2024編程學習大全網