Kafka 概述

Kafka 的定义、消息队列应用场景、发布订阅模式和基础架构角色。

Kafka 概述

1、定义

Kafka传统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。

**发布/订阅:**消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息。

**Kafka最新定义:**Kafka是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。其名称源自作家弗朗茨·卡夫卡

你可以把系统想象成很多人要互相发消息:

订单系统
支付系统
日志系统
行为分析系统
.....

如果它们直接互相发消息:

A 崩了,B 就收不到消息
B 太忙处理不过来,消息直接丢了
耦合太高,改一个全要改

就像:所有人直接面对面喊话,吵死、乱死、还容易漏。

有了 Kafka 会怎样?

所有消息先丢给 Kafka,谁需要谁自己来取。
你可以这么记:

生产者(Producer):发消息的人(比如订单系统)
消费者(Consumer):收消息的人(比如支付、日志、数据分析)
Kafka:中间的大仓库 + 快递站

2、消息队列

目前企业中比较常见的消息队列产品主要有Kafka、ActiveMQ、RabbitMQ、RocketMQ等。

在大数据场景主 要采用Kafka作为消息队列。在JavaEE开发中主要采用ActiveMQ、RabbitMQ、RocketMQ。

2.1 传统消息队列的应用场景

传统的消息队列的主要应用场景包括:缓存/消峰、解耦和异步通信。

1. 核心角色

生产者(Producer):负责产生消息并发送到 MQ。图中的数据源(MySQL、Flume、网络端口)就是生产者。
MQ 消息队列:作为中间层,负责暂存和转发消息。图中的 queue1、queue2、queue3 是不同的消息队列,用于分类存放不同类型的消息。
消费者(Consumer):从 MQ 中拉取消息并进行处理。图中的目的地(Hadoop、SparkStreaming、Flink、SpringBoot)就是消费者。

2. 解耦的体现

在没有消息队列的情况下,每个数据源都需要和每个目的地直接对接,代码和依赖会变得非常复杂。
有了消息队列后:
生产者只关心发送:数据源(如 MySQL)只需要把数据发送到对应的队列(如 queue1),完全不用关心数据最终被谁处理。
消费者只关心消费:目的地(如 SparkStreaming)只需要从自己关心的队列(如 queue2)中拉取数据,完全不用关心数据是谁发的。
独立扩展与修改:如果需要新增一个数据源,或者替换一个目的地,只要它们遵守和 MQ 的接口约定,就不会影响到其他任何系统。
1. 同步处理(上半部分)
这是传统的 “串行等待” 模式:
用户填写注册信息并提交。
系统将注册信息写入数据库。
系统立即调用短信接口发送短信。
等待短信发送完成(大约 3 秒)后,才向用户返回 “注册成功” 的页面。
问题:
用户体验差:必须等待短信发送完成,才能看到结果,感觉 “卡顿”。
系统响应慢:整个流程被短信这个慢操作拖慢,影响并发能力。
故障影响大:如果短信接口超时或失败,整个注册流程也会失败。

2. 异步处理(下半部分)
这是引入消息队列后的 “解耦提速” 模式:
用户填写注册信息并提交。
系统将注册信息写入数据库。
系统不直接发送短信,而是把 “发送短信” 的请求写入 MQ 消息队列,然后立即返回。
用户瞬间收到 “注册成功” 的页面,体验流畅。
独立的短信服务从 MQ 队列中取出请求,慢慢处理发送短信的任务。
优势:
用户体验提升:核心流程(注册)瞬间完成,用户无需等待。
系统解耦:注册服务和短信服务互不依赖,各自独立运行。
削峰填谷:即使有大量注册请求,短信服务也可以按自己的节奏处理,不会被压垮。
故障隔离:短信服务暂时不可用,也不会影响用户注册。

2.2 消息队列的两种模式

1. 点对点模式(Point-to-Point)
核心特点:一条消息只能被一个消费者消费,消费后就从队列中删除。
流程:
生产者(Producer)将消息发送到消息队列。
消费者(Consumer)主动从队列中拉取消息。
消费者处理完消息后,向队列发送确认(Ack)。
队列收到确认后,将该消息从队列中删除。
适用场景:任务分发、订单处理等,确保每个任务只被执行一次。
------------------------
2. 发布 / 订阅模式(Publish/Subscribe)
核心特点:一条消息可以被多个订阅了对应主题(Topic)的消费者同时消费,消息不会因为被消费而删除。
流程:
生产者(Producer)将消息发布到特定的主题(Topic),比如图中的 Topic1、Topic2。
多个消费者(Consumer)订阅(Subscribe)自己感兴趣的主题。
当主题中有新消息时,所有订阅了该主题的消费者都会收到这条消息。
适用场景:日志收集、实时数据分析、用户行为通知等,允许多方同时处理同一份数据流。

3、Kafka基础架构

1)Producer

Producer:消息生产者,就是向Kafka broker发消息的客户端。

2)Consumer

Consumer:消息消费者,向Kafka broker取消息的客户端。

专门从 Kafka 里读数据、处理数据。

3)Consumer Group(CG)

多个消费者组成一个小组,一起消费消息:

  • 一个小组里,大家分工合作,每人只读一部分分区
  • 一个分区只能被组里一个消费者读
  • 不同小组之间互不干扰,可以各读各的
  • 整个小组算一个逻辑上的订阅者

4)Broker

Broker:一台Kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

5)Topic

Topic:可以理解为一个队列,生产者和消费者面向的都是一个topic。

生产者往这个 Topic 发,消费者从这个 Topic 取。

6)Partition

一个 Topic 太大了,就拆成好几段,每一段叫一个分区。

  • 分布在不同服务器上
  • 提高速度、方便扩容
  • 每个分区内部数据是按顺序排好

7)Replica

分区的备份

为了防止服务器挂掉数据丢失,每个分区都会复制好几份。

一份叫 Leader,剩下的叫 Follower。

8)Leader

主副本

所有读写都走它:

  • 生产者发给 Leader
  • 消费者从 Leader 读

9)Follower

从副本 / 备份

  • 默默从 Leader 同步数据
  • 平时不干活,只备份
  • 一旦 Leader 挂了,其中一个 Follower 会自动变成新 Leader,保证服务不中断

10)ZooKeeper(ZooKeeper 模式)

Kafka 早期集群依赖 ZooKeeper 做元数据协调。本文档中的传统安装方式使用的是 ZooKeeper 模式,因此部署 Kafka 前需要先准备 ZooKeeper 集群。

ZooKeeper 在 Kafka 中主要负责:

  • 保存 Broker 注册信息,例如 /kafka/brokers/ids
  • 保存 Topic、分区、副本、ISR 等元数据。
  • 记录当前 Controller Broker,例如 /kafka/controller
  • 通过临时节点感知 Broker 上下线。
  • 协助 Controller 完成分区 Leader 选举、ISR 变更和副本重分配。

ZooKeeper 不保存 Kafka 的消息数据。消息数据仍然写在各 Broker 的 log.dirs 目录中。