Kafka学习
1. kafka适用场景
2 Mq作用
3 kafka消费组的作用
kafka可以有多个消费组, 一条消息, 同一个消费组里面假如有多个消费者, 这条消息只能被其中一个消费者消费。 但是其他组也能消费这条消息。
同一个消费组里面多个消费者消费消息kafka可以减轻压力
kafka可以有多个消息生产者, 生产的消息交给topic, topic内部会自动均衡的分配到一个或多个partition中,一个partition只能绑定同一个消费组中的一个消费者,原因: 因为要记录offset偏移量,如果同时绑定多个偏移量无法记录。
同一个group组的多个消费者是为了负载均衡,分配接收消息,减轻压力
存在多个group组是为了消息备份,接收多份消息(每个group接收一份消息)
一个partition只能绑定一个消费者
4. kafka架构组成图
5 kafka发送和接收消息命令示例
消息生产者
消息接收者(接收实时消息, 旧的消息不会接收到)
接收所有消息(包括旧的消息)
接收从指定偏移量位置开始的消息(接收从第4个位置之后的消息)
指定group组
查看消费者组的消息信息(例如: 总共26条消息,消费了22条,剩余4条未消费)
在topic中创建4个分区,每个分区设置2个备份因子
查看topic的详细信息
6 kafka集群
可以使用zookeeper搭建集群(早期版本kafka内部
自带zookeeper),也可以使用kraft搭建集群(使用kraft则解除了对zookeeper的依赖)
7 消息发送端
有三种发送模式:
a. 单向发送消息(只管发送,不管是否发送成功),
b. 同步发送消息(发送消息时,会阻塞,直到break端返回响应。 安全, 海量数据性能低)
c. 异步发送消息(只管发送消息,break端响应后会触发回调方法)
8 如何防止消费端重复消费数据
消费端如果消费完消息后,再去拉取新的消息,如果break还没来得及更新offset则会出现重复拉取到旧消息。由于offset由break维护不透明
,此时可以将最新的offset放在redis或者其它地方进行存储一份, group + topic + partition的值能组成一个唯一字符串作为redis的key, offset值作为redis的value。
如果break端过来的record里面的offset值小于redis存放的offset值则表示当前这条消息之前已经消费过,则直接丢弃,然后直接执行commit方法提交offset.
否则则处理这批消息,并且将这批消息新的offset设置到redis中
9 kafka流程
10 springboot集成kafka
kafka的配置可以参考ProducerConfig和CunsumerConfig这2个配置类
11.
12. kafka消息丢失的原因及解决方案
ISR中的leader partition和follow partition的数据是一致的,如果不一致的follow partition会被转移到OSR
ack设置为all表示leader partition已经消息同步给了follow partition完后再返回
并且还需设置如果leader partition挂了,重新选举需要从ISR中选举。
配置ISR中的副本数大于1
需要设置手动提交offset
broker中的pageCache会缓存发送端的消息,然后定期去持久化到硬盘,如果linux机器挂了,还没来得及持久化到硬盘会丢失消息,因此需要减少broker的刷盘间隔