1. 程式人生 > >Kafka 資料傳輸問題-----丟失,重複

Kafka 資料傳輸問題-----丟失,重複

有這麼幾種可能的delivery guarantee:

  • At most once 訊息可能會丟,但絕不會重複傳輸
  • At least one 訊息絕不會丟,但可能會重複傳輸
  • Exactly once 每條訊息肯定會被傳輸一次且僅傳輸一次,很多時候這是使用者所想要的。

    當Producer向broker傳送訊息時,一旦這條訊息被commit,因數replication的存在,它就不會丟。但是如果Producer傳送資料給broker後,遇到網路問題而造成通訊中斷,那Producer就無法判斷該條訊息是否已經commit。雖然Kafka無法確定網路故障期間發生了什麼,但是Producer可以生成一種類似於主鍵的東西,發生故障時冪等性的重試多次,這樣就做到了Exactly once。截止到目前(Kafka 0.8.2版本,2015-03-04),這一Feature還並未實現,有希望在Kafka未來的版本中實現。(所以目前預設情況下一條訊息從Producer到broker是確保了At least once,可通過設定Producer非同步傳送實現At most once)。

    接下來討論的是訊息從broker到Consumer的delivery guarantee語義。(僅針對Kafka consumer high level API)。Consumer在從broker讀取訊息後,可以選擇commit,該操作會在Zookeeper中儲存該Consumer在該Partition中讀取的訊息的offset。該Consumer下一次再讀該Partition時會從下一條開始讀取。如未commit,下一次讀取的開始位置會跟上一次commit之後的開始位置相同。當然可以將Consumer設定為autocommit,即Consumer一旦讀到資料立即自動commit。如果只討論這一讀取訊息的過程,那Kafka是確保了Exactly once。但實際使用中應用程式並非在Consumer讀取完資料就結束了,而是要進行進一步處理,而資料處理與commit的順序在很大程度上決定了訊息從broker和consumer的delivery guarantee semantic。

  • 讀完訊息先commit再處理訊息。這種模式下,如果Consumer在commit後還沒來得及處理訊息就crash了,下次重新開始工作後就無法讀到剛剛已提交而未處理的訊息,這就對應於At most once

  • 讀完訊息先處理再commit。這種模式下,如果在處理完訊息之後commit之前Consumer crash了,下次重新開始工作時還會處理剛剛未commit的訊息,實際上該訊息已經被處理過了。這就對應於At least once。在很多使用場景下,訊息都有一個主鍵,所以訊息的處理往往具有冪等性,即多次處理這一條訊息跟只處理一次是等效的,那就可以認為是Exactly once。(筆者認為這種說法比較牽強,畢竟它不是Kafka本身提供的機制,主鍵本身也並不能完全保證操作的冪等性。而且實際上我們說delivery guarantee 語義是討論被處理多少次,而非處理結果怎樣,因為處理方式多種多樣,我們不應該把處理過程的特性——如是否冪等性,當成Kafka本身的Feature)

  • 如果一定要做到Exactly once,就需要協調offset和實際操作的輸出。精典的做法是引入兩階段提交。如果能讓offset和操作輸入存在同一個地方,會更簡潔和通用。這種方式可能更好,因為許多輸出系統可能不支援兩階段提交。比如,Consumer拿到資料後可能把資料放到HDFS,如果把最新的offset和資料本身一起寫到HDFS,那就可以保證資料的輸出和offset的更新要麼都完成,要麼都不完成,間接實現Exactly once。(目前就high level API而言,offset是存於Zookeeper中的,無法存於HDFS,而low level API的offset是由自己去維護的,可以將之存於HDFS中)

總之,Kafka預設保證At least once,並且允許通過設定Producer非同步提交來實現At most once。而Exactly once要求與外部儲存系統協作,幸運的是Kafka提供的offset可以非常直接非常容易得使用這種方式。

相關推薦

Kafka 資料傳輸問題-----丟失,重複

有這麼幾種可能的delivery guarantee:At most once 訊息可能會丟,但絕不會重複傳輸 At least one 訊息絕不會丟,但可能會重複傳輸 Exactly once 每條訊息肯定會被傳輸一次且僅傳輸一次,很多時候這是使用者所想要的。當Produc

spark streaming讀取kafka資料丟失(二)

方式二: 方法二就是每次streaming 消費了kafka的資料後,將消費的kafka offsets更新到zookeeper。當你的程式掛掉或者升級的時候,就可以接著上次的讀取,實現資料的令丟失和 at most once。而且使用checkpoint的方

php分頁 點選下一頁傳輸資料 防止丟失

方法分為兩種 第一種為點選下一頁a標籤直接附帶搜尋name值 第二種把搜尋值存session 點選下一頁是直接獲取session if(!isset($_GET['cont'])){ $cont = session('cont');}else { $cont = trim($_GET['co

Spark Streaming消費Kafka Direct方式資料丟失實現

一、概述 上次寫這篇文章文章的時候,Spark還是1.x,kafka還是0.8x版本,轉眼間spark到了2.x,kafka也到了2.x,儲存offset的方式也發生了改變,筆者根據上篇文章和網上文章,將offset儲存到Redis,既保證了併發也保證了資料不丟失,經過測試,有效。 二、

flume資料傳輸kafka

flume 簡單介紹 當你看到這篇文章時,應該對flume有一個大概瞭解但是為照顧剛入門的同學所以還是會說下flume,剛開始使用flume時不需要理解太多裡面的東西,只需要理解下面的圖就可以使用flume把日誌資料傳入kafka中,下圖中的hdfs只是

Kafka基礎-可靠性資料傳輸

可靠的資料傳輸是系統的一個必要屬性,就像效能一樣,必須從一開始就設計到系統中。Apache Kafka在可靠的資料傳輸方面非常靈活,支援非常多的配置引數。 1. 可靠性保證 當我們討論可靠性時,通常會提到保證這個術語。最著名的可靠性保證ACID,它是關係型資料庫普遍支援的

kafka通過零拷貝實現高效的資料傳輸

許多Web應用程式都提供了大量的靜態內容,這相當於從磁碟讀取資料並將完全相同的資料寫回到響應socket。這個活動可能似乎只需要相對較少的CPU活動,但是效率有些低下:核心從磁碟讀取資料,並將其從核

BASE64編碼的字符進行URL傳輸丟失特殊字符的問題

sca clas cape 特殊 空格 span ken data base64 因為BASE64的編碼裏含有“+”號等特殊字符,在url傳輸的時候會把+號編程空格,解決這個問題的方法:   請求時把BASE64編碼進行url的編碼再進行傳輸   接收時把BASE64編碼進

Java NIO教程(五) 通道之間的資料傳輸

                                 Java NIO教程(五) 通道之間的資料傳輸

Vue 頁面狀態保持頁面間資料傳輸的一種方法

如果大家覺得有用,更多的模組請點選檢視 vue router給我們提供了兩種頁面間傳遞引數的方式: 動態路由匹配 程式設計式的導航 // 命名的路由 router.push({ name: 'user', params: { userId: 123 }}) // 帶查詢引數,變成 /re

用Vue來進行移動Hybrid開發和客戶端間資料傳輸的一種方法

如果大家覺得有用,更多的模組請點選檢視 即上一篇Vue 頁面狀態保持頁面間資料傳輸的一種方法,今天我們說說我們團隊是怎麼和客戶端進行互動。 為什麼到了今天,還要提hybrid開發,就我所在團隊從中獲得的好處有: 團隊較小、業務較重、迭代頻繁、需要緊急響應的團隊和專案比較適合用 使用單頁應用技術

C語言小結--float short等非char型資料傳輸問題

1.問題描述 最近開發中需要使用can傳輸float和short型資料,我們知道一般的嵌入式平臺的通訊埠如CAN、串列埠、網路等都是以位元組(byte)為單位傳輸的,那麼怎麼傳輸float、short等型別的資料呢?尤其是帶符號位的資料。 2.解決思路 使用共用體(union

【Java TCP/IP Socket程式設計】----深入剖析----TCP資料傳輸中的死鎖和效能

目錄   死鎖問題 資料傳輸效能 案例 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 死鎖問題 在TCP資料傳輸底層實現中(詳細參見https://blog.csdn.net/lili13897741554/article/

【Java TCP/IP Socket程式設計】----深入剖析----TCP資料傳輸底層實現

目錄   套接字底層資料結構 TCP資料傳輸底層實現 案例 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 套接字底層資料結構     要熟悉掌握網路程式設計,就需要理解套接字的具體實現所關聯的資料結構和底

Java位元組序(不同語言中的網路資料傳輸時位元組序列轉換)

BIG-ENDIAN(大位元組序、高位元組序) LITTLE-ENDIAN(小位元組序、低位元組序) 主機位元組序 網路位元組順序 JAVA位元組序 1.BIG-ENDIAN、LITTLE-ENDIAN跟多位元組型別的資料有關的比如

異數OS TCP協議棧測試(一)--資料傳輸

異數OS TCP協議棧測試(一)--資料傳輸篇 本文來自異數OS社群   github:  https://github.com/yds086/HereticOS 異數OS社群QQ群:  652455784  異數OS-織夢師(訊息中介軟體)群: 4

MySQL開源資料傳輸中介軟體架構設計實踐

本文根據洪斌10月27日在「3306π」技術 Meetup - 武漢站現場演講內容整理而成。 主要內容: 本次分享將介紹目前資料遷移、資料同步、資料消費,多IDC架構中資料複製技術所面臨問題及現有的產品和方案,並分享新開源的能在異構資料儲存之間提供高效能和強大複製功能的DTLE相關技術

幾張圖為你分析HTML、JS與PHP之間的資料傳輸

在電商網站搭建過程中,前端經常會向後端請求資料,有時候通過HTML、JS和PHP檔案的處理來實現資料的連通。通常情況下,使用者在HTML中做關鍵字操作,JS對提交的表單進行資料處理,向後端發起ajax請求對應PHP的api介面,PHP在接收到資料後對連線伺服器,伺服器再通過PHP中的SQL語句對資料

TCP協議三次握手和四次分手以及資料傳輸過程

 1、三次握手      TCP是面向連線的,在面向連線的環境中,開始傳輸資料之前,在兩個終端之間必須先建立一個連線。建立連線同步的過錯稱為三次握手,具體過程如下: (1)當主機A想同主機B建立連線,主機A會發送SYN給主機B,初始化序列號seq

Kafka資料清理

https://www.cnblogs.com/moonandstar08/p/6204581.html  由於專案原因,最近經常碰到Kafka訊息佇列擁堵的情況。碰到這種情況為了不影響線上系統的正常使用,需要大家手動的清理Kafka Log。但是清理Kafka Log又不能單純的去刪