Kafka中的topic和partition
阅读数:104 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
broker | 一台kafka服务器就是一个broker |
topic |
topic是一个存储消息的逻辑概念,可以认为是一个消息集合。物理上来说,不同的Topic的消息是分开存储的,每个topic可以有多个生产者向它发送消息,也可以有多个消费者去消费其中的消息。 为了提高topic的负载能力,topic被划分为多个partition。生产者会把同一个topic中的消息分散发到不同的partition中。 |
partition |
不同partition包含的消息是不同的,同一partitin中消息是有序的(offset)。
|
offset |
每个消息在被添加到partition时,都会分配一个offset,它是消息在此partition中唯一编号 ,Kafka通过offset保证消息在分区内的顺序,offset的顺序不跨分区,即Kafka中保证在同一个分区内的消息是有序的。 所以消费者要想定位一条消息需要三个信息:Topic,Partition,Offsets。 |
consumer group |
topic中的一条消息,只能被同一个group中的一个consumer消费 |
zookeeper |
保存中每个topic中每个partition中对应每个consumer group消费的offset |
producer |
producer发送消息以不同的partition中 |
consumer |
consumer接受数据的时候是按照group来接受,kafka确保每个partition只能同一个group中的一个consumer消费,如果想要重复消费,那么需要其他的组来消费。 |
二、topic vs partition
topic是一个逻辑概念,partition是一个物理概念。
1、partition
partition是一个有序的消息队列,每个partition都对应一个commit log。
(1)为什么kafka的topic下要设置partition分区
kafka一般不会删除消息,一管这些消息有没有被消费。默认保留最近一周的日志消息。kafka的性能与保留的消息数据量大小没有关系,因为数据是保存在磁盘上的。
kafka分的考量为以下两点
1 |
消息日志文件会受到所在机器的文件系统大小的限制,分区之后,理论上一个topic可以处理任意数量的消息数据。 |
2 |
为了提高并行度。 |
(2)单播消费
让所有消费者处在同一个消费组里,消费组中的多个消费者只有一个可以消费到Partition分区中的消息。类似queue模式,一条消息只能被某一个消费者消费。
(3)多播消费
多播只要保证这些消费者属于不同的消费组即可。多播消费其实是一条消息能被多个消费者消费的模式,类似publish-subscribe模式
三、kafka的顺序消费
对于kafka来说,从整体架构上来讲,一般上是不支持顺序消费的。生产者可以选择不同的partition分区发送消息,消费者组可以消费不同partition分区的数据,这样就无法保证顺序性
解决方法:
1 |
topic下只设置一个partition分区,在创建一个消费者组,里边一个消费者去消费 缺点是效率低下,不符合kafka高效率的初衷。 |
2 |
脱离kafka来实现消息顺序 |