深入理解Kafka(八) 消息可靠性

下面我们来介绍下Kafka怎么保证消息的可靠性,在消息中间件里,有一个非常重要的问题就是怎么保证消息不丢失,而这就是消息的可靠性问题。在介绍Kafka是怎么保证消息不丢失的问题前,先来了解几个Kafka的参数。
(1) acks
这个参数用于控制producer生产消息的持久性。当一条消息被提交,只要有任何一个副本保存了该消息,并且副本存活,那么就可以认为该消息是不可丢失的。当producer发送一条消息给kafka集群时,这条消息会被发送到指定topic分区的leader所在的broker上,producer等待该broker返回消息的写入结果以确定消息被成功提交。broker什么时候会发送写入结果给producer呢?那就是acks参数的作用了。具体来说,acks有3个值:0,1和all。
acks设置成0表示producer不管broker端返回的结果,虽然这种方式可用性最低,但是却是响应时间最低的。在不在乎是否丢消息的情况下,可以将acks设置成0。
acks设置成all表示当发送消息时,broker不仅会将消息写入本地日志,同时还会等待isr中的所有其他副本都成功写入后,才发送响应结果给produer,那么当acks设置为all时,只要isr中有一个副本是存活的,那么这条消息就不会丢失,因此可以达到最高的消息可用性,但是这种情况下延时也是最高的。
acks设置成1时,表示当producer发送消息后,broker仅将消息写入本地日志,就发送响应结果给producer,而不会等待isr中其他副本写入消息,那么这个时候,只要leader的broker一直存活,kafa就能保证该消息不会丢失。这种方案既能达到一定的消息可靠性,也能降低一些延时。
(2)retries
broker在处理写入请求时可能因为各种问题导致写入失败,那么就需要重试保证消息的可靠性,该参数就是produer端的重试次数。如果想要保证消息的不丢失,就要把retries参数设置为Integer.MAX_VALUE。
(3)max.in.flight.requests.per.connection
当我们设置retries参数为一个比较大的值的时候,就可能出现消息的乱序问题,为了防止这个问题的出现,我们需要设置该参数为1。这个参数就是限制了producer在单个broker连接上能够发送的未响应请求的数量。因此,如果设置成1,则producer在broker发送响应之前将无法再给该broker发送请求。
上面这些参数是producer端的参数,下面我们来看一下consumer端的参数。
(1)session.timeout.ms
该参数是consumer group内成员检测的时间,也就是说,如果consumer group中某个成员突然无法提供服务了,消费者的协调者要多长时间才能检测到该成员无法提供服务。当协调者检测到成员无法提供服务后,将开启rebalance来进行重新分配消息。
(2)max.poll.interval.ms
该参数是consumer处理逻辑的最大时间。当用户的业务处理需要2分钟的时间,那么用户只需要把max.poll.interval.ms设置为大于2分钟即可。
(3)enable.auto.commit
该参数指定conmsuer是否自动提交offset。如果是true,则consmer会自动提交offset,否则用户需要手动提交offset。如果要保证消息的可靠性,那么需要将参数参数设置为false,由用户来手动提交offset,保证consumer能够正确的消费该消息。
到这里,我们就介绍了kafka是怎么保证不丢失消息的。kafka的消息可靠性就介绍到这里了。

你可能感兴趣的:(深入理解Kafka(八) 消息可靠性)