一文了解Kafka核心概念和角色
点击上方蓝色字体,选择“设为星标”
文章目录
1.概述
2.Producer
3.Consumer
4.Consumer Group
5.Broker
6.Topic
7.Partition
8.Offset
9.持久化
10.Replica副本机制
11.zookeeper
一个topic就是一个消息队列,然后它把每个topic又分为很多个partition
这个是为了做并行的,更加方便扩展,而且提高了吞吐量
在每个partition内部消息强有序,相当于有序的队列,其中每个消息都有个序号offset,比如0到12,从前面读往后面写。
一个partition对应一个broker,一个broker可以管理多个partition
partition可以想象为一个文件,当数据发过来的时候它就往这个partition上面追加就行,消息不经过内存缓冲,直接写入文件
producer自己决定往哪个partition里面去写,这里有一些的策略,譬如hash。
组内:是queue消费模型,各个consumer消费不同的partition,因此一个消息在group内只消费一次
组间:是发布/订阅消费模型,各个组各自独立消费,互不影响,因此一个消息只被每个组消费一次
Topic可以类比为数据库中的库
partition可以类比为数据库中的表
一个topic就是一个消息队列,然后它把每个topic又分为很多个partition
一个topic可以有多个消费者组
同一个消费者组内的消费者在消费同一个topic时,这个topic中相同的数据只能被消费一次,即每个partion只会把消息发给该消费者组中的一个消费者
不同的消费者组消费同一个topic互不影响
一台kafka服务器节点就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
轮询(Round robin)
key的hash
每个consumer都有自己的消费者组group
同一个消费者组内的消费者在消费同一个topic时,这个topic中相同的数据只能被消费一次
不同的消费者组消费同一个topic互不影响
低版本0.9之前将offset保存在Zookeeper中,0.9及之后保存在Kafka的“__consumer_offsets”主题中。
一个topic可以有多个消费者组。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。
消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个消费者消费;
消费者组之间互不影响。
所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例(单播)。即每个消费者可以同时读取一个topic的不同分区!
如果需要实现广播,只要每个消费者有一个独立的消费者组就可以了。
如果需要实现单播,只要所有的消费者在同一个消费者组。用消费者组还可以将消费者进行自由的分组而不需要多次发送消息到不同的topic。
一个topic可以分为多个partition,通过分区的设计,topic可以不断进行扩展。一个Topic的多个分区分布式存储在多个broker(服务器)上。此外通过分区还可以让一个topic被多个consumer进行消费。以达到并行处理。分区可以类比为数据库中的表。
partition内部有序,但一个topic的整体(多个partition间)不一定有序
kafka只保证按一个partition中的顺序将消息发给consumer,partition中的每条消息都会被分配一个有序的id(offset),每个partition内部消息是一个强有序的队列,但不保证一个topic的整体(多个partition间)的顺序。
一个partition对应一个broker,一个broker可以管理多个partition
partition可以很简单想象为一个文件,partition对应磁盘上的目录,当数据发过来的时候它就往这个partition上面追加,消息不经过内存缓冲,直接写入文件
每个partition都会有副本,可以在创建topic时来指定有几个副本
文章不错?点个【在看】吧! 👇