推荐kafka学习视频 :
千锋教育最新kafka入门到精通教程|kafka快速入门,阿里P7架构师带你深度解析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Xy4y1G7zA
方式一 : 从最后一条消息得偏移量 + 1开始消费
方式二 : 从头开始消费
通过 "--from-beginning"命令进行控制
日志中的数据过一段时间就会被清除
单播和多播的区别 :
如果一个kafka topic中的消息只被一个消费者组消费, 称之为单播, 如果被多个消费者组消费, 则称之为多播
如果一个消费者组testGroup订阅了一个topic test, 在testGroup消费者组中有多两个消费者, consumer1, consumer2, test中的消息只能被其中一个消费者消费;
可以配置多个消费者组同时订阅一个topic, 这样topic中的消息就可以被多个消费者组消费,
question: kafka默认维护了50个 consumer_offsets主题的分区, 这个topic的作用是什么, 为什么创建50个分区?
看上图 : testGroup组中先有一个消费者1, 消费者1消费了50条数据, 消费者2开始接着消费,
为什么消费者2会从第五十个位置接着消费呢? 就是因为消费者1每次消费完一个消息,就向consumer_offsets topic发送一条消息, 消息就是记录offset
副本的概念 : 副本是分区的副本, (有多少个broker, 有多少个副本)
leader
kafka的读写 *** 作都发生在leader上, leader负责把数据同步给follower, 当leader挂了, 经过主从选举, 从多个follower中选举产生一个新的leader
follower
接收leader的同步的数据
isr
leader节点和可以接收leader信息的follower节点的集合, 如果isr中的节点性能较差, 会被踢出isr集合, isr集合的作用可能是在leader节点挂掉之后用来选择新的leader的
kafka发送消息
通过计算key的哈希值再对分区数取余来决定发送到哪个分区
kafka同步发送消息
kafka异步发送消息
ack
ack = 0 : 只要生产者发送了消息就会返回ack, 不管kafka-cluster是否收到消息ack = 1 : 多副本之间的leader已经收到消息, 并把消息写入到了log中就会返回ackack = -1 : 还需要配置一个min.insync.replicas参数, 如果此参数为1, 则效果和ack = 1是相同的, 此参数配置的是至少需要几个副本接收到消息才返回ack;
生产者并不会有一条消息就给kafka发送一条消息, 因为如果有10w条数据就需要与kafka进行10次连接, 生产者有一个本地线程, 会去生产者的缓冲区去拉数据, 如果一次性拉满16k则会直接发送数据, 如果没有拉满, 10ms之后也会将拉到的数据发送给kafka broker
kafka消费者
消费组offset自动提交与手动提交
指定分区消费
消息回溯消费
指定offset消费
从指定时间点消费
controller
每个borker启动时, 回向zk创建一个临时序号节点, 获得的序号最小的哪个broker将会作为集群中的controller(即最先自动的borker作为controller)
controller的作用 :
当集群中有一个副本的leader挂掉, 需要在集群中选举出一个新的leader, 选举的规则使用isr集合中最左边获得当集群中有broker新增或减少, controller会同步信息给其他broker当集群中有分区新增或减少, controller会同步信息给其他broker
rebalance
消费者没有指明分区消费, 当消费组里消费者和分区的关系发生变化, 那么就会触发rebalance机制, 这个机制会重新调整消费者消费哪个分区
三种策略 :
range : 通过公式来计算某个消费者消费哪个分区轮询 : 大家轮着消费sticky : 在触发了rebalance之后, 在消费者消费的原分区不变的基础上进行调整
range, 轮询的情况下, 如果有5个分区, 其中一个分区的消费者挂掉, 则会对这个分区全部进行重新划分, 比较浪费性能
HW和LEO机制
LEO : 是某个副本最后消息的位置(log-end-offset)
HW : 已完成同步的位置, 消息在写入broker时, 且每个broker完成这条消息的同步后, hw才会发生变化, 在这之前的消费者时消费不到这条消息的, 在完成同步之后, hw更新之后, 消费者才能消费到这条数据, 这样的目的是防止消息的丢失
kafka中如何防止消息丢失 ?
发送者 :
使用同步发送方式将ack设置成-1将min.insync.replicas设置成分区的总个数
消费者 :
将自动提交改为手动提交
kafka如何解决消息重复消费问题 ?
出现场景 : 当发送者给kafka发送消息时, kafka写入数据成功, 返回ack时,发生网络抖动, 造成发送者没有接收到ack, 此时发送者开始重试机制, 造成消息多次生成
问题解决 :
发送者 :
关闭消息重试发送 (暴力, 不推荐)
消费者端 :
解决幂等性问题 (根据具体的业务逻辑自己设置)
如果保证kafka顺序消费 ?
发送方 :
使用同步发送 (保证消息是顺序发送的)
消费方 :
消息发送到一个分区中只能有一个消费者组中的一个消费者接收消息
kafka如何解决消息积压 ?
发生消息积压时 :
多线程处理
kafka优化配置 :
指定更多的分区, 让消息能并发处理配置分区数与消费者数量一致发送者发送消息时, 消息平均发送到各个分区, 不要让某个分区有超级多的数据, 其他的分区则很少
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)