1. 生产者
生产者端关注最多的问题就是消息精准的被推送到集群。如何能做到这一点,就引出了ISR、生产者ACK、事务等。
1.1 ISR(in-sync replica set)同步副本
由于kafka是一个分布式系统,每一个分区都会有相应的副本来保证系统的高可用,即在leader副本挂掉后,follow副本能够重新选举成为leader对外提供服务。要实现这一个功能就必须要保证副本数据与leader数据保持一致。通常的做法是让全部的副本同步完成数据后再返回请求给生产者。 这样的实现能保证数据一致性,但是会导致效率低下,可用性低(因为只要一个节点发生故障就会导致无法返回ACK),所以kafka设置了一个ISR的概念。
每一个分区会设置至多N个ISR副本,要被选举为ISR副本需要数据同步的时间不超过replica.lag.time.max.ms指定的参数,而kafka在进行数据同步的时候只会考虑ISR中的副本同步情况
即:
1.当ACK设置为0的时候,不考虑落盘情况(这种情况是否有ISR效果一样)
2.当ACK设置为1的时候,只要考虑leader落盘成功则返回,不考虑副本同步情况(其实与是否有ISR也没有区别)
3.当ACK设置为-1(all)时候,需要等到ISR中的所有副本落盘成功后才返回ack(理论上有副本的情况下,kafka应该保证ISR中至少有包含leader在内2个及以上的副本)