- 名词解释
producer:消息生产者,向kafka集群发送消息,它是一个程序
consumer:消息消费者,从kafka集群获取数据,它是一个程序
broker:kafka集群的最小组成单元,它是一个服务
topic:kafka将producer产生的消息按照topic进行分类
partition:kafka将每一个topic又分成了一个个分区,每一个分区都是一个有序的、不可变的消息序列,他是一个log
offset:每一个分区中的消息都有自己的offset,consumer可以顺序读取每一个分区中的消息,也可以通过offset读取随机读取消息。
- 分布式容错
kafka集群由多个broker组成,每个broker上都存放了partition,并且通过副本机制对patition进行容错,每个broker都存放了不同的patition副本。每个partition中都有一个leader,其他的副本所在的服务器称为follower,leader负责partition的读写,follower复制leader。如果leader挂了,某一个follower就成为了leader。
从上图可以看出,kafka中有一个“cyxTest”的topic,这个topic有3个partition,每个partition有2个副本,partition0的leader是broker2,partition0的所有的副本存放在broker0和broker2上。并且所有partition的副本分布都是负载均衡的。
- 详细说明
public ProducerRecord(String topic, Integer partition, K key, V value) {
...
}
consumer:
一般的消息传递有2种模式:queuing(队列)和publish-subscribe(发布-订阅)。
queuing(队列):一条消息只由一个consumer消费
publish-subscribe(发布-订阅):一条消息广播给所有consumer消费
在kafka中,多个consumer可以组成一个consumer group,一个consumer group中的不同consumer可以是一台机器上面的不同进程,也可以分布在不同的机器上。这样,kafka就可以将消息先通过发布订阅模式广播给所有的consumer group,然后组内是队列模式,所有consumer 实例竞争一个消息,保证了kafka的容错和稳定性。并且一个组中消费者的数量不能多于partition的数量,一旦多,那么就可能让某一个consumer空闲无法消费消息,资源浪费。
相比于传统的消息系统,通过分区kafka的消息传递可以有较好的顺序保证。给每一个分区指定一个consumer group(组内只有一个consumer进程),这样每一条消息都会被一个消费者消费,但是kafka只能保证一个partition的消息被顺序消费,如果希望所有的消息被顺序消费,那么就为一个topic指定一个partition。