天天看點

Kafka消息可靠性配置

Kafka發送消息是異步的,是以如果沒有設定異步回調異常處理,很容易導緻消息丢失而且系統不知道的情況的。 是以我們在業務有需要的情況下,配置好消息的可靠性參數。

主要配置以下參數

max.block.ms =

acks = all or -1

retries = Integer.MAX_VALUE

max.in.flight.requests.per.connection = 1

unclean.leader.election.enable = false

default.replication.factor =3

min.insync.replicas = 2

replication.factor > min.insysnc.replicas

enable.auto.commit= false.

代碼回調機制的send方法 KafkaProducer.send(record, callback)

我們一一介紹這些參數的含義和作用。

對于producer端,

acks = all or -1

等待所有的follower都響應了發送消息才能認為發送消息成功,這是producer端最強程度的持久化保證。

max.in.flight.requests.per.connection = 1

是為了防止topic同分區下的消息亂序。

max.block.ms = 60000 (預設值)

如果發送端緩沖區已經滿了,Producer會阻塞多長時間。 如果Producer發送的比broker端接收快,會抛出異常。.

The configuration controls how long KafkaProducer.send() and KafkaProducer.partitionsFor() will block.These methods can be blocked either because the buffer is full or metadata unavailable.Blocking in the user-supplied serializers or partitioner will not be counted against this timeout.

對于broker端

unclean.leader.election.enable = false

關閉unclean leader選舉,即不允許非ISR中的副本被選舉為leader,進而避免broker端因為日志水位截斷造成的消息丢失。

default.replication.factor =3

副本是以一般設定為3,

min.insysnc.replicas

用于控制某條消息至少被被寫入到ISR中的多少個副本才算成功,設定成大于1是為了提升producer端發送語義的持久性,隻有在producer端的acks被設定為all或者-1時,這個參數才意義。

確定replication.factor > min.insysnc.replicas

若兩者相等,那麼隻要有一個副本挂掉了,分區就無法正常工作,雖然有很高的持久性,但是可用性降低了。 推薦配置replication.factor = min.insysnc.replicas + 1

參考:http://kafka.apache.org/documentation.html#producerconfigs