kafka笔记

最近有使用kafka,顺便学习下kafka,这个博客写的很详细。http://www.jasongj.com/2015/01/02/Kafka%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/
下面记录几条刚开始没有理解的点,方便以后回忆。

1 topic和particion关系

topic在逻辑上是一个队列,每条消费者必须指定它的topic。为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件。
partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序
topic被发到哪个particion是通过消息中的key进行hash决定的。

2 particion和consumer关系

一个particion最多只能由一个consumer去消费,但一个consumer可以消费多个particion。这也保证了一个particion中消息是顺序消费的,但如果consumer数量大于particion数量,多出来的consumer是浪费的。

3 topic和consumer group(CG)关系

这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个CG只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic。
既:一条消息只能一个CG消费一次,但可以被多个CG消费。

4 消费状态怎么记录

Kafka会为每一个consumergroup保留一些metadata信息:当前消费的消息的position,也即offset。这个offset由consumer控制。正常情况下consumer会在消费完一条消息后线性增加这个offset。当然,consumer也可将offset设成一个较小的值,重新消费一些消息。因为offet由consumer控制,所以Kafka broker是无状态的,它不需要标记哪些消息被哪些consumer过,不需要通过broker去保证同一个consumergroup只有一个consumer能消费某一条消息,因此也就不需要锁机制,这也为Kafka的高吞吐率提供了有力保障。