当前位置: 首页 > 编程日记 > 正文

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

 

一、基本思路

 异步发送的基本思路就是: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

相关文章:

python实现简单的http服务器_Python实现简单HTTP服务器(二)

#coding:utf-8importsocketimportreimportsysfrom multiprocessing importProcessclassHTTPServer(object):def __init__(self, application):"""application&#xff1a;指的是框架的app"""self.server_socketsocket.socket(socket.AF_INET, so…

机器学习中的模型评价、模型选择及算法选择

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾&#xff…

Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)

https://bigdata.163.com/product/article/5 Apache 流框架 Flink&#xff0c;Spark Streaming&#xff0c;Storm对比分析&#xff08;一&#xff09;转载于:https://www.cnblogs.com/WCFGROUP/p/9075745.html

梯度下降算法_神经网络梯度下降算法

神经网络梯度下降算法2018, SEPT 13梯度下降&#xff08;Gradient Descent) 是神经网络比较重要的部分&#xff0c;因为我们通常利用梯度来利用Cost function&#xff08;成本函数&#xff09; 进行backpropagation&#xff08;反向传播&#xff09; 不断地iteration&#xff0…

微擎删除分类无法删除解决-select in效率低解决办法

今天朋友微擎后台微网站里的分类要删除&#xff0c;可是怎么删除也不能删除&#xff0c;同样的系统另一套却可以迅速删除。 后来查询到是查询语句的问题&#xff0c;朋友的平台用户量太大&#xff0c;数据太大&#xff0c;用了以下语句&#xff0c;造成效率太低&#xff1a; SE…

EOS技术及生态系统介绍

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 嘉宾介绍 哈胜&#xff0c;现任梦起文化传播有限公司技术总监&#xff0c;西北地区区块链技术发起第一人&#xff1b;一直在致力于将区块链技术推广…

svn 提交信息模板

版本&#xff1a;1.0作者&#xff1a;张三描述&#xff1a;修改了xxx转载于:https://www.cnblogs.com/ithfm/p/9075748.html

pta函数统计素数并求和_黎曼的zeta函数

9月24日阿提亚爵士&#xff08;Sir Atiyah&#xff09;直播“证明”黎曼猜想&#xff08;Riemann hypothesis&#xff09;在普通人中引发了一轮数学热潮&#xff0c;网络上一时间涌现了很多数学八卦文章。许多人在论及该命题重要性时都指出&#xff0c;ζ函数的非平凡零点与素数…

EasyRTMP手机直播推送rtmp流flash无法正常播放问题

本文转自EasyDarwin团队Kim的博客&#xff1a;http://blog.csdn.net/jinlong0603/article/details/52960750 问题简介 EasyRTMP是EasyDarwin团队开发的一套简单易用的RTMP推送SDK。本文想讲述下开发过程中遇到的一个问题。问题的现象是使用EasyRTMP推送音视频流到自己搭建的ngi…

对称加密和非对称加密

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 对称加密 对称密钥是双方使用相同的密钥 。 对称加密的要求 &#xff08;1&#xff09;需要强大的加密算法。算法至少应该满足&#xff1a;即使…

防火墙iptables介绍

防火墙&#xff1a; netfilter/iptables是集成在Linux2.4.X版本内核中的包过滤防火墙系统。该架构可以实现数据包过滤&#xff0c;网络地址转换以及数据包管理功能。linux中防火墙分为两部分&#xff1a;netfilter和iptables。netfilter位于内核空间&#xff0c;目前是Linux内核…

企业局域网的组建

写在前面的话 随着计算机技术发展啊&#xff0c;办公无纸化、网络化已经成为一种趋势。 企业局域网的概述 企业中可能有多台计算机&#xff0c;同时还可能有其他的硬件设备&#xff0c;比如打印机、扫描仪和数码相机等。通过组建小型网络&#xff0c;可以共享企业内部各种软、硬…

python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

概述传统多线程方案会使用“即时创建&#xff0c; 即时销毁”的策略。尽管与创建进程相比&#xff0c;创建线程的时间已经大大的缩短&#xff0c;但是如果提交给线程的任务是执行时间较短&#xff0c;而且执行次数极其频繁&#xff0c;那么服务器将处于不停的创建线程&#xff…

区块链+能源,能擦出什么样的火花?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链从闯入能源行业的那一天起&#xff0c;就引起了行业内外人群的高度关注&#xff0c;关于能源区块链的争论与质疑不断搅动人们的神经。区块链能…

JS学习梳理(三)类型和语法

类型 JavaScript 有七种内置类型&#xff1a;null、undefined、boolean、number、string、object 和symbol&#xff0c;可以使用typeof 运算符来查看typeof返回的都是字符串很多开发人员将undefined 和undeclared 混为一谈&#xff0c; 但在JavaScript 中它们是两码事。undefin…

北师大历史系65 级同学聚会宁夏【之七】——在中阿之轴、西夏王陵、董府、板桥道堂、鸿乐府及告别宴会...

北师大历史系65级同学在中阿之轴 庞心田、王庆云、李建宇、樊淑爱、何明书、郑文范、李建宇夫人、惠晓秋、边聪民、登高夫人、张登高、杨家兴、杨森翔 西夏王陵 北师大历史系65级同学在西夏王陵 北师大历史系65级同学在西夏王陵 郑文范、王庆云在沙湖 北师大历史系65级同学在董…

会声会影水墨遮罩如何变大_自媒体长期网赚项目: 自媒体如何打造自己的自媒体知识付费课程(干货)...

小编简介&#xff1a;猫哥&#xff0c;自媒体人&#xff0c;9年互联网营销实战经验&#xff0c;乐于为大家分享实战经验&#xff0c;希望认识更多志同道合的朋友。面对现在知识付费的时代&#xff0c;知识就是财富&#xff0c;能把自己储存的知识转化为财富的人并不多&#xff…

OBS源代码阅读笔记

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 obs配置文件加载&#xff1a;bool OBSBasic::InitBasicConfig(); OBS认证信息加载&#xff0c;貌似还没有实现吗&#xff1f; void Auth::Load(){ …

存储器结构层次(二)

局部性&#xff1a; 局部性分为时间局部性和空间局部性&#xff1a;Locality is typically described as having two distinct forms: temporal locality and spatial locality. In a program with good temporal locality, a memory location that is referenced once is like…

python 核心编程 第十三章

python面对对象 类和实例&#xff1a;类是对象的定义&#xff0c;实例是真真的实物。 创建一个类&#xff1a; class AddrBookEnttry(object):def __init__(self, nm, ph):self.name nmself.phone phprint"Created instance for:", self.namedef updatePhone(self,…

python写一个文件下载器_Python3使用TCP编写一个简易的文件下载器

原标题&#xff1a;Python3使用TCP编写一个简易的文件下载器利用Python3来实现TCP协议&#xff0c;和UDP类似。UDP应用于及时通信&#xff0c;而TCP协议用来传送文件、命令等操作&#xff0c;因为这些数据不允许丢失&#xff0c;否则会造成文件错误或命令混乱。下面代码就是模拟…

提取Jar2Exe源代码,JavaAgent监控法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 最近遇见一个麻烦&#xff0c;明明知道是java写的小软件&#xff0c;但是打包成了exe&#xff0c;木得办法&#xff0c;之前打包的都有缓存能在TEMP…

并发编程之多进程

一 multiprocessing模块介绍 python中的多线程无法利用多核优势&#xff0c;如果想要充分地使用多核CPU的资源&#xff08;os.cpu_count()查看&#xff09;&#xff0c;在python中大部分情况需要使用多进程。Python提供了multiprocessing。 multiprocessing模块用来开启子进…

x9此计算机上没有hasp_mastercam x9安装步骤

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。mastercam x9安装步骤是&#xff1a;1、首先&#xff0c;先下载好mastercam软件&#xff0c;下载安装包的大小为3.01G&#xff0c;双击打开setup.exe安装文件&#xff0c;然后再安装…

bitcoinj开发环境搭建

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 bitcoinj开发包是一个Java版本的比特币协议实现&#xff0c;使用bitcoinj就可以实现钱包管理和交易的发送与接收&#xff0c;而无须本地安装bitcoin…

static关键字用法

static关键字 1.修饰成员变量 在我们平时的使用当中&#xff0c;static最常用的功能就是修饰类的属性和方法&#xff0c;让他们成为类的成员属性和方法&#xff0c;我们通常将用static修饰的成员称为类成员或者静态成员&#xff0c;这句话挺起来都点奇怪&#xff0c;其实这是相…

swift x输入流_SwiftUI 探索 - 状态和数据流

SwiftUI是iOS13新出的声明式UI框架&#xff0c;将会完全改变以前命令式操作UI的开发方式。此文章主要介绍SwiftUI中状态管理的方式。可变状态State与React和Flutter中的State类似&#xff0c;只不过React和Flutter中需要显式调用setState方法。在SwiftUI 中直接修改State属性值…

qt 控件 背景色 透明 除去边框

在调试ui的时候&#xff0c;需要将背景色变为透明&#xff0c;与母控件的颜色一致&#xff0c;并且除去边框。 参考链接&#xff1a; http://www.qtcentre.org/threads/12148-how-QTextEdit-transparent-to-his-parent-window 除去背景色&#xff0c;使透明。ui->textBrowse…

A Strange Bitcoin Transaction

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 在之前的谈谈比特币的地址安全问题这篇文章中&#xff0c;我们谈到一个名为”LBC”的项目&#xff0c;这个项目通过暴力碰撞企图打捞到一些什么东西…

Jsoncpp 使用方法解析

Jsoncpp是目前比较好用的开源Json解析库&#xff0c;现在总结一下它的使用方法&#xff0c;理解&#xff0c;以供以后查阅。 在引入Jsoncpp的时候我们看到Jsoncpp里边的常用的cpp文件&#xff0c;有json_reader.cpp,json_value.cpp,json_writer.cpp, 其中&#xff1a; json_val…