什么是kafka
kafka是分布式的,多副本的,多订阅者,多分区的基于zookeeper协调的分布式日志系统(也是MQ)
kafka的优点
- 高吞吐量,低延迟:kafka每秒可以处理几十万条消息,延迟最低只有几毫秒
- 高扩展性:集群支持热扩展
- 持久性:kafka直接将消息持久化到本地磁盘,并且有备份防止数据丢失
- 容错性:支持集群中的节点挂掉(最多n-1)
- 高并发:一个节点支持数千个客户端同时读写
kafka结构
kafka架构包含四大组件:消费者,生产者,kafka集群,zookeeper集群
根据图中可以看出几个很重要的术语:
- broker:kafka集群有很多个服务器节点,一个节点就叫一个broker
- topic:每条发布到集群的消息都有一个类别,这个类别就是topic,其实就是将消息按照类别分类.topic是逻辑上的分类,同一个topic的消息可以在同一个broker上,也可以在不同的broker上
- partition:即分区,一个topic会被划分成一个或多个分区,每个分区在物理上分别对应一个文件夹,该文件夹里存放着这个分区的所有文件和索引.当消息发布到topic,会根据分区策略将消息保存到分区末尾,属于顺序写磁盘
- 分区策略:分区策略就是生产者将消息发送到哪个分区的算法.kafka提供了默认的分区策略,同时也支持自定义分区策略.kafka支持给每一个消息指定一个key,同一个key的消息会被发送到相同的分区上去,这个策略属于自定义策略的一种,被称为:按消息key保存策略,或者 key-ordering策略
- offset:partition中的每条消息都被标记了一个序号,代表的是此消息在分区中的偏移量(我理解为下标),这个序号就是offset,分区中的每条消息都有唯一的offset,可以通过offset指定要消费的消息.
正常情况下,offset是递增的,但是也可以自己定义offset来决定要读取哪条消息,可以理解为offset是由consumer控制的,消费者想消费哪条消息都可以,所以kafka broker是无状态的,不需要标记哪条消息被消费过 - producer:生产者,生产者发送消息到指定的topic,消息根据分区策略添加到某个分区的末尾
- consumer:消费者,从topic中消费数据’
- consumer group:消费组,每个consumer都可以指定一个consumer group,不指定则属于默认.
同一个topic的一条消息只能被一个consumer group的一个consumer消费,但是多个consumer group可以同时消费这一消息,这也是kafka实现广播和单播的方法.如果需要广播,则每个consumer group只定义一个consumer,如果需要单播,则只定义一个consumer group. - leader:每个partition都有副本,其中有且只有一个leader,leader负责对服务端的所有读写操作.
- follower:follower不对外服务,只对leader进行备份,当leader挂掉,会从follower中选举出一个成为新的leader,如果follower挂掉或者加载慢,leader会把这个follower从ISR列表中删除,重新创建一个follower
- rebalance:一个consumer group下的所有consumer互相协调消费工作. 一个topic会被分为多个分区,这些分区会被均匀的分配给这个consumer group下的所有消费者.
rebalance表示重平衡,如果某个消费者挂了,kafka会重新分配分区给剩下的消费者.这也是kafka消费者端实现高可用的重要手段
对kafka架构的几点解释
- kafka集群包含若干个producer,若干个broker,若干个consumer group,以及一个zookeeper集群.kafka通过zookeeper控制集群,选举分区leader,以及当consumer group发生变化时进行rebalance
- 一个topic会被分成一个或多个分区,每个分区都会有分区副本,其中一个分区副本会被选举为leader,其他的作为follower,其中只有leader提供对外服务,follower只对leader进行备份,当leader挂掉,follower中会重新选举出一个leader来支持对外服务
- kafka中被消费过的消息不会被删除,只是offset会默认递增,kafka中的消息只有在超过规定的时间后才会被删除,
数据的保存时间(单位:小时,默认为7天)
log.retention.hours=168
- 点对点模式和订阅模式
点对点模式:生产者发送消息到queue中,queue支持存在多个消费者,但一条消息只能被一个消费者消费,消息被消费过后会被queue删除.
订阅模式:生产者发送消息到topic,topic可以被所有消费者订阅,并且topic中的消息可以被所有消费者消费. - 消费端pull和push
push:broker主动将消息推送给consumer.
优点:不需要消费者额外开启线程监听中间件,节省开销
缺点:消费者消费消息的能力不一样,容易造成部分消费者空闲,部分消费者拥堵的情况
pull:消费者主动向消息中间件拉取消息
缺点:需要开启额外线程监听消息中间件,增加性能开销
优点:消费者可以根据自己的消费能力自主的拉取消息
参考文章:https://mp.weixin.qq.com/s?__biz=MzU1NDA0MDQ3MA==&mid=2247483958&idx=1&sn=dffaad318b50f875eea615bc3bdcc80c&chksm=fbe8efcfcc9f66d9ff096fbae1c2a3671f60ca4dc3e7412ebb511252e7193a46dcd4eb11aadc&scene=21#wechat_redirect