更新時(shí)間:2023-10-18 來(lái)源:黑馬程序員 瀏覽量:
Kafka的ACK機(jī)制是指生產(chǎn)者發(fā)送消息到Kafka代理并接收確認(rèn)的方式。ACK機(jī)制有三種不同級(jí)別,用于控制生產(chǎn)者在消息發(fā)送后接收確認(rèn)時(shí)的可靠性。這些級(jí)別分別是:
這是最不可靠的模式。生產(chǎn)者在發(fā)送消息后不會(huì)等待來(lái)自服務(wù)器的確認(rèn)。這意味著消息可能會(huì)在發(fā)送之后丟失,而生產(chǎn)者將無(wú)法知道它是否成功到達(dá)服務(wù)器。
這是默認(rèn)模式,也是一種折衷方式。在這種模式下,生產(chǎn)者會(huì)在消息發(fā)送后等待來(lái)自分區(qū)領(lǐng)導(dǎo)者(leader)的確認(rèn),但不會(huì)等待所有副本(replicas)的確認(rèn)。這意味著只要消息被寫(xiě)入分區(qū)領(lǐng)導(dǎo)者,生產(chǎn)者就會(huì)收到確認(rèn)。如果分區(qū)領(lǐng)導(dǎo)者成功寫(xiě)入消息,但在同步到所有副本之前宕機(jī),消息可能會(huì)丟失。
這是最可靠的模式。在這種模式下,生產(chǎn)者會(huì)在消息發(fā)送后等待所有副本的確認(rèn)。只有在所有副本都成功寫(xiě)入消息后,生產(chǎn)者才會(huì)收到確認(rèn)。這確保了消息的可靠性,但會(huì)導(dǎo)致更長(zhǎng)的延遲。
下面是使用Java語(yǔ)言演示如何配置不同的ACK機(jī)制:
import org.apache.kafka.clients.producer.*; import java.util.Properties; public class KafkaProducerDemo { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // 配置 ACKs // acks=0:不等待確認(rèn) // acks=1:等待分區(qū)領(lǐng)導(dǎo)者確認(rèn) // acks=all:等待所有副本確認(rèn) props.put("acks", "all"); KafkaProducer<String, String> producer = new KafkaProducer<>(props); ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value"); producer.send(record, new Callback() { @Override public void onCompletion(RecordMetadata metadata, Exception exception) { if (exception == null) { System.out.println("消息發(fā)送成功,偏移量:" + metadata.offset()); } else { System.err.println("消息發(fā)送失敗: " + exception.getMessage()); } } }); producer.close(); } }
在上面的示例中,我們配置了ACKs為 "all",這意味著生產(chǎn)者將等待所有副本的確認(rèn),以確保消息的可靠性。根據(jù)實(shí)際需求,我們可以將acks的值設(shè)置為"0"或"1"以實(shí)現(xiàn)不同級(jí)別的可靠性。