一 生產者發送的同步與異步
生產者發送消息依靠send方法,主要要同步和異步兩種:
異步發送
producer.send(record,callback)
callback就是對發送消息後的回調。該方法輸入參數是metaData和exception:當消息異步發送成功則exception爲空;反之若發送失敗則metadata爲空exception非空。
同步發送
producer.send(record).get()
通過調用feature.get無限等待。若沒有失敗則返回對應的metaData包括消息發送的topic part offset。
二 消費者提交消費offset的同步與異步
consumer通過向所屬的協調者發送請求來實習位移提交。一般有手動和自動提交兩種方式,手動提交通過enable.auto.commit=false設置。提交會存在三種消費語義:
at most once 先提交再消費 最多消費一次 存在數據丟失可能
at least once 先消費再提交 最少消費一次 存在重複消費可能(kafka默認)
exaclty once 通過事務等機制保證一定消費且只一次
手動提交主要包括同步commitSync和異步commitAsync兩種方法實現。這裏異步提交不是指consumer單獨起一個線程進行位移提交,consumer會在用戶主線程poll中不斷輪旋這次異步提的結果。
提交時可以指定一個map參數,key是分區,value是下一條待消費消息位移