热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kafka消息存储及检索(作者:杜亦舒)

Kafka消息存储及检索杜亦舒 性能与架构Kafka是一个分布式的消息队列系统,消息存储在集群服务器的硬盘Kafka中可以创建多个消息队列,称为topic,消息的生产者向topic

Kafka 消息存储及检索

杜亦舒 性能与架构

Kafka是一个分布式的消息队列系统,消息存储在集群服务器的硬盘

Kafka中可以创建多个消息队列,称为topic,消息的生产者向topic中发布消息,消息的消费者从topic中获取消息

消息是海量的,为了消息的读写性能,topic被分为多个部分,称为partition,kafka把每个topic的每个partition均匀的分布在集群中的不同服务器上

所以从整体来看,Kafka的逻辑关系就是:生产者向topic中的某个partition发送消息,消费者从partition获取消息

Kafka 消息存储及检索(作者:杜亦舒)

实际的存储结构中,partition并不是存放消息的物理文件,而是一个目录,命名规则是topic名称加上partition序号,其中包含了这个partition的N个分段存储文件segment

分段存储也是因为partition内容非常多,分成小文件更便于消息的写入和检索

Kafka 消息存储及检索(作者:杜亦舒)

segment也不是一个文件,是由两个物理文件构成:

 

.index索引文件、.log消息内容文件

 

这两个文件是成对出现,名称一样,只是后缀不同

实际的存储结构就是这样的

Kafka 消息存储及检索(作者:杜亦舒)

消息是按照顺序产生的,所以每个消息都有一个序号,称为offset,表示partiion的第多少个message,从0开始

每个segment存储了一段offset区间内的消息

segment文件以offset区间的起始值命名,长度固定20位,不足的位用0填充

例如存储了第0-20条的消息,segment文件就是:

00000000000000000000.index
00000000000000000000.log


index文件结构很简单,每一行都是一个key,value对

key 是消息的序号offset

value 是消息的物理位置偏移量



1,0
3,299
6,497
...

说明的就是第几个消息的物理位置是哪儿

log文件中保存了消息的实际内容,和相关信息

如消息的offset、消息的大小、消息校验码、消息数据等

 


消息检索过程示例

例如读取offset=368的消息

(1)找到第368条消息在哪个segment

从partition目录中取得所有segment文件的名称,就相当于得到了各个序号区间

例如有3个segment

00000000000000000000.index
00000000000000000000.log
00000000000000000300.index
00000000000000000300.log
00000000000000000600.index
00000000000000000600.log

根据二分查找,可以快速定位

第368条消息是在00000000000000000300.log文件中

(2)从index文件中找到其物理偏移量

读取 00000000000000000300.index

以368为key,得到value,如299,就是消息的物理位置偏移量

(3)到log文件中读取消息内容

读取 00000000000000000300.log

从偏移量299开始读取消息内容

完成了消息的检索过程

 


推荐阅读
  • 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • 讨伐Java多线程与高并发——MQ篇
    本文是学习Java多线程与高并发知识时做的笔记。这部分内容比较多,按照内容分为5个部分:多线程基础篇JUC篇同步容器和并发容器篇线程池篇MQ篇本篇 ... [详细]
author-avatar
ccmm6688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有