【杂谈】Kafka 消息偏移量:如何高效地定位和管理消息?

news/2024/12/26 12:53:25/文章来源:https://www.cnblogs.com/longfurcat/p/18631523

前言

在 Kafka 中,消息偏移量是什么?是文件中的索引吗?又是如何通过偏移量快速定位消息的?本文将深入探讨这些问题,帮助你更好地理解 Kafka 的偏移量机制。

Kafka 的偏移量是什么?

Kafka 中的 偏移量 实际上是每条消息的 序号。它为每条消息提供了一个唯一的标识。通过偏移量,消费者可以准确地找到并读取特定的消息。

偏移量在 Topic 中是唯一的吗?

答案是否定的,偏移量 仅在每个分区内是唯一的。一个 Topic 可能有多个分区,每个分区的消息都有一个递增的偏移量。因此,Kafka 不需要对所有分区的消息偏移量进行全局同步。每个分区独立管理自己的偏移量,这不仅减少了复杂性,还降低了性能开销。

消息的偏移量由谁决定?客户端还是服务端?

偏移量是由 服务端 决定的。客户端无法了解其他客户端的偏移量情况,如果由客户端决定,则需要额外的同步成本来实现全局偏移量管理。所以,消息的偏移量是由 Kafka 服务端来维护的。

单调递增的序号是否会达到最大值?

理论上,不会。Kafka 使用 64 位长整型(long)作为偏移量,其最大值为 2^63 - 1,即 9223372036854775807。在正常的消息生产速率下,偏移量的增长将持续数百年,远远不需要担心达到最大值。

举个例子:假设每个分区每秒钟写入 1 万条消息,那么偏移量达到上限大约需要 29,200 年。如此长的时间,几乎可以忽略不计。

Kafka 如何根据消息偏移量定位到文件中的位置?

既然我们知道 Kafka 的消息存储在文件中,那么问题就来了:如何根据“序号”定位到文件中的具体位置呢?

答案是 索引文件。Kafka 为每个分区维护一个索引文件,该文件记录了每个消息的偏移量及其对应的存储位置。通过索引文件,Kafka 可以非常快速地定位到某个偏移量对应的消息存储位置。

实际上,索引文件通常记录的是消息的起始位置,而每条消息的结束位置可以通过消息头来确定。

联想:Socket 通道的数据处理

这种设计让我联想到 Socket 通道 中的数据处理。Socket 通道也是连续的字节流,服务端根据 消息头 来解析报文的起始和结束位置,从而确定数据的边界。服务端可以连续地从字节流中提取完整的报文进行处理。

相同之处:

  • 都是通过消息头来解析数据边界。

不同之处:

  • Socket 通道中的数据是即时消费的,而 Kafka 的数据存储在磁盘中,等待被消费。
  • Kafka 消费者并不是从头开始消费,而是从特定的偏移量位置开始消费,这需要额外的定位操作,即通过索引文件来定位消息的起始位置。

Kafka 如何高效读取多条消息?

假设我们要读取一批消息,比如 100 条。显然,Kafka 不会每次都查找索引文件并定位单独的消息偏移量。实际情况是,Kafka 会根据 起始消息的位置最后一条消息的位置,一次性将这一段消息批量读取出来。通过这种方式,Kafka 避免了多次查询索引文件,从而显著提高了读取效率。

一个分区的日志段文件有多个,具体如何实现?

Kafka 的日志段文件有最大值(log.segment.bytes)和最大存活时间(log.segment.ms)限制。

当文件达到最大大小或超过最大存活时间时,Kafka 会关闭旧文件并开启新文件。

那么,是每个分区只有一个索引文件吗?

答案是否定的。实际上,每个日志段文件(以 .log 为后缀)都有一个对应的 索引文件(以 .index 为后缀)。

注意:关闭日志段仅意味着它不再接受新的消息写入,但已经存储的数据仍然可以被消费者访问。

日志段在被删除之前都能被访问,至于何时删除详见保留配置 log.retention.*

如何知道要查找哪个文件?

每个日志段文件的文件名就是该段的 起始偏移量。通过文件名,你可以知道消息存储在哪个文件中。接着,Kafka 通过该文件的索引文件来找到消息的具体位置。

  • 00000000000000000000.log(偏移量从 0 到 9999)
  • 00000000000000000000.index
  • 00000000000000010000.log(偏移量从 10000 到 19999)
  • 00000000000000010000.index

既然索引可以直接定位,Kafka为何还要限制日志段文件的大小?

因为内存映射。 Kafka 使用内存映射文件(Memory Mapped Files)来高效地处理日志的读取和写入。内存映射文件将文件映射到内存中,这样 Kafka 可以直接在内存中读取或写入数据,而无需频繁进行 I/O 操作,从而大大提高了性能。

但是,操作系统对内存映射文件的大小是有限制的,因此 Kafka 会限制单个日志段文件的大小。具体来说:

  • 操作系统的内存映射限制: 每个操作系统对于内存映射的文件大小都有一定的限制。单个文件过大可能会超出这一限制,从而影响性能,甚至导致程序崩溃。

  • 内存占用问题: 内存映射会将文件的部分内容加载到系统内存中,文件过大时,可能会导致系统内存占用过多,从而影响其他进程或系统的稳定性。尤其是在高负载环境下,操作系统可能无法为过大的文件提供足够的内存资源。

题外话:

1.正因如此,Kafka 通常建议将其单独部署在独立的服务器上,避免与其他应用争夺内存资源。这样能够确保 Kafka 的内存映射操作更加高效,并减少内存资源的竞争。

2.为了吞吐量,Kafka不会主动刷盘,刷盘依赖操作系统。刷新时间可能在几秒到几分钟之间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859270.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线性坐标系中绘制三角函数图象

本文记述了用 Matplotlib 在线性坐标系中绘制三角函数图象的例子。 代码主体内容如下: ...def main():fig, axs = plt.subplots(1, 3, figsize=(14,4.5)) #1axs[0] = configure_axes(axs[0], Trigonometric Function\t\t\t + r$sine$, 2*np.pi, 1, np.pi, np.pi/2…

美团后端暑期一面,本来收到感谢信,但又复活了!

今天来分享的是一位读者的美团暑期实习一面面经,主要是一些常规八股,难度还是有的,部分题目确实不太好回答。这位同学回答的不是很好,本来是收到感谢信了。结果,过几天又收到复活赛邀请,复活赛倒是打赢了,已oc。 1、线程池的参数/*** 用给定的初始参数创建一个新的Threa…

Makefile文件中,两个$的变量变量$$Xxx 与一个$的变量 $Xxx的区别

使用来引用 Makefile 中的变量。使用$$来引用 shell 中的变量,以确保在传递给 shell 时保留单个符号。原文地址:Makefile文件中,两个$的变量变量$$Xxx 与一个$的变量 $Xxx的区别Makefile 中的变量引用 在 Makefile 中,$ 符号用于变量替换,但它的使用方式有一些细微的区别:…

【日记】各位圣诞节快乐呀!(566 字)

正文不知道为什么最近总是做噩梦。昨天晚上梦到我一枪射死鱼儿,然后兄长用一瓶 4 块钱 1L 的冰红茶将我敲死,最后全人类死于小行星撞地球。有一颗小行星刚好降落在我家附近的山上,然后散射出了无数激光,把我家切割成一块一块的。也没塌,不知道哪个巫师用了魔法,把周围的房…

LDA主题模型——Python实现(三)

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } LDA假设每个文档都是多个主题的混合,每个主题又是多个词语的混合。它通过识别文档中的词语分布来推断出文档的主题结构。LDA的一个简单比喻是冰淇淋店:每个…

工具大全-dirsearch探测Web目录

目录扫描工具dirsearch非常详细使用方法dirsearch介绍dirsearch是一款开源的、基于Python开发的命令行工具,主要用于对Web服务器进行目录和文件的扫描,以发现潜在的安全漏洞。 dirsearch下载地址: https://github.com/maurosoria/dirsearch 运行环境:必须安装python3为什么…

Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

随着技术的成熟和 AI 的崛起,很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成。于是乎,单个开发者的能力得到了极大的提升 - 借助各种工具,一个人就可以完成开发、测试、运维等整条链路上的工作,渡劫飞升成为真正的 “全干工程师”。 之前我们分…

【详解】低功耗低成本的Open开发方案

Open开发应用需求,有没有低功耗、低成本方案? 今天我们一起来聊聊Air780EP模组。 一、Air780EP核心信息描述 运营商支持: Air780EP模组面向国内的全网通模组,支持移动、电信、联通三大运营商。 仅比Air700E系列相对大一些: Air700ECQ/Air700EAQ/Air700EMQ; 与Air780E系列…

01现代计算机视觉入门之:什么是图片

## 系列文章目录 ## 01现代计算机视觉入门之:什么是图片(6700字/25图) 02现代计算机视觉入门之:什么是视频 03现代计算机视觉入门之:什么是图片特征编码 04现代计算机视觉入门之:什么是图片分类 05现代计算机视觉入门之:什么是目标检测 06现代计算机视觉入门之:什么是图…

微信小程序中supabase在线数据库使用指南

在微信小程序中使用supabase在线数据库可以无需后端和服务器完成个人小项目的开发。本文记录我的使用过程,在阅读本文前,建议您先满足以下条件:持有可用于开发的微信小程序 了解kexue上网第一步 注册与简单使用 首先,我们到https://supabase.com/注册一个账户,并创建一个您…

USB上网快速入门:RNDIS网卡,手把手教你!

本文将带你使用RNDIS的方式,搭配Linux主控终端,快速实现USB上网。 RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡,从而使Linux可以通过USB设备连接网络。 一、Linux驱动配置 1. 虚拟串口 通过串口…