看Cluster类的数据结构

1个Node就代表1个Broker,也就代表了1台机器:

private final List<Node> nodes;

Set维护了Kafka没有被授权访问的Topic列表:

//没有被授权访问的Topic列表
private final Set<String> unauthorizedTopics;

由此可见Kafka支持权限控制,如果客户端没有授权访问某个Topic,它就会被放在此处

对于Cluster,还通过一些数据结构,维护了客户端缓存的topic和partition的元数据:

//Topic对应的分区的详细信息
private final Map<TopicPartition, PartitionInfo> partitionsByTopicPartition;

TopicPartition代表了1个分区,里面有topic的名字、partition的分区号;
PartitionInfo是分区的详细信息:属于哪个topic,分区号,每个分区都有多个副本,Leader在哪个broker上,followers在哪些broker上,ISR列表,都在里面

每个Topic有哪些分区:

//1个Topic,有哪些分区
private final Map<String, List<PartitionInfo>> partitionsByTopic;

每个Topic有哪些可用的分区:

//每个Topic有哪些当前可用的分区:如果某个分区没有leader存活,这个分区就不可用了
private final Map<String, List<PartitionInfo>> availablePartitionsByTopic;

每个Broker上放了哪些分区:

//每个Broker上放了哪些分区
private final Map<Integer, List<PartitionInfo>> partitionsByNode;

Broker id映射到Node:

//broker.id ---> Node
private final Map<Integer, Node> nodesById;

由此可见,KafkaProducer初始化时,并没有对集群元数据全拉取,而是对集群元数据进行了初始化。
后面再拉取的时候,肯定会将这些元数据统统拉取到客户端以这些数据结构缓存起来

通过Debug可以看到,此时的Cluster状况是:

Cluster(nodes= [loaclhost:9092 (id: -1 rack: null)],partitions = [])

nodes里仅仅只有我们传进来的那个Node,id还是-1,且没有任何的分区。然后,KafkaProducer的整个update操作就完成了。再往后就是去初始化网络通信组件、发送线程、拦截器等。等KafkaProducer初始化完毕了之后,Metadata里的cluster信息:

Cluster(nodes= [DESKTOP-FV82PGK:9092 (id: 0 rack: null)],partitions = [])

只是把我们配置的Broker地址放进去,并没有真正的拉取集群元数据

Kafka Cluster元数据在客户端缓存采用的数据结构相关推荐

  1. Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)

    Redis6引入新的RESP3协议,并以此为基础加入了客户端缓存的新特性,在此特性下,大大提高了应用程序的响应速度,并降低了数据库的压力,本篇就带大家来看一下Redis6的新特性:客户端缓存. 目录 ...

  2. Redis 6 将采用全新协议 RESP3,以提供客户端缓存功能

    Redis 创始人兼核心开发者 antirez 在博客介绍了将在 Redis 6 提供的新功能 -- Client side caching(客户端缓存). antirez 表示全新的 Redis 协 ...

  3. 漫游Kafka实战篇之客户端编程实例

    原文地址:http://blog.csdn.net/honglei915/article/details/37697655 Kafka视频教程同步首发,欢迎观看! Kafka Producer API ...

  4. 【译】antirez:Redis6将支持客户端缓存

    本文翻译自Redis作者antirez的一篇博客,原文地址是:http://antirez.com/news/130 纽约Redis日已经结束了,我仍然与意大利时区同步,早上5点30起床,并立即走上了 ...

  5. Servlet防止页面被客户端缓存

    服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页,以下示范代码中的response变量引用HttpServletResponse对象: response.addHead ...

  6. 带你100% 地了解 Redis 6.0 的客户端缓存

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 近日 Redis 6.0.0 GA 版本发布,这是 Redis 历 ...

  7. Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!

    来源 | 程序员历小冰 责编 | Carol 封图 | CSDN 付费下载于视觉中国 近日 Redis 6.0.0 GA 版本发布,这是 Redis 历史上最大的一次版本更新,包括了客户端缓存 (Cl ...

  8. linux安装telnet客户端_Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!

    来源 | 程序员历小冰责编 | Carol封图 | CSDN 付费下载于视觉中国近日 Redis 6.0.0 GA 版本发布,这是 Redis 历史上最大的一次版本更新,包括了客户端缓存 (Clien ...

  9. 客户端缓存和服务器缓存处理

    问题?客户端缓存和服务器缓存处理 一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的.      数据库本身有缓存,持久层也可以缓存.(比如:hibernat ...

最新文章

  1. php中去空函数trim,PHP中trim()函数简单使用指南
  2. Google正式将网速列为网站排名因素
  3. 元计算:IT巨头的金钱收割机,核武器
  4. php pdo.dll不存在,php pdo.dll没有找到怎么办
  5. sap.ui.layout.HorizontalLayout is not a constructor
  6. mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定
  7. IP协议包中的TTL(Time-To-Live)
  8. big sur 黑苹果_苹果宣布11日再开发布会!自研芯片届时或将发布!
  9. Spring Cloud与微服务学习总结(6)——认证鉴权与API权限控制在微服务架构中的设计与实现(四)
  10. [中级01]java为什么能跨平台,而C\C++语言不能跨平台
  11. Linux中常用命令(文件)
  12. CPU Usage (C#) 测试
  13. 在linux上安装svn
  14. html5拆红包源码,最新1月拆红包源码强制分享朋友圈分享群防封裂变红包游戏
  15. Jmeter设置之ramp-up
  16. 网页怎么算切屏_十种切屏抓取方法(图形)
  17. LQ0266 巧排扑克牌【模拟】
  18. PADS打开PCB文件时出现提示:发生严重的运行时错误。
  19. python:静态方法
  20. 一文读懂C++虚函数的内存模型

热门文章

  1. 分区和分片的区别_数据库的分表、分库、分片和分区等区别
  2. mysql 编译_mysql 5.7 编译——VS2017
  3. 2019手机浏览器排名_浏览器排行榜2019年1月浏览器市场份额排名
  4. 办公用笔记本电脑哪个好_北京中仓红色办公沙发哪个品牌好
  5. iptables的conntrack表满了导致访问网站很慢
  6. [转]新版.Net开发必备十大工具
  7. 在温暖的南方惠州①月了。。
  8. IT从业人员必看的10大论坛(ZT)
  9. 《Angular4从入门到实战》学习笔记
  10. ASP.NET MVC 导入Excel文件