1 kafka基础数据说明:
kafuka默认使用的端口号是9092
kafka通过创建主题时指定分区,副本数,offset就相当于一个游标,表示当前分区的消息位置
kafka中没有和activemq一样的queue和topic的概念,只有主题,消费端通过加入不通的groupid实现消息的发布订阅
几个参数的说明:
生产者:ProducerConfig.BOOTSTRAP_SERVERS_CONFIG 服务器地址
ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG key序列化类
ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG value序列化类
ProducerConfig.BATCH_SIZE_CONFIG 消息达到多少之后才批量提交
ProducerConfig.LINGER_MS_CONFIG 多少时间内批量提交数据
ProducerConfig.CLIENT_ID_CONFIG 生产者id
ProducerConfig.ACKS_CONFIG 0 不需要确认 1 leader确认 -1 所有ISR副本确认
消费者:
ConsumerConfig.GROUP_ID_CONFIG 用于区分不通的消费组
ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG 自动提交ack时间间隔,用来改变offset的值
ConsumerConfig.AUTO_OFFSET_RESET_CONFIG 是否监听该消费端启动之前的数据(earliest,latest,none)
2 kafka消费端如何确定自己的消费分区
通过cordinator来分发消费分区
步骤如下:
1 发送GroupCoordinatorRequest请求,返回最小负载的brokerid,该节点就是cordinator
2 选举出consumer leader,通过对消费分区策略的选择,然后codinator把消费分区分发给各consumer
3 kafka分区副本机制及数据同步
kafka分区副本个数在创建topic时指定的,分区副本的个数不超过broker的个数
数据同步机制:
当leader副本收到消息时,会增加该副本的LEO值;HW是指副本集中所有已经同步了数据的位置
在leader副本中,有三个值HW,LEO,Remote LEO
数据同步过程:由follow副本不断的往leader发起fetch请求,如果leader没有数据更新,此时该请求被hold住(replica.fetch.wait.ms设置),如果在该时间内有数据更新,该请求断开,返回数据
当数据过来时,leader节点更新自己的LEO,写入日志,尝试更新自己的HW(min(LEO,remote LEO))返回follow的数据
此时follow,收到leader数据之后,更新自己的LEO,返回leader告诉自己的LEO,此时leader更新HW,返回的时候follow更新自己的HW的值
4 kafka分区选主机制
kafka副本中会维护一个ISR集合(和leader数据差不多或者延迟满足要求的一个集合)
follow副本每次去leader拉去数据时,均会更新该fullow副本的lastCaughUptimeMs的值
当leader挂掉之后,选主策略:会从ISR集合中选择一个做为leader
5 kafka数据丢失相关问题
由于kafka采用HW和LEO来进行数据通过的,LEO的更新和HW的更新是异步的,所以,当leader挂掉之后,ISR选出来的新leader会截断自己的LEO和HW的差值,
6 kafka数据持久化相关
kafka把数据分段存储在文件中,通过参数:log.segment.bytes=1073741824设置分段文件大小
7 消息丢失和消息重复消费的相关问题
丢失:
在生产者端:通过设置 ProducerConfig.ACKS_CONFIG=-1来尽可能的保证消息不丢失
broker端采用副本机制来保证
消费者端,设置ack机制的时间间隔
消息重复消费的根本解决途径:做好接口的幂等问题