研磨消息中间件Kafka之主题、分区及消息位移
本文中主要涉及到Kafka的消息主题(Topic)、分区(Partition)、消息位移(Offset)。
主题(Topic)与分区(Partition)
首先说说Topic。
直观的说,Topic是一个逻辑上的概念,代表了一类消息。在业务上,一个Topic代表了一类型的具体的业务场景,如:下单场景使用OrderChargeTopic,支付场景则使用PayOrderTopic。
一个Topic通常会被多个消费者所订阅,从性能方面考量,Kafka没有采用topic->message的两级结构,而是采用了topic->Partition->message三级结构进行负载的分散。也就是说,对于一个topic而言,它包含了多个Partition,对于Partition,我们在 《研磨消息中间件kafka之消息持久化及副本》 这篇文章中也有所涉及。
如图,是Kafka官网对topic与Partition关系的直观表述
可以直观的看到,一个topic由多个Partition组成,对Kafka而言,Partition是一个不可做修改的有序消息序列,本质上是一个有序的消息日志。
每一个分区都有一个自己的分区编号,默认从0开始。客户端对Partition的唯一操作是在消息序列的尾部追加写消息(append)。Partition上的每一条消息都会被分配一个唯一的序列号,该序列号在Kafka的概念中称为Offset(位移)。该位移是从0开始顺序递增的整型数。通过该位移数据可唯一定位到某一个Partition下的一条消息。
Kafka引入Partition的主要目的是为了提高消息吞吐量,Partition数量是可配置的,我们需要根据自身业务量对该值进行合理分配。
消息位移(Offset)
承接上文,我们知道在Kafka的分区中,每一条消息都会分配一个唯一序列,称之为Offset。
在Kafka的消费端也有Offset的概念,也叫做唯一。
但是,这两个位移概念是不同的。
对于分区消息位移而言,每条消息在某一个Partition上的位移是固定的,是一个静态概念;对于消费消息位移而言,该位移会跟随消费进度而不断前移,并且不能超过当前分区最新一条消息所在的位移,这里说的消息位移是一个动态的概念。
也就是说,如果提到了消息位移,我们需要结合上下文语境,确定是静态的消息位移,还是消费者消费的动态消息位移。
小结
通过消息主题(Topic)、分区(Partition)、消息位移(Offset),我们能够位移确定一条消息,这三个属性其实构成了一条消息的坐标,也就是 (topic, partition, offset) 这个三元组唯一标识了Kafka集群中的一条消息。