参考文献
基本概念这里
理解分区 Partition
offset 理解
基本概念
- Topic
- 是一个逻辑概念,相当于给消息分配的标签
- Partition
- 分区,topic 中的消息被分割为一个或多个的 partition,是一个物理概念
- 对应到系统上就是若干个目录,一个分区就是一个日志文件
- 消息以追加(append)的形式写入分区,先后以顺序的方式读取
- 每个日志文件都是一个log entry序列。这个log entry并非由一个文件构成,而是分成多个segment
- Segment
- 段,将 Partition 进一步细分为若干个 segment,每个 segment 文件的大小相等
- 每个segment以该segment第一条消息的offset命名并以.kafka为后缀
- 另外会有一个索引文件,它标明了每个segment下包含的log entry的offset范围
因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高
(顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证),值得一提的是,kafka使用文件进行存储,并且采用操作系统的零拷贝技术,主要利用Channel
的transferTo
方法。
- Broker
- Kafka 集群包含一个或多个服务器,每个 Kafka 中服务器被称为 broker。
- Broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
- Broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息
Broker 是集群的组成部分,每个集群中都有一个 Broker 同时充当了集群控制器 Leader的角色(选举产生;每个 Broker 都可能成为 Leader,功能包括将分区 partition 分配给 broker 和监控 broker)
集群中,一个分区从属于一个 Leader,但是一个分区可以分配给多个 Broker(非Leader),这时会发生分区复制
(复制机制为分区提供了消息冗余,如果一个 broker 失效,那么其他活跃用户会重新选举一个 Leader 接管)
- Producer
- 消息的发布者,会将某 topic 的消息发布到相应的 partition 中。
- 默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。
- 某些情况下,生产者会把消息直接写到指定的分区
- Consumer
- 消费者,一个消费者可以消费多个 topic 的消息
- 对于某一个 topic 的消息,其只会消费同一个 partition 中的消息
同一Topic的一条消息只能被同一个Consumer Group内的一个Consumer消费;
但多个Consumer Group可同时消费这一消息
单播:所有的Consumer在同一个Group里
广播:只要每个Consumer有一个独立的Group就可以
- offset
kafka会将生产的消息 append 到不太的 partition 中(即分区),每个分区都是有序且顺序不可变的记录集,分区中每一个记录都会分配一个 id 号来表示顺序,称之为 offset,offset 用来唯一标识区分分区中的每一条记录。消息的被读状态是由 consumer 来维护的,所以每个partition中offset一般都是连续递增的(如果开启了压缩,因为对旧数据的merge会导致不连续)被读取的消息并不会删除,所以每次都是追加写入顺序读写,具备很好的吞吐量。
- offset 有什么作用
消费者在消费数据时,发生宕机后,再次重新启动后,消费的数据需要从宕机位置开始读取
- 如果从头读取, 有一部分消息一定出现了重复消费
- 如果从宕机时的消费位置读取, 就不会出现重复消费
- 因此kafka设计了offset 可以用于处理这种情况
- 如何维护 offset 的值
- 自动提交,设置
enable.auto.commit=true
,更新的频率根据参数【auto.commit.interval.ms】来定。这种方式也被称为【at most once】,fetch到消息后就可以更新offset,无论是否消费成功。默认就是true- 手动提交,设置
enable.auto.commit=false
,这种方式称为【at least once】。fetch到消息后,等消费完成再调用方法【consumer.commitSync()】,手动更新offset;如果消费失败,则offset也不会更新,此条消息会被重复消费一次
- offset 实体在什么位置
0.9.0版本以前.这些数值维护在zookeeper中,但是zk不适合大量写入.后来做了改动
0.9.0 版本以后,数据维护在kafka的_consumer_offsets主题下.
内部结构包括
groupid:topicName_partition offset
Kafka
-
Kafka 是分布式发布-订阅消息系统。在 Kafka 集群中,没有“中心主节点”的概念,集群中所有的服务器都是对等的,因此,可以在不做任何配置的情况下实现服务器的删除与添加,消息生产者和消费者也能够做到随意重启和机器的上下线
-
消息系统生产者和消费者部署关系
-
消息系统架构