初识
Apache Kafka 是一款开源的消息引擎系统。
根据维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。即系统 A 发送消息给消息引擎系统,系统 B 从消息引擎系统中读取 A 发送的消息。
思考:为什么需要引入消息引擎系统呢?为何系统A不直接将消息发送给系统B呢?
1. 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
2. 解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
3. 冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
4. 健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
5. 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
术语
工欲善其事必先利其器,我们先了解一下在Kafka世界中的常用术语
- 发布订阅的对象是主题(Topic),可以为每个业务、每个应用甚至是每类数据都创建专属的主题
- 向Topic发布消息的客户端应用程序称为生产者(Producer),生产者程序通常持续不断地向一个或多个主题发送消息
- 订阅这些Topic的客户端应用程序就被称为消费者(Consumer),消费者也可以同时订阅一个或者多个Topic
- 生产者和消费者在Kafka中统称为客户端,Kafka中的服务端是由一系列的被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。
- 副本机制(Replication):领导者副本(Leader Replica)和追随者副本(Follower Replica)。前者对外提供服务,这里的对外指的是与客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互。
- 分区(Partitioning):Kafka将每个主题划分成多个Partition,每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区 0 中,要么在分区 1 中。上面所提到的副本机制,是在分区这一层级上进行定义的,即每个分区有领导者副本与追随者副本。客户端程序只能与分区的领导者副本进行交互。
- 消息位移(Offset):生产者向分区写入消息,位移表示每条消息在分区中的位置信息。
- 消费者组(Consumer Group):指的是多个消费者实例共同组成一个组来消费一组主题。这组主题中的每个分区都只会被组内的一个消费者实例消费,其他消费者实例不能消费它。一个分区只能给消费者组内的一个消费者进行消费,而一个消费者可以消费多个分区。
- 重平衡(Rebalance):消费者组内如果加入一个消费者,或者退出一个消费者,将会发生重平衡操作,这个操作的主要目的就是为了给消费者内的消费者重新分配他们所要消费哪些分区。
Kafka 的三层消息架构
- 第一层是主题层,每个主题可以配置 M 个分区,而每个分区又可以配置 N 个副本
- 第二层是分区层,每个分区的 N 个副本中只能有一个充当领导者角色,对外提供服务;其他 N-1 个副本是追随者副本,只是提供数据冗余之用
- 第三层是消息层,分区中包含若干条消息,每条消息的位移从 0 开始,依次递增。