在 KafkaProducer 中大部分的參數(shù)都有合理的默認(rèn)值,一般不需要修改它們。不過了解這些參數(shù)可以讓我們更合理地使用生產(chǎn)者客戶端,其中還有一些重要的參數(shù)涉及程序的可用性和性能,如果能夠熟練掌握它們,也可以讓我們?cè)诰帉懴嚓P(guān)的程序時(shí)能夠更好地進(jìn)行性能調(diào)優(yōu)與故障排查。下面挑選一些重要的參數(shù)進(jìn)行講解。
1. acks
這個(gè)參數(shù)用來指定分區(qū)中必須要有多少個(gè)副本收到這條消息,之后生產(chǎn)者才會(huì)認(rèn)為這條消息是成功寫入的。acks 是生產(chǎn)者客戶端中一個(gè)非常重要的參數(shù),它涉及消息的可靠性和吞吐量之間的權(quán)衡。acks 參數(shù)有3種類型的值(都是字符串類型)。
acks = 1。默認(rèn)值即為1。生產(chǎn)者發(fā)送消息之后,只要分區(qū)的 leader 副本成功寫入消息,那么它就會(huì)收到來自服務(wù)端的成功響應(yīng)。如果消息無法寫入 leader 副本,比如在 leader 副本崩潰、重新選舉新的 leader 副本的過程中,那么生產(chǎn)者就會(huì)收到一個(gè)錯(cuò)誤的響應(yīng),為了避免消息丟失,生產(chǎn)者可以選擇重發(fā)消息。如果消息寫入 leader 副本并返回成功響應(yīng)給生產(chǎn)者,且在被其他 follower 副本拉取之前 leader 副本崩潰,那么此時(shí)消息還是會(huì)丟失,因?yàn)樾逻x舉的 leader 副本中并沒有這條對(duì)應(yīng)的消息。acks 設(shè)置為1,是消息可靠性和吞吐量之間的折中方案。
acks = 0。生產(chǎn)者發(fā)送消息之后不需要等待任何服務(wù)端的響應(yīng)。如果在消息從發(fā)送到寫入 Kafka 的過程中出現(xiàn)某些異常,導(dǎo)致 Kafka 并沒有收到這條消息,那么生產(chǎn)者也無從得知,消息也就丟失了。在其他配置環(huán)境相同的情況下,acks 設(shè)置為0可以達(dá)到最大的吞吐量。
acks = -1 或 acks = all。生產(chǎn)者在消息發(fā)送之后,需要等待 ISR 中的所有副本都成功寫入消息之后才能夠收到來自服務(wù)端的成功響應(yīng)。在其他配置環(huán)境相同的情況下,acks 設(shè)置為 -1(all) 可以達(dá)到最強(qiáng)的可靠性。但這并不意味著消息就一定可靠,因?yàn)镮SR中可能只有 leader 副本,這樣就退化成了 acks=1 的情況。
注意 acks 參數(shù)配置的值是一個(gè)字符串類型,而不是整數(shù)類型。舉個(gè)例子,將 acks 參數(shù)設(shè)置為0,需要采用下面這兩種形式:
而不能配置成下面這種形式:
這樣會(huì)報(bào)出如下的異常:
這個(gè)參數(shù)用來限制生產(chǎn)者客戶端能發(fā)送的消息的最大值,默認(rèn)值為1048576B,即1MB。一般情況下,這個(gè)默認(rèn)值就可以滿足大多數(shù)的應(yīng)用場(chǎng)景了。
Kafka 可以保證同一個(gè)分區(qū)中的消息是有序的。如果生產(chǎn)者按照一定的順序發(fā)送消息,那么這些消息也會(huì)順序地寫入分區(qū),進(jìn)而消費(fèi)者也可以按照同樣的順序消費(fèi)它們。
4. compression.type
這個(gè)參數(shù)用來指定消息的壓縮方式,默認(rèn)值為“none”,即默認(rèn)情況下,消息不會(huì)被壓縮。該參數(shù)還可以配置為“gzip”“snAppy”和“lz4”。對(duì)消息進(jìn)行壓縮可以極大地減少網(wǎng)絡(luò)傳輸量、降低網(wǎng)絡(luò)I/O,從而提高整體的性能。消息壓縮是一種使用時(shí)間換空間的優(yōu)化方式,如果對(duì)時(shí)延有一定的要求,則不推薦對(duì)消息進(jìn)行壓縮。
這個(gè)參數(shù)用來指定在多久之后關(guān)閉閑置的連接,默認(rèn)值是540000(ms),即9分鐘。
6. linger.ms
這個(gè)參數(shù)用來指定生產(chǎn)者發(fā)送 ProducerBatch 之前等待更多消息(ProducerRecord)加入 ProducerBatch 的時(shí)間,默認(rèn)值為0。生產(chǎn)者客戶端會(huì)在 ProducerBatch 被填滿或等待時(shí)間超過 linger.ms 值時(shí)發(fā)送出去。增大這個(gè)參數(shù)的值會(huì)增加消息的延遲,但是同時(shí)能提升一定的吞吐量。這個(gè) linger.ms 參數(shù)與 TCP 協(xié)議中的 Nagle 算法有異曲同工之妙。
這個(gè)參數(shù)用來設(shè)置 Socket 接收消息緩沖區(qū)(SO_RECBUF)的大小,默認(rèn)值為32768(B),即32KB。如果設(shè)置為-1,則使用操作系統(tǒng)的默認(rèn)值。如果 Producer 與 Kafka 處于不同的機(jī)房,則可以適地調(diào)大這個(gè)參數(shù)值。
- END -