apache-kafka - Apache Kafka 偏移量是如何生成的?

标签 apache-kafka

经过了 How is the kafka offset value computed?

来自kafka documentation关于复制:

The purpose of adding replication in Kafka is for stronger durability and higher availability. We want to guarantee that any successfully published message will not be lost and can be consumed, even when there are server failures. Such failures can be caused by machine error, program error, or more commonly, software upgrades.

来自kafka documentation关于效率:

The message log maintained by the broker is itself just a directory of files, each populated by a sequence of message sets that have been written to disk in the same format used by the producer and consumer. Maintaining this common format allows optimization of the most important operation: network transfer of persistent log chunks.

我没有看到任何有关如何为主题生成偏移量的详细信息。偏移量将由集群中的一台机器生成,在这种情况下,有一个主节点或 Kafka 具有依赖于某种时钟同步的分布式日志记录,并在所有节点之间以一致的顺序生成消息。

任何指示或附加信息都会有所帮助。

最佳答案

不会为每条消息显式生成偏移量,并且消息也不存储其偏移量。

一个主题由分区组成,消息被写入垃圾中的分区,称为(在文件系统上,一个主题会有一个文件夹,每个分区都有子文件夹——段对应于分区文件夹中的文件)。

此外,每个分区都维护一个索引,并与段文件一起存储,该索引使用每个段第一条消息的偏移量作为键并指向该段。对于段内的所有连续消息,可以通过消息在段内的逻辑位置(包括第一条消息的偏移量)来计算消息的偏移量。

如果您启动一个新主题或实际上一个新分区,则会生成第一个段,并将其起始偏移量零插入到索引中。消息被写入该段,直到填满。一个新的段开始,它的起始偏移量被添加到索引中——新段的起始偏移量可以很容易地通过最新段的起始偏移量加上该段内的消息数来计算。

因此,对于每个分区,托管该分区的代理(即该分区的领导者)通过维护索引来跟踪该分区的偏移量。如果由于保留时间已过而删除段,则段文件将被删除,索引中的条目将被删除。

关于apache-kafka - Apache Kafka 偏移量是如何生成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751010/

相关文章:

java - Spring-cloud-stream MessageConversionException

apache-spark - spark writeStream 到 kafka - awaitTermination() 与 awaitAnyTermination() 之间的区别

java - 用于管理 api 每分钟最大请求数的数据结构

azure - Kafka 在 Azure Kubernetes 集群中工作,但不在本地 minikube 中工作

elasticsearch - CQRS:在 ElasticSearch 读取模型中项目乱序通知

apache-kafka - 为什么kafka不创建主题? - 不是公认的选项

java - Apache Storm Trident 和 Kafka 集成出现 Spout 错误

java - Spring-kafka-test 使用自定义反序列化测试 JSON 消息

hadoop - Kafka 主题与 Kafka Connect to HDFS 合并

go - 在 kafka-go 中读取具有特定 ID 的消息