Spring Boot 整合kafka:生產者ack機制和消費者AckMode消費模式、手動提交ACK

目錄

    • 生產者ack機制
    • 消費者ack模式
    • 手動提交ACK

生產者ack機制

Kafka 生產者的 ACK 機制指的是生產者在發送消息后,對消息副本的確認機制。ACK 機制可以幫助生產者確保消息被成功寫入 Kafka 集群中的多個副本,并在需要時獲取確認信息。

Kafka 提供了三種 ACK 機制的配置選項,分別是:

  1. acks=0:生產者在成功將消息發送到網絡緩沖區后即視為消息已被提交,不等待任何服務器響應。這種配置下,可能會出現消息丟失的情況。

  2. acks=1:生產者在成功將消息發送到主題的分區 leader 后即視為消息已被提交。這種配置下,生產者會收到分區 leader
    的確認,但仍有可能出現消息丟失的情況,例如當 leader 出現故障,而消息尚未復制到其他副本時。

  3. acks=all 或acks=-1:生產者需要等待所有分區副本都成功寫入消息后才視為消息已被提交。這種配置下,生產者會等待所有分區副本的確認,確保消息被復制到足夠數量的副本后才返回提交確認。這是最安全的確認方式,但也會導致較長的等待時間。

在實際使用中,根據對消息可靠性和延遲的要求,可以選擇不同的 ACKs 級別。一般來說,如果對消息的可靠性要求較高,可以選擇較高的 ACKs 級別,但需要考慮相應的延遲成本。

我們可以通過spring.kafka.producer.acks來配置ack機制

spring.kafka.producer.acks=1

消費者ack模式

kafka支持的消費模式,在AbstractMessageListenerContainer.AckMode的枚舉中,下面就介紹下各個模式的區別

public enum AckMode {/*** Commit after each record is processed by the listener.*/RECORD,/*** Commit whatever has already been processed before the next poll.*/BATCH,/*** Commit pending updates after* {@link ContainerProperties#setAckTime(long) ackTime} has elapsed.*/TIME,/*** Commit pending updates after* {@link ContainerProperties#setAckCount(int) ackCount} has been* exceeded.*/COUNT,/*** Commit pending updates after* {@link ContainerProperties#setAckCount(int) ackCount} has been* exceeded or after {@link ContainerProperties#setAckTime(long)* ackTime} has elapsed.*/COUNT_TIME,/*** User takes responsibility for acks using an* {@link AcknowledgingMessageListener}.*/MANUAL,/*** User takes responsibility for acks using an* {@link AcknowledgingMessageListener}. The consumer* immediately processes the commit.*/MANUAL_IMMEDIATE,}

AckMode模式

RECORD:當每一條記錄被消費者監聽器(ListenerConsumer)處理之后提交
當使用 RECORD 確認模式時,消息監聽容器會在每個消息被單獨處理后進行確認。這意味著,如果一條消息被成功處理,它將作為單獨的記錄進行確認;如果處理失敗,也會針對該消息進行錯誤記錄。這種確認模式適用于需要精確處理每個消息的應用場景,例如確保每個消息都被正確處理。

BATCH:當每一批poll()的數據被消費者監聽器(ListenerConsumer)處理之后提交
當使用 BATCH 確認模式時,消息監聽容器會在批量處理一組消息后進行確認。這意味著,消息監聽容器會將多個消息合并為批次,并將它們作為一組進行處理。只有在整個批次都被成功處理后,該批次的所有消息才會被確認。這種確認模式適用于需要提高處理效率的場景,例如批量處理大量消息以減少網絡傳輸和系統調用的開銷。

TIME:當每一批poll()的數據被消費者監聽器(ListenerConsumer)處理之后,距離上次提交時間大于TIME時提交

COUNT:當每一批poll()的數據被消費者監聽器(ListenerConsumer)處理之后,被處理record數量大于等于COUNT時提交

COUNT_TIME:TIME或COUNT?有一個條件滿足時提交

MANUAL:這是手動確認模式,消費者需要顯式地調用 Acknowledgment.acknowledge() 方法來確認消息。只有當消費者調用 acknowledge() 方法后,才會向 Kafka 服務器發送確認消息。這種模式可以保證消息的可靠性和順序性,但需要消費者顯式地處理確認邏輯。

MANUAL_IMMEDIATE:這是立即手動確認模式,與 MANUAL 模式類似,但消費者在調用 acknowledge() 方法時,會立即向 Kafka 服務器發送確認消息。這種模式可以提高消息處理的速度,但可能會增加重復消費的風險。

MANUAL和MANUAL_IMMEDIATE的區別

MANUAL 和 MANUAL_IMMEDIATE 都是 Kafka 消費者的手動確認模式,它們的區別在于確認的時機不同。

MANUAL 模式下,消費者需要顯式地調用 Acknowledgment.acknowledge() 方法來確認消息,在調用該方法之后,消息才會被標記為已消費,并且確認消息會在下次 poll() 時發送到 Kafka 服務器。這種模式的優點是可以保證消息的可靠性和順序性,但需要消費者顯式地處理確認邏輯。

相比之下,MANUAL_IMMEDIATE 模式下,在消費者調用 Acknowledgment.acknowledge() 方法時,會立即向 Kafka 服務器發送確認消息。這種模式可以提高消息處理的速度,但可能會增加重復消費的風險,因為如果消息處理失敗,Kafka 不會再次發送該消息,而是認為該消息已經被成功消費了。

在實際使用中,應根據業務需求和性能要求來選擇合適的確認模式。如果要求消息的可靠性和順序性比較高,可以選擇 MANUAL 模式;如果要求處理速度比較高,可以選擇 MANUAL_IMMEDIATE 模式。

AckMode 可以通過配置文件或代碼進行設置。例如,在 Spring Boot 應用中,可以使用以下配置方式指定確認模式:

spring.kafka.listener.ack-mode=manual_immediate

手動提交ACK

kafka默認是自動提交ack的,很多時候,我們都需要手動提交,這就要進行以下配置

1、設置enable-auto-commit=false,禁止自動提交
2、設置ack-mode為manual_immediate

在配置文件進行如下配置

spring.kafka.consumer.enable-auto-commit=false
spring.kafka.listener.ack-mode=manual_immediate

3、監聽方法的入參加入Acknowledgment ack 參數,并在消費完成之后調用acknowledge方法,如下所示

	@KafkaListener(topics = "my-topic2",groupId = "myGroup")public void  receiveMessage2(String message, Acknowledgment ack){log.info("消費消息:"+message);//ack確認ack.acknowledge();}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212335.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ei源刊和ei會議的幾個區別

1、含義不同 公開發表論文,可以在期刊上刊登,也可以在會議上宣讀。ei源刊對應的是期刊,是指被ei檢索收錄的工程類的期刊。ei會議對應的是會議,是指被ei檢索收錄的會議。 2、檢索類型不同 期刊和會議都能被ei檢索,但…

Tr0ll

信息收集 探測主機存活信息: nmap -sn --min-rate 10000 192.168.182.0/24Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-14 15:45 CST Nmap scan report for 192.168.182.1 Host is up (0.00026s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap…

qt 雙緩沖機制

在圖形編程中,雙緩沖機制是一種常用的技術,用于減少圖形繪制時的閃爍和抖動。它的基本思想是將圖形繪制到一個后臺緩沖中,然后一次性將后臺緩沖的內容顯示到屏幕上。 在 Qt 中,雙緩沖機制可以通過QPainter的begin()和end()方法來實…

Linux環境下socket本地通信

最近項目有用到了socket本地通信,故復習一下。之前都是基于本地虛擬機的ip地址通信的,現在項目,Linux單板上面有2個進程需要通信,故用到了本地socket通信,主要其實就是用了sockfd,文件描述符,也叫句柄。 服…

java接入gpt開發

前情提要 本次文章使用編譯器為IDEA2020 使用GPT模型為百度旗下的千帆大模型 如果是個人用或者不流傳出去,可以無腦入,因為會免費送20塊錢(夠用上萬次) 代金卷查看 正式教程: 百度智能云控制臺 (baidu.com) 按照步…

JMS(Java Message Service)使用指南

介紹 JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關于面向消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。它是一…

基于單片機智能病床呼叫系統設計

**單片機設計介紹,基于單片機智能病床呼叫系統設計 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于單片機的智能病床呼叫系統是一種利用單片機技術設計的醫療設備,它能夠幫助病人在住院期間快速、方便…

國內大廠機器人賽道產品

大疆 大疆無人機自然不必說,除此之外大疆搞機甲大師,教育機器人。 字節 當前字節在機器人領域只是初步探索階段,目前尚未發布相關產品(截止至23.12)。 管理層想法: 跟已有業務做結合,服務好…

Java設計模式分類

java的設計模式大體上分為三大類: 創建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。 結構型模式(7種):適配器模式&am…

傳感器(一) :IMU / 陀螺儀模塊

IMU / 陀螺儀模塊 一、概述二、注意參數2.1 陀螺儀芯片標準(MPU6050)2.2 參數說明 三、IMU模式使用注意事項3.1 IMU模塊安裝注意事項3.2 為什么IMU要安裝在機器中心位置 四、常見陀螺儀芯片品牌 一、概述 IMU全稱為慣性測量單元,可以通過測量物體在三維空…

Linux實用操作

一、各類小技巧(快捷鍵) 1.1 ctrl c 強制停止 Linux某些程序的運行,如果想要強制停止它,可以使用快捷鍵ctrl c 命令輸入錯誤,也可以通過快捷鍵ctrl c,退出當前輸入,重新輸入 1.2 ctrl d…

Leetcode刷題筆記——摩爾投票法

摩爾投票法的核心思想為對拼消耗。 摩你媽,學不會!!!! 229. 多數元素 II - 力扣(LeetCode)

ReLU(Rectified Linear Unit)和Sigmoid激活函數

ReLU(Rectified Linear Unit)和Sigmoid都是神經網絡中常用的激活函數。 特點: ReLU是一種簡單而有效的激活函數。它對于正數部分直接返回輸入,對于負數部分返回零。這種非線性轉換有助于網絡學習更復雜的表示。ReLU在許多深度學習…

自治調優!人大金倉解放DBA雙手

數據庫系統的性能是確保整個應用系統高效運轉的關鍵因素,因此數據庫性能調優工作至關重要。KingbaseES通過將人工調優過程內化為數據庫內核,成功實現了自治調優。這種創新的調優方案為DBA提供了更高效且準確的性能調優途徑,同時也顯著降低了數…

23秋 操作系統真題回憶

總結: 量大 綜合性強 結合實驗很緊密具體的題目 不是很記得了 只記了大概希望有人可以一起參與把這個題的答案做出來,有可以的 可以私信我謝謝 需要你們的想法因為可能涉及學校內部的試題,禁止轉載 2013題目 真題 2023題目 進程 代碼執…

構建VREP和MATLAB聯合仿真實驗平臺,控制機械臂末端按照固定軌跡移動

構建VREP和MATLAB聯合仿真實驗平臺,控制機械臂末端按照固定軌跡移動。主要工作如下: (1)solidworks構建機械臂模型; (2)將solidworks中構建的模型導入VREP中建立機械臂的多體動力學模型&#xf…

【Unity動畫】什么是任意狀態(Any state)

(Any state)可以從某個狀態A直接切換到另一個狀態 B\C\D\E\F 比如A到C的過渡,直接設置從Any state 到C的過渡線觸發參數即可。而不需要讓A到C直接在連接,同樣,B到C之間也無需直接鏈接。 這樣設計是在每一個動畫之間都…

HP-UNIX 系統安全基線 安全加固操作

目錄 賬號管理、認證授權 賬號 ELK-HP-UX-01-01-01 ELK -HP-UX-01-01-02 ELK -HP-UX-01-01-03 ??????? ELK-HP-UX-01-01-04 ???????ELK-HP-UX-01-01-05 ???????口令 ELK-HP-UX-01-02-01 ??????? ELK-HP-UX-01-02-02 ??????? ELK-HP…

Spring 核心特性之表達式(SpEL)

Spring 核心特性之表達式(SpEL)_spring spel-CSDN博客 -- 寫的還行 關于SpEL的幾個概念: 表達式(“干什么”):SpEL的核心,所以表達式語言都是圍繞表達式進行的。解析器(“誰來干”)&#xff1…

【論文筆記】Gemini: A Family of Highly Capable Multimodal Models——細看Gemini

Gemini 【一句話總結,對標GPT4,模型還是transformer的docoder部分,提出三個不同版本的Gemini模型,Ultra的最牛逼,Nano的可以用在手機上。】 谷歌提出了一個新系列多模態模型——Gemini家族模型,包括Ultra…