kafka冪等性
冪等性:
一次和多次請求某一個資源般堆,資源本身應(yīng)該具有同樣的結(jié)果(網(wǎng)絡(luò)超時等問題除外)婿脸;即:其任意多次執(zhí)行對資源本身所產(chǎn)生的影響均與一次執(zhí)行的影響相同。
kafka冪等性:
- 0.11.0.0版本開始支持冪等性
- 冪等是針對生產(chǎn)者角度的特性;可以保證生產(chǎn)者發(fā)送的信息不丟失蛔垢;不重復(fù)。
- kafka冪等的關(guān)鍵就是服務(wù)端可以區(qū)分請求是否重復(fù)迫悠,過濾掉重復(fù)請求鹏漆。
服務(wù)端區(qū)分請求的兩點(diǎn)要求:
- 唯一標(biāo)識 - - 要想?yún)^(qū)分請求是否重復(fù),請求中就得有唯一標(biāo)識创泄;例如:支付請求中的訂單號就是唯一標(biāo)識艺玲。
- 記錄下已處理過的請求標(biāo)識 - - 光有唯一標(biāo)識還不夠,還得記錄下那些請求時已經(jīng)處理過的鞠抑,這樣當(dāng)接收新請求時饭聚,用新請求中的標(biāo)識和處理記錄進(jìn)行比較;如果記錄中間有相同的標(biāo)識搁拙,說明重復(fù)記錄秒梳,拒絕掉。
1.創(chuàng)建kafka生產(chǎn)者配置冪等
public class KafkaProducerIdempotence {
public static void main(String[] args) {
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
//設(shè)置kafka的 Acks以及retries
props.put(ProducerConfig.ACKS_CONFIG,"all");
//不包含第一次發(fā)送箕速,如果嘗試3次都失敗酪碘,則系統(tǒng)放棄發(fā)送
props.put(ProducerConfig.RETRIES_CONFIG,3);
//將檢測超時的時間為1ms -- 為測試retries現(xiàn)象
props.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG,1);
//開啟kafka 冪等性 注意:在使用冪等時 必須開啟acks=all和retires
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true);
//保證信息有序
props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION,1);
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("topic04", "idempotence" , "test idempotence");
//發(fā)送消息
producer.send(record);
producer.flush();
producer.close();
}
}
思考:
- kafka的冪等性只保證了一條記錄在分區(qū)發(fā)送的原子性;如果要保證多條記錄(多分區(qū))之間的完整性盐茎,需要如何處理呢兴垦? ---- 開啟kafka事務(wù)操作