日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

注意:Kafka 的這六個場景會丟失消息!

來源: 責編: 時間:2024-04-11 08:59:39 171觀看
導讀大家好,我是君哥。我們使用 Kafka 的時候,怎樣能保證不丟失消息呢?今天來聊一聊這個話題。首先我們看一下 Kafka 的架構圖,場景一:異步發送Producer 異步發送是丟失消息比較多的場景,Kafka 異步發送的代碼如下:ProducerRecor

LL828資訊網——每日最新資訊28at.com

大家好,我是君哥。LL828資訊網——每日最新資訊28at.com

我們使用 Kafka 的時候,怎樣能保證不丟失消息呢?今天來聊一聊這個話題。LL828資訊網——每日最新資訊28at.com

首先我們看一下 Kafka 的架構圖,LL828資訊網——每日最新資訊28at.com

LL828資訊網——每日最新資訊28at.com

場景一:異步發送

Producer 異步發送是丟失消息比較多的場景,Kafka 異步發送的代碼如下:LL828資訊網——每日最新資訊28at.com

ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);RecordMetadata metadata = producer.send(record).get();

Producer 發送消息后,不用等待發送結果,就可以繼續執行后面的邏輯。如果發送失敗,就會丟失消息。LL828資訊網——每日最新資訊28at.com

Kafka 提供了回調方法,可以同步等待發送結果,這樣降低了發送效率,但可以對發送失敗的場景進行處理,比如重新發送。LL828資訊網——每日最新資訊28at.com

ProducerRecord<byte[],byte[]> record = new ProducerRecord<byte[],byte[]>("the-topic", key, value);producer.send(record,                (Callback) (metadata, e) -> {                    if(e != null) {                        e.printStackTrace();                    } else {                        System.out.println("The offset of the record we just sent is: " + metadata.offset());                    }                });

場景二:配置 acks=0

從文章開頭的架構圖中可以看到,Broker Leader 節點收到消息后,會同步給 Follower 節點。LL828資訊網——每日最新資訊28at.com

在 Producer 端有一個 acks 配置,說明如下 :LL828資訊網——每日最新資訊28at.com

  • acks=0:Producer 發送消息后不等待 Broker 的響應;
  • acks=1:Producer 發送消息后,Leader 節點寫入消息成功后給 Producer 發送響應;
  • acks=all/-1:Producer 發送消息后,需要 ISR 列表中所有 Broker 節點都寫入消息成功才會給 Producer 發送響應。

注意:acks=all/-1 是最高安全級別,可以配合 min.insync.replicas 參數使用,當 acks=all/-1 時,min.insync.replicas 表示 ISR 列表中最小寫入消息成功的副本數。LL828資訊網——每日最新資訊28at.com

如下圖,cks=all/-1,當 min.insync.replicas=2 時。LL828資訊網——每日最新資訊28at.com

LL828資訊網——每日最新資訊28at.com

如果 ISR 列表中有【Broker0、Broker1】,即使 Broker2 寫入消息失敗,也會給 Producer 返回成功。LL828資訊網——每日最新資訊28at.com

如果 ISR 列表中只有【Broker0】,則無論如何都不會給 Producer 返回成功。LL828資訊網——每日最新資訊28at.com

如果 ISR 列表中有【Broker0、Broker1、Broker2】,則 3 個 Broker 都寫成功才會給 Producer 返回成功。LL828資訊網——每日最新資訊28at.com

場景三:發送端重試

如果配置 retries=0,Producer 發送消息失敗后是不會進行重試的,要保證消息不丟失,可以增加 retries 的配置值,避免因為網絡抖動而造成的發送失敗。LL828資訊網——每日最新資訊28at.com

場景四:Follower 落后太多

Kafka Broker 有一個參數:unclean.leader.election.enable,這個參數值說明如下:LL828資訊網——每日最新資訊28at.com

  • true:允許 ISR 列表之外的節點參與競選 Leader;
  • false:不允許 ISR 列表之外的節點參與競選 Leader。

如果設置為 true,也是會丟失消息的,看下圖:LL828資訊網——每日最新資訊28at.com

LL828資訊網——每日最新資訊28at.com

如果 Leader 和 Follower1 都掛了,這時就要考慮是否讓 Follower2 參加競選,把 unclean.leader.election.enable 參數值設置為 true,則 Follower2 也可以競選 Leader,并且作為唯一存活節點成功競選為 Leader,但是它并沒有同步到偏移量為 3、4、5 的消息,LL828資訊網——每日最新資訊28at.com

而之前的 Leader 上線后,成為了 Follower,因為 Follower 的 LEO(Log End Offset)不能大于 Leader,所以之前偏移量為 3、4、5 的消息就被丟棄了。如下圖:LL828資訊網——每日最新資訊28at.com

LL828資訊網——每日最新資訊28at.com

所以,要保證消息不丟失,unclean.leader.election.enable 這個參數值要設置為 false。LL828資訊網——每日最新資訊28at.com

場景五:Broker 宕機

為了提升性能,Kafka 使用 Page Cache,先將消息寫入 Page Cache,采用了異步刷盤機制去把消息保存到磁盤。如果刷盤之前,Broker Leader 節點宕機了,并且沒有 Follower 節點可以切換成 Leader,則 Leader 重啟后這部分未刷盤的消息就會丟失。LL828資訊網——每日最新資訊28at.com

這種場景下多設置副本數是一個好的選擇,通常的做法是設置 replication.factor >= 3,這樣每個 Partition 就會有 3 個以上 Broker 副本來保存消息,同時宕機的概率很低。LL828資訊網——每日最新資訊28at.com

同時可以配合場景二中的參數 min.insync.replicas > 1(不建議使用默認值 1),表示消息至少要被成功寫入到 2 個 Broker 副本才算是發送成功。LL828資訊網——每日最新資訊28at.com

注意:參數配置要保證 replication.factor > min.insync.replicas,通常設置成 replication.factor = min.insync.replicas + 1。如果這 2 個參數設置成相等,則只要有一個 Broker 節點宕機,Broker 就無法給 Producer 返回發送成功,系統可用性降低。LL828資訊網——每日最新資訊28at.com

場景六:并發消費

如果消費端采用多線程并發消費,很容易因為并發更新 Offset 導致消費失敗??聪聢D:LL828資訊網——每日最新資訊28at.com

LL828資訊網——每日最新資訊28at.com

線程 1 拉取 3 條消息把 Offset 更新成 3,線程 2 把 Offset 更新成 6,線程 3 把 Offset 更新成 9。這時如果線程 2 消費失敗了,想要重新消費,但是 Offset 已經更新到了 9,不能拉取到 Offset 9 以前的消息了。LL828資訊網——每日最新資訊28at.com

所以,消費者并發消費很可能會造成消息丟失,如果對消息丟失很敏感,最好使用單線程來進行消費。LL828資訊網——每日最新資訊28at.com

如果采用多線程,可以把 enable.auto.commit 設置為 false,這樣相當于每次消費完后手動更新 Offset。不過這又會帶來重復消費問題,比如上面的例子,如果線程 2 消費失敗了,則手動把 Offset 更新成 3,線程 3 消費成功后,再次拉取,還會拉取到  6、7、8 這三條數據。因此消費端需要做好冪等處理。LL828資訊網——每日最新資訊28at.com

總結

本文介紹了 Kafka 丟失消息的六個場景,使用 Kafka 時需要根據實際情況制定解決方案,希望本文介紹的場能夠對你有所幫助。LL828資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-82738-0.html注意:Kafka 的這六個場景會丟失消息!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何在JavaScript中復制一個對象?

下一篇: C++線程安全:共享數據的完美守護者

標簽:
  • 熱門焦點
  • 8月總票房已突破10億!《封神》第一:口碑已經成了

    8月5日消息,據燈塔專業版數據,截至8月5日9時35分,8月總票房(含預售)已突破10億。其中,《封神》以大比分的優勢領先。根據官方消息,目前該片總票房已經超過14.
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內,目前主要售賣美食相關的
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創意日前,Meta創始人兼CEO 馬克&middot;扎克伯發布公開信,宣布Meta計劃裁員超11000人,占其員工總數13%。他公開承認了自己的預判失誤:&ldquo;不僅
Top 主站蜘蛛池模板: 醴陵市| 鹿泉市| 广宗县| 高要市| 三江| 青海省| 延安市| 成都市| 睢宁县| 阿瓦提县| 保德县| 合山市| 垣曲县| 三门峡市| 和林格尔县| 武定县| 浦江县| 芒康县| 嫩江县| 隆子县| 龙陵县| 甘南县| 梓潼县| 加查县| 同仁县| 比如县| 自贡市| 建阳市| 资兴市| 阳东县| 大理市| 邵东县| 石狮市| 象山县| 山阴县| 弥渡县| 阜南县| 都安| 富民县| 含山县| 日土县|