消息队列(4):Kafka

介绍

kafka是一个支持分布式的消息系统,基于发布/订阅模式。
kafka由LinkedIn公司开发,2010年成为Apache顶级项目。
源码是由java写的。

基本概念

1、Broker

kafka集群中的每台机器,都叫一个broker.

2、Topic(主题)

一个topic代表着一类消息,不同类型的消息,就用不同的topic区分。

3、Partition(分区)

一个Partition就是一个队列。一个topic可以由多个Partition组成。
一个topic的多个partition可能会放在多个Broker上。

4、Producer(生产者)

向kafka发消息的客户端

5、Consumer(消费者)

从kafka拉消息的客户端

6、Consumer Group(消费者组)

这个相当于给消费者分了个组,在注册消费者的时候,要先指定是哪个消费者组。
这个概念,主要是为了kafka实现广播和单播的区分。
每多一个消费者组,topic的消息就会多复制一份给这个消费者组。
消费者组只会把消息发给本组的一个消费者。
这样的话,如果实现单播,那就一个消费者一个消费者组;如果要广播,那就多个消费者用一个消费者组。

7、Zookeeper

zk主要就是集群管理,包括Broker和Consumer。

图解

发现有网友画的一张很好的图,把kafka的数据流画的很清晰。
在这里插入图片描述
如上图,简单解释下:
有两个producer,producer0发topic0的消息,producer1发topic0和topic1的消息。
有3个broker作为一个集群,由zk管理,上图没画zk,自行脑补。
我们看到数据存储的最小单位是topic的某个partition。
这个图,为每个Partition做了两个副本,我们称为一主两从。
主用红色标识,从用黑色标识。
producer发消息都是发到主上,然后由主复制消息到从上。
消费者拉消息,也是从主上拉。
主从关系由zk来管理,基本上就是zk选举那一套。
consumer group0有一个消费者consumer0。
consumer0消费topic0的消息,所以我们看到consumer0从topic0的两个partition上同时拉消息。
consumer group1有三个consumer,012。
这里先指出一个上图的问题,一般一个consumer group是只消费一个topic的,我理解的是作者为了画出消费者数量与partition数据的关系,才这么画的,我们一个一个讲。

首先看consumer group1消费topic0的情况,topic0有两个partition,但consumer group1有三个consumer,所以consumer0负责拉topic0partiton0队列的消息,consumer1负责拉topic0partition1队列的消息。

再看consumer group1消费topic1的情况。由于topic1只有一个partition0,所以consumer group1也就只派出consumer0来拉这个topic1partition0的消息。

如果你认认真真把上面的看完,那么你应该能理解,所谓的一个topic多少个partition对于多少个consumer了吧。还是以3个为例,理想状况下,就是3个broker,对于一个tipic的3个partition的主分别部署在不同的broker上,主对于的两个从分别不在其他两个broker上。同时consumer group对应有3个consumer,分别从3个partition主上拉消息。

发布了203 篇原创文章 · 获赞 186 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/java_zhangshuai/article/details/103518838