Jafka来源分析——文章

Kafka它是一个分布式消息中间件,我们可以大致分为三个部分:Producer、Broker和Consumer。当中,Producer负责产生消息并负责将消息发送给Kafka;Broker能够简单的理解为Kafka集群中的每一台机器,其负责完毕消息队列的主要功能(接收消息、消息的持久化存储、为Consumer提供消息、消息清理.....)。Consumer从Broker获取消息并进行兴许的操作。每一个broker会有一个ID标识,该标识由人工在配置文件里配置。

Kafka中的消息隶属于topic,topic能够简单的理解为分组。在topic内部,消息会划分为分区(partition)。

对于partition可能难以理解。至少我读程序的时候一直没有弄明确partition的编号到底是怎么确定的,这里多说一下。

在broker的配置文件server.properties中有配置项num.partitions和topic.partition.count.map。 num.partitions是该broker每个topic默认的partition数目(设为N)。topic.partition.count.map针对每个topic设置partition数目(设为N)。Broker依据设置的数目在该机器为topic创建[0,1...N-1]N个partition。

所以,partition的命名能够理解为由两部分组成,brokerId和partitionNum。当中partitionNum是从0開始的数字。

Broker依照以下的原则组织该机器的消息队列。

首先,为每个topic的每个partition创建一个文件夹,命名格式为topic-partition。

Broker对于topic-partition的消息进行分段(segment)存储。每个segment的命名格式每个segment的偏移量(offet)。文件夹的组织结构详细例如以下图所看到的:

Kafka每一条Message的格式:

Length(4byte)

MagicValue(1byte)

Attribute(1byte)

CRC校验码(4byte)

payload(消息的内容)

当中magicvalue=1,Attribute表明消息是否採用压缩以及採用何种压缩方式,crc为payload的crc校验码。

消息在kafka的持久化存储文件里新增了一个域:消息的长度,详细的格式例如以下所看到的:

当中,ByteBufferMessageSet和FileMessageSet都是採用上面的格式进行存储的。

注意Kafka对消息进行压缩的过程。Kafka对消息进行压缩时是对一组Message进行压缩的,其处理步骤例如以下。

首先将每一条Message序列化到一个byte数组,然后将压缩后的byte数组再组成一条新的Message,其详细格式例如以下:

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

注意FileMessageSet中的offset是指该messageset在File起始位置,这是文件的详细位置。

时间: 2024-11-09 08:07:19

Jafka来源分析——文章的相关文章

Jafka来源分析——Processor

Jafka Acceptor接受client而建立后的连接请求,Acceptor会将Socket连接交给Processor进行处理.Processor通过下面的处理步骤进行client请求的处理: 1. 读取client请求. 2. 依据client请求类型的不同,调用对应的处理函数进行处理. Processor读取client请求是一个比較有意思的事情,须要考虑两个方面的事情:第一,请求规则(Processor须要依照一定的规则进行请求的解析).第二,怎样确定一次请求的读取已经结束(由于是非堵

微生物来源分析

目录 微生物来源分析 写在前面 准备 微生物来源分析 rm(list = ls()) gc() 导入主函数 导入分组文件和OTU表格 Load OTU table 下面区分目标样品和来源样品. Extract the source environments and source/sink indices 对两组样品进行抽平 Estimate source proportions for each sink 就正常样品而言,我们都会测定重复,这里基于多个样品的sourceracker分析 导入主函

Jafka源代码分析——随笔

Kafka是一个分布式的消息中间件,可以粗略的将其划分为三部分:Producer.Broker和Consumer.其中,Producer负责产生消息并负责将消息发送给Kafka:Broker可以简单的理解为Kafka集群中的每一台机器,其负责完成消息队列的主要功能(接收消息.消息的持久化存储.为Consumer提供消息.消息清理.....):Consumer从Broker获取消息并进行后续的操作.每个broker会有一个ID标识,该标识由人工在配置文件中配置. Kafka中的消息隶属于topic

Jafka源代码分析——LogManager

在Kafka中,LogManager负责管理broker上所有的Log(每一个topic-partition为一个Log).通过阅读源代码可知其具体完成的功能如下: 1. 按照预设规则对消息队列进行清理. 2. 按照预设规则对消息队列进行持久化(flush操作). 3. 连接ZooKeeper进行broker.topic.partition相关的ZooKeeper操作. 4. 管理broker上所有的Log. 下面一一对这些功能的实现进行详细的解析. 一.对于Log的管理 LogManager包

Jafka源代码分析——网络架构

在kafka中,每一个broker都是一个服务器.按照一般理解,服务器就是一个SocketServer,其不断接收用户的请求并进行处理.在Java中进行网络连接有两种方式一种为阻塞模式一种为非阻塞模式.Jafka采用非阻塞模式进行网络通讯.在Java的非阻塞模式中,建立socket server的一般流程如下: 1.启动ServerSocketChannel并将其绑定到特定的端口. 2.将ServerSocketChannel以及其感兴趣的操作注册到Selector,在这里感兴趣的操作是Acce

Jafka源代码分析——Processor

Jafka Acceptor接收到客户端请求并建立连接后,Acceptor会将Socket连接交给Processor进行处理.Processor通过以下的处理步骤进行客户端请求的处理: 1. 读取客户端请求. 2. 根据客户端请求类型的不同,调用相应的处理函数进行处理. Processor读取客户端请求是一个比较有意思的事情,需要考虑两个方面的事情:第一,请求规则(Processor需要按照一定的规则进行请求的解析):第二,如何确定一次请求的读取已经结束(因为是非阻塞连接,非常有可能第一次读操作

写了一篇关于 FastAdmin 插件路由的分析文章

写了一篇关于 FastAdmin 插件路由的分析文章 插件路由演示 ThinkPHP 的路由就像是整个应用的调度室,让你的应用 url 更友好,而且让应用更安全,不会让真实的地址暴露出去. 了解过 Laravel 的同学都知道,Laravel 一开始就是一堆繁琐的路由定义,但是 ThinkPHP5 不用,系统默认已经定义了路由规则. 而 FastAdmin 更是将 ThinkPHP5 发挥到了极致,将 ThinkPHP 强大的路由功能带到了插件中,可以在后台自定义插件的路由. 这里以 CMS 插

几篇QEMU/KVM代码分析文章

QEMU/KVM结合起来分析的几篇文章,代码跟最新的版本有些差异,但大体逻辑一样,写得通俗易懂.我把链接放这里主要是为自己需要查看时调转过去方便,感谢作者的付出! QEMU Source Code Study - 1 QEMU Source Code Study (2) - KVM_init QEMU Source Code Study (3) - KVM_CREATE_VCPU QEMU Source Code Study - KVM_RUN

SDL2来源分析3:渲染(SDL_Renderer)

===================================================== SDL源代码分析系列文章上市: SDL2源码分析1:初始化(SDL_Init()) SDL2源码分析2:窗体(SDL_Window) SDL2源码分析3:渲染器(SDL_Renderer) SDL2源码分析4:纹理(SDL_Texture) SDL2源码分析5:更新纹理(SDL_UpdateTexture()) SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy()) SDL2