很多人第一次学 Kafka:

都会被这些名词吓到:

Broker
Topic
Partition
Offset
Consumer Group

感觉:

特别复杂。

其实:

Kafka 核心思想:

还是:

生产者发消息
消费者收消息

只是:

Kafka 为了:

高并发
高吞吐
分布式

做了很多增强。


一、Kafka 是什么

Kafka:

本质:

高性能消息队列

用于:

  • 异步通信
  • 日志收集
  • 大数据
  • 实时流处理

二、Kafka 最经典应用

例如:

用户下单。


订单服务

发送消息:

订单创建成功

Kafka

负责:

存储消息

其他服务

消费:

  • 库存
  • 短信
  • 积分
  • 推荐系统

三、Kafka 核心概念(必须掌握)

Kafka 最核心:

只有几个东西。


四、Broker(Kafka服务器)

Kafka 服务器:

叫:

Broker

你可以理解成:

Kafka 节点

五、Topic(主题)

Topic:

本质:

消息分类

例如:

order-topic
user-topic
log-topic

六、为什么需要 Topic

因为:

系统消息:

不可能:

全混在一起

所以:

需要:

分类

七、生产者(Producer)

负责:

发送消息

例如:

订单系统。


八、消费者(Consumer)

负责:

读取消息

例如:

库存系统。


九、完整流程(重点)

生产者
↓
发送消息
↓
Kafka Topic
↓
消费者读取

十、Kafka 最重要概念:Partition(分区)

Kafka:

为什么性能高?

核心就在:

Partition

十一、什么是分区

一个 Topic:

可以:

拆成多个分区

例如:

order-topic

Partition0
Partition1
Partition2

十二、为什么要分区

因为:

Kafka:

可以:

并行读写

十三、类比

例如:

食堂窗口。


一个窗口

所有人排一队

很慢。


三个窗口

三队同时处理

吞吐量暴涨。


十四、Offset(偏移量)

Kafka:

不会删除消息。

它通过:

Offset

记录:

读到哪里了

十五、Offset 本质

你可以理解成:

消息编号

例如:

0
1
2
3
4

十六、消费者读取过程

消费者:

会记录:

当前读到哪个 Offset

下次:

继续往后读。


十七、Consumer Group(消费者组)

Kafka:

支持:

多个消费者一起消费

十八、为什么需要消费者组

例如:

订单太多。

一个消费者:

处理不过来。

于是:

多个消费者一起处理

十九、规则(重点)

同一个 Partition:

同一时刻
只能被一个消费者消费

二十、为什么这样设计

为了:

保证顺序

否则:

消息顺序可能乱。


二十一、Kafka 特点(必须理解)

Kafka:

最核心特点:


1. 高吞吐

特别快。


2. 顺序写磁盘

Kafka:

不是随机写。

而是:

顺序追加

所以:

性能极高。


3. 分布式

支持:

多机器集群

4. 可持久化

消息:

会写磁盘。


二十二、Kafka 和 RabbitMQ 区别

很多人:

都会问。


RabbitMQ

特点:

功能丰富
简单
稳定
业务系统常用

Kafka

特点:

吞吐极高
适合大数据
日志流

二十三、Kafka 常见场景


日志收集

例如:

服务器日志。


用户行为分析

例如:

点击
浏览
点赞

实时推荐

例如:

抖音推荐流。


大数据

例如:

实时统计。


二十四、Kafka 常见命令(重点)


二十五、启动 Kafka

新版 Kafka:

通常:

bin/kafka-server-start.sh config/server.properties

二十六、创建 Topic

bin/kafka-topics.sh \
--create \
--topic order-topic \
--bootstrap-server localhost:9092

–topic

表示:

主题名字

二十七、查看 Topic

bin/kafka-topics.sh \
--list \
--bootstrap-server localhost:9092

二十八、发送消息(生产者)

bin/kafka-console-producer.sh \
--topic order-topic \
--bootstrap-server localhost:9092

然后:

输入:

hello

消息:

就进 Kafka 了。


二十九、消费消息(消费者)

bin/kafka-console-consumer.sh \
--topic order-topic \
--from-beginning \
--bootstrap-server localhost:9092

–from-beginning

表示:

从头开始读

三十、Go 操作 Kafka(重点)

Go:

常用库:

segmentio/kafka-go

或者:

sarama

三十一、Go 生产者示例


安装

go get github.com/segmentio/kafka-go

发送消息

package main

import (
	"context"

	"github.com/segmentio/kafka-go"
)

func main() {

	w := kafka.NewWriter(kafka.WriterConfig{
		Brokers: []string{"localhost:9092"},
		Topic:   "order-topic",
	})

	w.WriteMessages(context.Background(),
		kafka.Message{
			Value: []byte("hello kafka"),
		},
	)
}

三十二、代码解析


Brokers

Brokers: []string{"localhost:9092"}

Kafka 地址。


Topic

Topic: "order-topic"

发到哪个主题。


Value

Value: []byte("hello kafka")

消息内容。


三十三、Go 消费者示例

package main

import (
	"context"
	"fmt"

	"github.com/segmentio/kafka-go"
)

func main() {

	r := kafka.NewReader(kafka.ReaderConfig{
		Brokers: []string{"localhost:9092"},
		Topic:   "order-topic",
		GroupID: "g1",
	})

	for {

		msg, _ := r.ReadMessage(context.Background())

		fmt.Println(string(msg.Value))
	}
}

三十四、代码解析


GroupID

GroupID: "g1"

消费者组。


ReadMessage

r.ReadMessage()

读取 Kafka 消息。


三十五、Kafka 消息结构

Kafka 消息:

不仅有 Value。

还有:

Key
Value
Offset
Partition
Timestamp

三十六、Key 的作用

Key:

决定:

消息进入哪个 Partition

三十七、为什么 Key 很重要

例如:

订单消息。

希望:

同一个订单
进入同一个Partition

这样:

才能:

保证顺序

三十八、Kafka 为什么这么快(核心)

Kafka:

性能高:

核心原因:


1. 顺序写磁盘


2. 零拷贝


3. 分区并行


4. 批量发送


三十九、Kafka 真正核心思想

你一定要理解:

Kafka:

不是:

传统业务消息队列

它更偏向:

数据流平台

四十、最后总结

Kafka 本质:

高吞吐分布式消息队列

核心结构:

Producer
↓
Topic
↓
Partition
↓
Consumer Group

最核心概念:

概念 作用
Broker Kafka服务器
Topic 消息分类
Partition 分区并行
Offset 消息编号
Consumer Group 消费者组

Go 常见操作:

NewWriter → 发消息
NewReader → 收消息

Kafka 最大特点:

高吞吐
高并发
分布式
实时流处理
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐