kafka
消息队列(消息中间件)作用:
- 解耦:生产者和消费者实现间接对接,生产者不用等待消费者,消费者也不用放弃手中的事情而先去消费。
- 异步:生产者将消息放入消息队列后可以去做别的事情。提高了工作效率。
- 削峰:假如一个时间段内消息量暴增,比如在批量处理一些数据的时候,这时消费者可能不能瞬间处理这些消息,所以我们可以把消息暂存在消息队列中,依次处理,同时生产者那边也可以不用等待。
- Kafka采用的是:主动pull,即Producer将消息推送到broker,Consumer主动从broker拉取消息进行消费
- 原因主要有以下两点:
- 首先,主要是避免push模式下,当Producer推送的速率远大于Consumer消费的速率时,Consumer承受不住压力而崩溃或消息丢失而重新推送,浪费资源
- 再者,Push模式下,Broker不知道下游Consumer消费能力和消费策略的情况下,不知道采用立即推送单条消息还是缓存并批量推送,因此采用哪种策略可能都不合适。而Pull模式下,Consumer可以自主决定是否批量的从broker拉取数据,根据自己的消费能力去决定数据拉取策略。
- 原因主要有以下两点:
- 各组件
-
Topic:消息主题,可以理解为消息的分类(比如车辆审核,车辆消息变更),kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
-
Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!为什么要做分区?
-
Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
-
Producer:生产者,写入数据
-
Consumer:消费者,即消息的消费方,是消息的出口。
-
Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
-
Broker:kafka节点(kafka实例),一个分区主题的不同分区可以存入不同的broker,但是一个分区只能存在于一个broker中
- 如果不分区,相当于说一个topic只有一个分区,那么就只会放在一个broker中,这样broker机器的IO性能就将成为kafka的瓶颈。分区之后,每条消息被发送到Topic之前,会根据分区规则,有选择的存储在哪个分区,使消息不只是往一个Broker上写,就降低了单个Broker的IO写频率,也充分利用了多机提高了消息写入吞吐量。
- 提高并发。以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
-
Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。
-
- 存储策略
- 无论消息是否被消费,kafka都会保存所有的消息。那对于旧数据有什么删除策略呢?
- 基于时间,默认配置是168小时(7天)。
- 基于大小,默认配置是1073741824。
- 需要注意的是,kafka读取特定消息的时间复杂度是O(1),所以这里删除过期的文件并不会提高kafka的性能!
- 存入数据
- 消息写入leader后,follower是主动的去leader进行同步的!producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!写入示意图如下:

- 消息写入leader后,follower是主动的去leader进行同步的!producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!写入示意图如下:
- 消费数据
- 生产消息相同的是,消费者在拉取消息的时候也是找leader去拉取。
- 多个消费者可以组成一个消费者组(consumer group),每个消费者组都有一个组id!同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据。也就是一个分区的数据只可能让一个消费者来消费,但是一个消费者可以消费几个分区的数据。建议消费者组的consumer的数量与partition的数量一致

Kafka作为消息中间件,提供解耦、异步处理和削峰功能。采用主动Pull模式,Consumer从Broker拉取消息,以适应消费速率。文章介绍了Kafka的组件,如Topic、Partition、Replication、Producer、Consumer和Consumer Group,以及存储策略和Zookeeper的角色。Kafka通过分区提高并发,保证数据有序,并利用Consumer Group实现负载均衡。
1707

被折叠的 条评论
为什么被折叠?



