大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~
一、主题Topic
主题Topic可以理解成是⼀个类别的名称。Kafka 中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题,而消费者负责订阅主题并进行消费。发送到 Kafka 集群中的每一条消息都要指定一个主题。
二、partition分区
partition(分区)是kafka的一个核心概念,kafka将1个topic分成了一个或多个分区,每个分区在物理上对应一个目录,分区目录下存储的是该分区的日志段(segment),包括日志的数据文件和两个索引文件。然后每个分区又对应一个或多个副本,由一个ISR列表来维护。 注意:分区数可以大于节点数,但是副本数不能大于节点数
,因为副本需要分不到不同的节点上,才能达到备份的目的。
⼀个主题中的消息量是非常大的,因此可以通过分区的设置,来分布式存储这些消息。比如⼀个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主题的分区数。
本文参与了思否技术征文,欢迎正在阅读的你也加入。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。