kafka offset 如何保證三種語義傳遞
kafka 提供三種語義的傳遞:
1至少一次
2至多一次
3精確一次
首先在 producer 端保證1和2的語義是非常簡單的,至少一次只需要同步確認即可(確認方式分為只需要 leader 確認以及所有副本都確認,第二種更加具有容錯性),至多一次最簡單隻需要非同步不斷的傳送即可,效率也比較高。目前在 producer 端還不能保證精確一次,在未來有可能實現,實現方式如下:在同步確認的基礎上為每一條訊息加一個主鍵,如果發現主鍵曾經接受過,則丟棄。
在 consumer 端,大家都知道可以控制 offset,所以可以控制消費,其實 offset 只有在重啟的時候才會用到。在機器正常執行時我們用的是 position,我們實時消費的位置也是 position 而不是 offset。我們可以得到每一條訊息的 position。如果我們在處理訊息之前就將當前訊息的 position 儲存到 zk 上即 offset,這就是隻多一次消費,因為我們可能儲存成功後,訊息還沒有消費機器就掛了,當機器再開啟時此訊息就丟失了;或者我們可以先消費訊息然後儲存 position 到 zk 上即 offset,此時我們就是至少一次,因為我們可能在消費完訊息後offset 沒有儲存成功。而精確一次的做法就是讓 position的儲存和訊息的消費成為原子性操作,比如將訊息和 position 同時儲存到 hdfs 上 ,此時儲存的 position 就稱為 offset,當機器重啟後,從 hdfs重新讀入offset,這就是精確一次。
---------------------------------------------------------------------------------
以下為2017年10月27日更新:
截圖如下:
相關推薦
kafka offset 如何保證三種語義傳遞
kafka 提供三種語義的傳遞: 1至少一次 2至多一次 3精確一次 首先在 pro
一文精通kafka 消費者的三種語義
i++ ger side sass top exc hat ... exception 本文主要是以kafka 09的client為例子,詳解kafka client的使用,包括kafka消費者的三種消費語義at-most-once, at-least-once, 和 ex
C++三種引數傳遞方法(值傳遞、指標傳遞、引用傳遞)的一些知識
C++的函式引數傳遞有三種方法:值傳遞、引用傳遞、指標傳遞 。其中引用傳遞和指標傳遞幾乎一樣,只不過引用傳遞在使用時比指標更安全。 (1)關於函式返回一個物件 當你的函式返回型別是【非引用】的型別時,return時先呼叫該類的拷
Struts2的三種引數傳遞方式
一、簡單型別的引數傳遞 只需在對應的Action裡面設定提供所需傳遞的引數的屬性,及setting 方法,通過表單中與之對應的引數名取到引數 傳: 表單引數<input type="xxx" na
程序間通訊—MFC三種訊息傳遞資料
MFC訊息型別:訊息字首:wm(系統訊息),rm(註冊訊息),um(自定義訊息) //自定義訊息 void CServerDlg::OnBnClickedButtonUserMessage() { // TODO: 在此新增控制元件通知處理程式程式碼 Upda
C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞
否則 方式 指針 指向 out 數據結構 logs 形參 使用 C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞 值傳遞: void fun(int x){ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開辟的一塊臨時空間把y
struts2傳遞引數的三種方式
作用:每次訪問struts2的任何一個action方法時,若該方法裡面需要物件的值,完全可以用struts2傳遞引數的三種方式: struts2傳遞引數的三種方式 在傳統的servlet中我們採用request和response傳遞引數,但是struts2如果想用同樣的
對List去重並保證新增順序主要有三種方式
方式一,利用HashSet不能新增重複資料的特性 由於HashSet不能保證新增順序,所以只能作為判斷條件: private static void removeDuplicate(List<String> list) { HashSet<String>
vue-router如何傳遞引數(三種方法)
1.使用name傳遞 之前一直在配置路由的時候出現一個name,但不知道他具體有什麼用,在路由裡他可以用來傳遞引數。在index.js中將路由的name都寫好 接收引數: 在我們需要接收它的頁
java向多執行緒中傳遞引數的三種方法詳細介紹
在傳統的同步開發模式下,當我們呼叫一個函式時,通過這個函式的引數將資料傳入,並通過這個函式的返回值來返回最終的計算結果。但在多執行緒的非同步開發模式下,資料的傳遞和返回和同步開發模式有很大的區別。由於執行緒的執行和結束是不可預料的,因此,在傳遞和返回資料時就無法象函式一樣通過
struts2獲取前臺傳遞過來的資料的三種方式
struts2獲取前臺傳遞過來的資料可以通過屬性驅動和模型驅動兩種方式獲得。 屬性驅動 1、使用變數的方式 前臺: action: action中要獲得前臺傳遞過來的account和password兩個引數的資料。那麼就必須在action中設定和前臺na
load傳遞引數的三種方式(步驟詳細附程式碼,要是你們看不懂我就放棄程式設計)
方式一:直接獲取上個頁面的資料; 這種方式主要依賴load這個方法的原理,這個其實就是一個本地ajax請求,所以前後兩個頁面是互通的,其資料是可以直接拿到的。例項如下: a頁面的程式碼: <script> var adata = "12"; $("#d
springMVC傳遞list物件三種情況使用方法
前言 springMVC接收List物件以及List物件與其它物件一起傳引數的使用方法 概念 1.ajax請求裡Content-type2個常用型別 application/x-www-form-urlencoded:傳遞的key/value會經過URL轉碼,
storm 的三種計算語義
1. at-most-once:spout針對相同的tuple只發送一次即可,不需要實現fail和ack方法。 2. at-least-once:是用acker機制實現的,我們需要實現spout的兩個方法:fail和ack,在topology上增加一個ackerbolt,
JAVA中值傳遞和引用傳遞的三種情況
前言 我們都知道,java中資料型別分為基本資料型別和引用資料型別。 基本資料型別 整型:byte,short,int,long 浮點型:float,double 字元型:char 布林型:boolean 引用資料型別 陣列 類 介面 方法的引數
從組合語言進一步瞭解C++三種函式引數傳遞方式
首先我們要知道,計算機對資料的處理是不斷定址、讀寫資料的過程。上升到程式層面,一個個函式在組合語言中就是一段段彙編指令,這些彙編指令讓計算機通過暫存器在記憶體中訪問指定記憶體塊地址並從中讀寫資料。除全域性變數和其它一些形式定義的變數外,函式中的變數都存在棧記憶體中,程式對變數的修改、傳遞等一系列操作都是暫存
Kafka的三種客戶端線程模型和一個小驚喜
完成 -o 新版 根據 交互 不同 問題 連接 組成 Kafka 作為一個流式數據平臺,對開發者提供了三種客戶端:生產者 / 消費者、連接器、流處理。本文著重分析這三種客戶端的線程模型。看到最後的通常都有驚喜。消費者的線程模型0.8 版本以前的消費者客戶端會創建一個基於 Z
Mybatis傳遞多個引數的解決辦法(三種)
第一種方案 DAO層的函式方法 Public User selectUser(String name,String area); 對應的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"
彙編——子程式呼叫引數傳遞的三種方式(示例程式:三個數累加求和)
一、子程式定義 子程式名 PROC NEAR|FAR &nbs
三個執行緒T1,T2,T3.保證順序執行的三種方法
Thread t1 = new Thread(new Runnable() { public void run() { try { Thread.sleep(100