一、基本思路

异步发送的基本思路就是:send的时候,KafkaProducer把消息放到本地的消息队列RecordAccumulator,然后一个后台线程Sender不断循环,把消息发给Kafka集群。

要实现这个,还得有一个前提条件:就是KafkaProducer/Sender都需要获取集群的配置信息Metadata。所谓Metadata,也就是在上一篇所讲的,Topic/Partion与broker的映射关系:每一个Topic的每一个Partion,得知道其对应的broker列表是什么,其中leader是谁,follower是谁。

二、2个数据流

所以在上图中,有2个数据流:

Metadata流(A1,A2,A3):Sender从集群获取信息,然后更新Metadata; KafkaProducer先读取Metadata,然后把消息放入队列。

消息流(B1, B2, B3)

从上图可以看出,Metadata是多个producer线程读,一个sender线程更新,因此它必须是线程安全的

三、Metadata的线程安全性

从下面代码也可以看出,它的所有public方法都是synchronized:

 1 public final class Metadata {
 2   。。。
 3     public synchronized Cluster fetch() {
 4         return this.cluster;
 5     }
 6     public synchronized long timeToNextUpdate(long nowMs) {
 7        。。。
 8     }
 9     public synchronized int requestUpdate() {
10       。。。
11     }
12     。。。
13 }

四、Metadata的数据结构

 1 public final class Metadata {
 2 ...
 3     private final long refreshBackoffMs;  //更新失败的情况下,下1次更新的补偿时间(这个变量在代码中意义不是太大)
 4     private final long metadataExpireMs; //关键值:每隔多久,更新一次。缺省是600*1000,也就是10分种
 5     private int version;         //每更新成功1次,version递增1。这个变量主要用于在while循环,wait的时候,作为循环判断条件
 6     private long lastRefreshMs;  //上一次更新时间(也包含更新失败的情况)
 7     private long lastSuccessfulRefreshMs; //上一次成功更新的时间(如果每次都成功的话,则2者相等。否则,lastSuccessulRefreshMs < lastRefreshMs)
 8     private Cluster cluster;   //集群配置信息
 9     private boolean needUpdate;  //是否强制刷新
10 、
11   ...
12 }

转载于:https://www.cnblogs.com/zcjcsl/p/8746561.html

kafka源码分析(二)Metadata的数据结构与读取、更新策略相关推荐

  1. Kafka 源码分析之网络层(二)

    上一篇介绍了概述和网络层模型实现<Kafka 源码分析之网络层(一)>,本编主要介绍在Processor中使用的nio selector的又一封装,负责具体数据的接收和发送. PS:丰富的 ...

  2. kafka源码分析-consumer的分区策略

    kafka源码分析-consumer的分区策略 1.AbstractPartitionAssignor 2.RangeAssignor 3.RoundRobinAssignor 4.StickyAss ...

  3. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  4. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  5. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  6. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  7. Kafka源码分析10:副本状态机ReplicaStateMachine详解 (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 + 大厂必备 +涨薪 ...

  8. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  9. Nouveau源码分析(二):Nouveau结构体的基本框架

    Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...

  10. ENS最新合约源码分析二

    ENS(以太坊域名服务)智能合约源码分析二 0.简介 ​ 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...

最新文章

  1. 正确配置nginx和php
  2. 机械硬盘低级格式化软件_低级比高级安全?磁盘格式化要保护秘密
  3. 前端学习(2583):生态圈练习解答下
  4. 关于游戏网络设计的问题
  5. 机器学习-吴恩达-笔记-12-推荐系统
  6. Shell 操作 —— for 循环与函数
  7. SWMM建模与案例应用
  8. 在北京这种城市,周末假期怎么整才算浪......
  9. 用计算机探索规律反思,规律的背后——用计算器探索规律教学反思
  10. LeetCode.M11.盛最多水的容器
  11. [转]老师几乎气绝身亡,搞笑....
  12. python中做为词云轮廓的图片,Python如何生成词云图片
  13. 利好消息再释放 重卡自动驾驶的智慧物流“掘金”计划
  14. 快速读论文----CKA----Similarity of Neural Network Representations Revisited
  15. 【读书笔记】《云计算关键领域安全指南V4.0》(一)
  16. 克隆linux虚拟机密码是多少,Linux虚拟机的克隆及问题处理
  17. HTML---bootstrap在线引用地址
  18. 【chrome插件开发二】chrome常用语法汇总
  19. 安徽省计算机考试算不算中考,安徽中考满分多少分2021
  20. 《惢客创业日记》2018.12.13(周四) 创业从0到1的10个阶段(四)

热门文章

  1. 2013年3月百度之星B题
  2. ASP.NET2.0-防止同一用户同时登陆
  3. 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
  4. 编写程序实验两个数的加减结果的判断_实验一 两个多字节数的加减运算 -
  5. springboot 打包_springboot项目打包上传至阿里云服务器
  6. python生成有条件的列表_python复杂列表生成式教程
  7. C语言基础知识(自己做个笔记,云储存一下)
  8. php支付宝同步和异步有什么区别,支付宝异步验签和同步验签
  9. 开源游戏机java模拟器_最棒的 7 款开源终端模拟器
  10. php获取表字段,使用 php 获取表的字段信息