在Kafka中,LogManager负责管理broker上全部的Log(每个topic-partition为一个Log)。

通过阅读源码可知其详细完毕的功能例如以下:

1. 依照预设规则对消息队列进行清理。

2. 依照预设规则对消息队列进行持久化(flush操作)。

3. 连接ZooKeeper进行broker、topic、partition相关的ZooKeeper操作。

4. 管理broker上全部的Log。

以下一一对这些功能的实现进行具体的解析。

一、对于Log的管理

LogManager包括成员变量logs。logs的key是topic,value是Pool<Integer,Log>(该value又是一个Map。主键是partition,value是该partition所相应的Log)。因此LogManager通过logs保存该broker上全部的消息队列。

private final Pool<String, Pool<Integer, Log>> logs = new Pool<String, 	Pool<Integer, Log>>();

LogManager在初始化之后。须要依据配置文件配置的消息队列根文件夹进行遍历。

通过遍历,查找并生成Log。该遍历的详细实如今方法load中:

① 获取消息队列根文件夹下的全部文件

② 对于根文件夹下的每个文件进行例如以下操作

1.假设是文件夹。则有可能是一个Log,否则不是并忽略

2.对于通过1的文件夹分析其文件名称,文件夹的文件名称由两部分组成:topic-partition

3.对于通过2的文件夹。用文件夹、解析出的topic、解析出的partition生成Log

4.将3生成的Log放入logs日志池

5.最后,推断文件夹解析的partition与配置文件里配置的partition的大小,假设配置文件较小。则更新配置

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVvY2hhbnhpYW9oZXNoYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

二、消息队列清理

消息队列的清理由Scheduler周期性的调用,详细的调用在load函数中,基本的删除实如今cleanLogs函数中。

消息队列的清理分为两种情况:一种是超过预设的时间则删除。二是超过预设的大小则删除。分别相应两个函数cleanupExpiredSegments和cleanupSegmentsToMaintainSize。第一种情况比較简单,由于每个segment相应一个文件,通过对照文件的lastModifiedTime和系统的如今时间来确定其是否超时,假设超时则删除。对于另外一种情况,首先比較Log的大小与配置的大小。假设小于配置的大小则不删除。假设大于了配置的大小,则计算超过配置大小的长度(定为差值);然后将小于该差值的segment删除(这地方有点疑惑。这样删除会不会把一些最新的消息队列给删除了)。

 if (this.scheduler != null) {
this.scheduler.scheduleWithRate(new Runnable() {
public void run() {
try {
cleanupLogs();
} catch (IOException e) {
logger.error("cleanup log failed.", e);
}
}
}, 60 * 1000, logCleanupIntervalMs);
}

三、对于消息队列的持久化

对消息队列的flush操作相同由单独的线程来完毕。该线程通过比較Log上一次的flush时间和当前的系统时间来确定是否须要flush。假设须要则持久化到文件。

注意,消息的队列的持久化在新增消息的时候也会推断,假设一个Log保存的新增消息的条数超过了预设值则进行flush操作。


在Kafka中,LogManager负责管理broker上全部的Log(每个topic-partition为一个Log)。通过阅读源码可知其详细完毕的功能例如以下:

1. 依照预设规则对消息队列进行清理。

2. 依照预设规则对消息队列进行持久化(flush操作)。

3. 连接ZooKeeper进行broker、topic、partition相关的ZooKeeper操作。

4. 管理broker上全部的Log。

以下一一对这些功能的实现进行具体的解析。

一、对于Log的管理

LogManager包括成员变量logs。logs的key是topic,value是Pool<Integer,Log>(该value又是一个Map,主键是partition。value是该partition所相应的Log)。

因此LogManager通过logs保存该broker上全部的消息队列。

private final Pool<String, Pool<Integer, Log>> logs = new Pool<String, 	Pool<Integer, Log>>();

LogManager在初始化之后,须要依据配置文件配置的消息队列根文件夹进行遍历。通过遍历,查找并生成Log。该遍历的详细实如今方法load中:

① 获取消息队列根文件夹下的全部文件

② 对于根文件夹下的每个文件进行例如以下操作

1.假设是文件夹。则有可能是一个Log。否则不是并忽略

2.对于通过1的文件夹分析其文件名称,文件夹的文件名称由两部分组成:topic-partition

3.对于通过2的文件夹。用文件夹、解析出的topic、解析出的partition生成Log

4.将3生成的Log放入logs日志池

5.最后。推断文件夹解析的partition与配置文件里配置的partition的大小,假设配置文件较小,则更新配置

二、消息队列清理

消息队列的清理由Scheduler周期性的调用,详细的调用在load函数中。基本的删除实如今cleanLogs函数中。消息队列的清理分为两种情况:一种是超过预设的时间则删除,二是超过预设的大小则删除,分别相应两个函数cleanupExpiredSegments和cleanupSegmentsToMaintainSize。第一种情况比較简单,由于每个segment相应一个文件,通过对照文件的lastModifiedTime和系统的如今时间来确定其是否超时。假设超时则删除。对于另外一种情况。首先比較Log的大小与配置的大小。假设小于配置的大小则不删除;假设大于了配置的大小,则计算超过配置大小的长度(定为差值)。然后将小于该差值的segment删除(这地方有点疑惑。这样删除会不会把一些最新的消息队列给删除了)。

 if (this.scheduler != null) {
this.scheduler.scheduleWithRate(new Runnable() {
public void run() {
try {
cleanupLogs();
} catch (IOException e) {
logger.error("cleanup log failed.", e);
}
}
}, 60 * 1000, logCleanupIntervalMs);
}

三、对于消息队列的持久化

对消息队列的flush操作相同由单独的线程来完毕。该线程通过比較Log上一次的flush时间和当前的系统时间来确定是否须要flush,假设须要则持久化到文件。注意,消息的队列的持久化在新增消息的时候也会推断,假设一个Log保存的新增消息的条数超过了预设值则进行flush操作。


Jafka源码分析——LogManager的更多相关文章

  1. Jafka源码分析——网络架构

    在kafka中.每个broker都是一个server.依照一般理解,server就是一个SocketServer,其不断接收用户的请求并进行处理.在Java中进行网络连接有两种方式一种为堵塞模式一种为 ...

  2. YARN DistributedShell源码分析与修改

    YARN DistributedShell源码分析与修改 YARN版本:2.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述 2 YARN Distrib ...

  3. java 日志体系(四)log4j 源码分析

    java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...

  4. Shiro源码分析

    1.入口类:AbstractAuthenticator 用户输入的登录信息经过其authenticate方法: public final AuthenticationInfo authenticate ...

  5. Tomcat源码分析——启动与停止服务

    前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...

  6. Apache Kafka源码分析 – Broker Server

    1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...

  7. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  8. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

  9. 3. SOFAJRaft源码分析— 是如何进行选举的?

    开篇 在上一篇文章当中,我们讲解了NodeImpl在init方法里面会初始化话的动作,选举也是在这个方法里面进行的,这篇文章来从这个方法里详细讲一下选举的过程. 由于我这里介绍的是如何实现的,所以请大 ...

随机推荐

  1. java的回调方式

    经常写js的回调,js的回调很简单,直接传方法名称,但是java中方法不能作为参数传递 但是java中可以传一个对象,在对象中编写多个方法,然后作为参数传递到对象里以后,就可以在适当的时机调用该对象里 ...

  2. chfn - 改变你的finger讯息

    总览 SYNOPSIS chfn [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] [ -u ] [ -v ] ...

  3. pom.xml配置引用项目时不生效

    1 在项目pom.xml配置中引用项目A,但是编译时,取提数引起是B: 2 原因是:[Java Build Path - Projects] 引用的还是老的项目B,删除该引用即可解决.

  4. python 3计算KL散度(KL Divergence)

    KL DivergenceKL( Kullback–Leibler) Divergence中文译作KL散度,从信息论角度来讲,这个指标就是信息增益(Information Gain)或相对熵(Rela ...

  5. DIV可编辑后,与限制输入及光标偏移的纠葛

    前言 最近在弄个人的网站,偶然间发现DIV可以设置编辑模式,之前设计的方案在此功能上需要限制输入的长度.网上搜索了一波,综合搜索的结果,考虑使用的监听事件有:keydown .textInput .i ...

  6. BZOJ 3326 [SCOI2013]数数 (数位DP)

    洛谷传送门 题目: Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制$B$ 确定一个数数的区间$[L, R]$ 对于$[L, R] $间的每一个数, ...

  7. nginx搭建静态资源服务器

    nginx配置访问前端工程 1.前端工程目录 crm-view |-- view |-- user.html 2.工程位置 C:\Users\Administrator\Desktop\CRM系统\c ...

  8. Linux学习笔记(一) 文件系统

    对于每一个 Linux 学习者来说,了解 Linux 文件系统的结构是十分有必要的 因为在 Linux 中一切皆文件,可以说只有深入了解 Linux 的文件系统,才会对 Linux 有更深刻的理解 L ...

  9. Memcache 分布式存储 【一致性Hash】crc32

    class memcacheHash { private $_node = array(); private $_nodeData = array(); private $_keyNode = 0; ...

  10. python 安装模块 更新模块

    #显示模块pip list #显示过期模块pip list --outdated #安装模块pip install xxx #升级模块pip install --upgrade xxx