kafka-生产者-(day-4)

day-3

BufferPool
  • 产生原因:ByteBuffer的创建和释放都是比较耗费资源的,为了实现内存的高效利用,产生了他。他会对特定大小的ByteBuffer进行管理
BufferPool的字段
  • free:是一个ArrayDeque队列,缓存指定大小的ByteBuffer对象
  • ReentrantLock:因为这个BufferPool在多线程中使用,保证其安全
  • waiters:这个队列中包含小空间导致阻塞的线程对应的Condition对象
  • totalMemory:整个pool的大小
  • availableMemory:可用空间大小-totalMemeoy-free中每个ByteBuffer大小
BufferPool的函数
  • allocate():从pool中申请ByteBuffer,要是因为空间不足申请不下来的时候,就阻塞调用线程
  • deallocate:从pool中释放大小为poolableSize他是pool队列里面所有ByteBuffer的大小,然后唤醒一个因空间不足而阻塞的线程
RecordAccumulator
RecordAccumulator字段
  • batches:类型CopyOnWriteMap,TopicPartition-RecordBatch集合,他是一个队列,每个队员里面都可以找到RecordBatch集合要发送到的目的地TopicPartition
  • BatchSize:指定每个RecordBatch底层的ByteBuffer大小
  • Compression:压缩类型
  • imcomplete:未发送完成的RecordBatch集合
  • free:BufferPool对象
  • drainIndex:发送RecordBatch集合一次发不完,他记录的就是下次开始发送的位置
kafkaProducer.send()调用的时候,最终内部调用的是RecordAcculator.append()
RecordAcculator.append()详细步骤
  • 在batch中找TopicPartition对应的RecordBatch集合,要是没有,就创建,并将他添加到batches
  • 对Deque加锁(Deque就是RecordBatch集合)
  • 调用tryAppend(),想Deque最后一个RecordBatch追加Record(消息)
  • 对Deque解锁
  • 要是成功:返回RecordAppendResult内部封装了ProduceRequestRequest唤醒sender;
  • 追加失败:从BufferPool中申请新的ByteBuffer,回到给Deque加锁继续直到追加成功,要是还是失败,就用ByteBuffer创建RecordBatch, 将Record追加到新建的RecordBatch,将RecordBatch追加打破Deque最后将新建的RecordBatch追加到incomplete集合,然后解锁,返回并唤醒sender;
    ####### 当然,这里唤醒sender也不是说唤醒就能唤醒的,他是调用了kafkaProducer.dosend()函数判断此次向RecordAccumlator中追加消息是否满足消息所在的最后一个RecordBatch满了,或者队列中不指一个RecordBatch
Ready()在客户端向服务器发送消息前,会调用它来获取符合发送的消息集合的节点,有如下条件
  • Deque中有多个RecordBatch或者第一个RecordBatch是否满了【只取第一个进行判断就行】
  • 是否超时了
  • 是否BufferPool的空间耗尽了
  • 是否有线程在等待flush操作完成
  • sender线程准备关闭
他的过程如下:首先他会遍历batches集合的每分区,找到分区leader所在的node,要是满足上面的条件就加到readyNodes集合中;过程完后最后函数返回ReadyCheckResult对象,他里面记录了满足的node集合,还有直到步道leader的分区,还有下次调用ready()进行检查的时间间隔
kafkaProducer.send()调用的时候,最终内部调用的是RecordAcculator.append(),接着调用RecordAccumulator.drain()
RecordAccumulator.drain()会将之前的map(TopicPartition,list)构造成map(NodeID,List)返回
  • 为什么要这样做呢?---原因:在I/O层,生产者是面向Node发送消息的,但是在sender呢,他是关心消息发送到哪个分区的,因此要进行转换
  • 今天也是美好的一天* o*
相关推荐
naierfengdian37 分钟前
分布式风电助力乡村能源转型的技术路径
分布式·能源
DLYSB_1 小时前
Kafka 消费倾斜死锁与 Partition 掉队:我用 Rust 写了个“数据管道物理哨兵”,比 Grafana 报警快了 18 秒
rust·kafka·grafana·报警灯
hhzz2 小时前
《深度学习框架PyTorch入门与实践》系列:09-分布式与并行训练之DataParallel、DDP与Horovod
pytorch·分布式·深度学习
creator_Li2 小时前
Kafka消费者offset提交
kafka
TDengine (老段)3 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
城管不管18 小时前
重生——第九次面试2026.8.13某车一面
分布式·ai·面试·职场和发展·rabbitmq
apgk118 小时前
基于Canal实现mysql数据同步到消息队列(RabbitMQ/Kafka)详细操作教程
docker·kafka·rabbitmq
ly768919 小时前
分布式一致性算法详解:从 2PC、3PC 到 Paxos、Raft、ZAB
分布式·算法
珠***格20 小时前
通信链路全打通:西格电力四可装置的 4G/5G + 加密认证技术详解
大数据·数据库·分布式·5g·架构·能源
ACP广源盛1392462567321 小时前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件