kafka的主题和分区

大家好,我是尚影嫣,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~

一、主题Topic

主题Topic可以理解成是⼀个类别的名称。Kafka 中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题,而消费者负责订阅主题并进行消费。发送到 Kafka 集群中的每一条消息都要指定一个主题。

二、partition分区

partition(分区)是kafka的一个核心概念,kafka将1个topic分成了一个或多个分区,每个分区在物理上对应一个目录,分区目录下存储的是该分区的日志段(segment),包括日志的数据文件和两个索引文件。然后每个分区又对应一个或多个副本,由一个ISR列表来维护。 注意:分区数可以大于节点数,但是副本数不能大于节点数,因为副本需要分不到不同的节点上,才能达到备份的目的。

kafka的主题和分区_第1张图片
⼀个主题中的消息量是非常大的,因此可以通过分区的设置,来分布式存储这些消息。比如⼀个topic创建了3个分区。那么topic中的消息就会分别存放在这三个分区中。
为⼀个主题创建多个分区:

./kafka-topics.sh --create --zookeeper localhost:2181 --partitions 2 --topic test1

查看topic的分区信息:

./kafka-topics.sh --describe --zookeeper localhost:2181 --topic test1

分区的作用:

  • 可以分布式存储;
  • 可以并行写;

实际上是存在data/kafka-logs/test-0 和 test-1中的0000000.log文件件中。

定期将消费分区的offset提交给kafka内部topic:__consumer_offsets,提交过去的
时候,key是consumerGroupId+topic+分区号,value就是当前offset的值,kafka会定
期清理topic里的消息,最后就保留最新的那条数据。
因为__consumer_offsets可能会接收高并发的请求,kafka默认给其分配50个分区(可通过offsets.topic.num.partitions设置),这样可以通过加机器的方式抗大并发。

通过如下公式可以选出consumer消费的offset要提交到__consumer_offsets的哪个分区:

hash(consumerGroupId) % __consumer_offsets主题的分区数。

你可能感兴趣的:(javakafka思否技术征文)