文章目录
- 一、介绍
- 二、消息队列通信的模式
- 三、特性
- 四、使用场景
- 五、核心概念
一、介绍
- kafka是一个分布式的发布订阅消息系统
- 基于Zookeeper协调
- 最初由Linkedin公司开发,于2010年贡献给了Apache基金会并成为顶级开源项目
- Kafka的核心是由Scala语言编写,Kafka的客户端库使用Java语言编写
二、消息队列通信的模式
- 点对点模式
- 消息持久化到一个队列中
- 一个或多个消费者消费队列中的消息,消息只能被消费一次,当一个消费者消费完成一条消息后就会删除该消息
- 发布订阅模式
- 消息被持久化到一个topic中
- 与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除
- 在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者
三、特性
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
四、使用场景
- 日志收集:公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种消费者
- 消息系统:解耦生产者和消费者、缓存消息
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告
五、核心概念
-
Broker
- 1个Broker就是1个kafka节点,多个Broker组成1个kafka集群
- 每个kafka集群内的Broker都有一个唯一的id:
broker.id
-
Producer
- 生产者
- 负责生产消息
-
Consumer
- 消费者
- 负责消费消息
-
Consumer Group
- 消费者组
- 由1个或多个消费者组成
- 1个Partition的数据只能被消费者组中的某一个消费者消费,不能被组内多个消费者消费。但是1个消费者组的消费者可以消费多个Partition的数据
- 消费者组内消费者的数量和Partition的关系,例如有3个Partition
- 1个消费者:该消费者消费所有Partition
- 2个消费者:1个消费者消费2个Partition,1个消费者消费1个Partition
- 4个消费者:3个消费者消费3个partition,1个消费者空闲
- 最优的设计就是消费者组下的消费者数量等于分区数量,效率最高
- 消费者组之间是相互独立的,互不影响
-
Topic
- 消息的主题
- 可以理解为消息的分类
- 在每个Broker上可以创建多个topic
- 用于建立生产者、消费者的订阅关系
-
Partition
- 消息分区
- 是实现横向扩展和高并发的重要设计
- 每个topic有1个或多个分区,每个分区是一个有序的队列,分区才是真正的存放消息的地方
- kafka会把topic中的消息均匀的分布在所有的分区,每个分区存放的消息是不一样的。分区可以分布在不同的服务器上,也就是说, 1个topic可以横跨多个服务器,当topic中的消息越来越多,我们可以增加服务器也就是增加新的分区来实现横向扩展
-
Replication
- 副本
- 是消息分区的备份
- 是kafka实现故障转移,保证高可用的重要设计
- 每个分区可以有1个或多个副本,副本数量要<=集群中broker的数量
- 副本有两种类型:
- leader :每个分区只有1个,负责处理读写请求
- follower :每个分区有>=0个,不处理客户端的请求,只做备份,所有的follower都会从leader同步消息,保持与leader消息的一致。如果leader发生故障,其中的1个follower会被选举为新的leader
-
Offset
- 偏移量
- 消息在parttion中的位置称为偏移量,是一个从0开始的整数
- parttion中每新增1个新的消息offset就会递增1,如:1个parttion中,第1条消息的offset=0,第2条消息的offset=1
- 每个消费者在消费信息后需要提交offset,以此来确定自己消费的进度。可以自动提交也可以手动提交