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的刷盘间隔

posted @ 2023-08-09 16:45  剑阁丶神灯  阅读(15)  评论(0编辑  收藏  举报