Kafka知识点总结

一、概述

¥1. 推拉模式
  • pull(拉)模式:consumer采用从broker中主动拉取数据,不足之处是如果没有数据,消费者可能会陷入循环中,一直返回空数据。
  • push(推)模式:由broker主动向消费者主动推送消息,缺点是由broker决定消息发送速率,很难适应所有消费者的消费速率
  • Kafka采用 pull(拉)模式!

pull模式的优点:

  • 控制消费速率:消费者可以根据自己的处理能力决定拉取数据的频率和数量,从而避免被过多的数据淹没。
  • 简化系统复杂性:推模式需要复杂的流量控制机制来防止生产者发送数据过快导致消费者无法处理。而拉模式将这种控制交给消费者,简化了系统设计。
  • 灵活性:消费者可以灵活地选择何时以及从哪个分区拉取数据,这使得 Kafka 能够支持多种消费模式,如实时处理、批量处理等

二、生产者

1. 线程模型

生产者在发送消息时主要存在两个线程:主线程Sender线程

  • 主线程即调用KafkaProducer.send方法的线程。当send方法被调用时,消息并没有真正被发送,而是暂存到RecordAccumulator。通过暂存机制可以提升吞吐量,可以将多条消息通过一个ProduceRequest批量发送出去,并提高数据压缩效率
  • Sender线程在满足一定条件后,会去RecordAccumulator中取消息并发送到Kafka Server端。
2. 消息生产流程
  1. 当接受外部传过来的数据的时候,会先创建一个main线程,在main线程中创建producer对象,然后调用send方法,将数据进行发送
  2. 消息会经过拦截器,对发送的数据进行处理、加工,再经过序列化器,对传输的数据进行序列化
  3. 根据分区器的分区策略决定传输的数据发送至哪个分区
  4. 通过消息暂存器将数据写入暂存区
  • 消息暂存器维护了一个内存池(默认大小32M),并且为每一个分区维护了一个双端队列,队列中是一个个批次
  • 写入数据时,会从内存池中取出内存,创建批次(默认大小16k)
  • 当缓存空间耗尽,其他发送调用将被阻塞当缓存空间耗尽,其他发送调用将被阻塞
  1. 当一个批次的数据大小积累到 batch.size 或者到达了延迟时间 linger.ms,唤醒sender线程
  2. Sender线程从分区中拉取数据。拉取数据的方式是以brokerId为key,所有分区的请求为value放到队列中
  3. Sender线程通过selector发送数据,数据发送成功之后,会有应答机制,返回acks,应答级别有3种。如果反馈回来的请求是成功,则会删除发送数据成功的请求以及清理分区中请求中拉取的数据(释放批次的内存,放回到内存池中)。如果失败会进行重试,重试的次数(默认是Int的最大值,可以进行修改,一般是3-5次)
  4. 如果发送数据的第一个请求到达集群中的某一个broker没有应答,允许继续发送请求,默认每个broker节点最多缓存5个请求
3. 分区选择策略
  • 指明 partition 的情况下,直接将指明的值直接作为 partiton 值
  • 既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法。
  • 没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition数进行取余得到 partition 值;在Producer往Kafka插入数据时,控制同一Key分发到同一Partition<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值