很多人第一次学 Kafka:
一上来:
就看到:
txt
Broker
Partition
Offset
Consumer Group
直接懵。
其实:
Kafka 最开始:
你只需要理解:
txt
发消息
收消息
就够了。
别一开始:
研究底层。
一、Kafka 到底是什么
一句话:
txt
Kafka = 存消息的地方
你可以理解成:
txt
高级版消息队列
二、消息是什么
例如:
用户下单。
订单系统:
可以发送一条消息:
txt
用户下单成功
Kafka:
负责:
txt
保存这条消息
然后:
别的程序:
再去读取。
三、Kafka 最核心流程(必须理解)
Kafka:
本质:
就三步。
1. 生产者发消息
txt
Producer
2. Kafka 存消息
txt
Topic
3. 消费者读消息
txt
Consumer
四、先理解 Topic(最重要)
Kafka 里面:
消息必须放到:
txt
Topic
里面。
五、Topic 是什么
你可以理解成:
txt
消息分类
例如:
txt
订单消息
用户消息
日志消息
分别:
放不同 Topic。
六、最简单类比
你可以理解成:
QQ 群
txt
Topic = 群聊
发消息的人
txt
Producer
看消息的人
txt
Consumer
七、Kafka 最基础流程图
txt
生产者
↓
发送消息
↓
Kafka Topic
↓
消费者读取
八、Kafka 第一步:启动 Kafka
现在:
一般:
都用 Docker。
九、Docker 启动 Kafka(最简单)
先拉镜像:
bash
docker pull bitnami/kafka
十、启动 Kafka
bash
docker run -d \
--name kafka \
-p 9092:9092 \
-e KAFKA_CFG_NODE_ID=1 \
-e KAFKA_CFG_PROCESS_ROLES=broker,controller \
-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
bitnami/kafka
十一、9092 是什么
Kafka 默认端口:
txt
9092
以后:
Go 程序:
就连接:
txt
localhost:9092
十二、创建 Topic
Kafka:
必须先有 Topic。
创建 order-topic
bash
docker exec -it kafka kafka-topics.sh \
--create \
--topic order-topic \
--bootstrap-server localhost:9092
十三、查看 Topic
bash
docker exec -it kafka kafka-topics.sh \
--list \
--bootstrap-server localhost:9092
如果看到:
txt
order-topic
说明成功。
十四、发送消息(最重要)
现在:
开始发消息。
开启生产者
bash
docker exec -it kafka kafka-console-producer.sh \
--topic order-topic \
--bootstrap-server localhost:9092
十五、现在发生了什么
你已经进入:
txt
Kafka消息输入模式
终端:
会卡住。
这是正常的。
十六、输入消息
例如:
txt
hello
回车。
再输入:
txt
world
十七、这些消息去哪了
Kafka:
已经:
txt
保存起来了
存进:
txt
order-topic
十八、读取消息(消费者)
现在:
再开一个终端。
启动消费者
bash
docker exec -it kafka kafka-console-consumer.sh \
--topic order-topic \
--from-beginning \
--bootstrap-server localhost:9092
十九、会看到什么
你刚刚发送的:
txt
hello
world
都会打印出来。
二十、完整流程(你现在已经跑通了)
txt
生产者
↓
hello
↓
Kafka Topic
↓
消费者
↓
读取hello
这就是:
Kafka 最基础用法。
二十一、Kafka 最核心理解
Kafka:
本质:
就是:
txt
生产者写消息
消费者读消息
二十二、Go 操作 Kafka(重点)
真正开发:
不会手敲命令。
而是:
txt
Go代码操作Kafka
二十三、安装 Kafka Go 库
bash
go get github.com/segmentio/kafka-go
二十四、Go 发送消息(生产者)
示例
go
package main
import (
"context"
"github.com/segmentio/kafka-go"
)
func main() {
// 创建 writer(生产者)
w := kafka.NewWriter(kafka.WriterConfig{
Brokers: []string{"localhost:9092"},
Topic: "order-topic",
})
// 发消息
w.WriteMessages(context.Background(),
kafka.Message{
Value: []byte("hello kafka"),
},
)
}
二十五、代码详细解析
NewWriter
go
kafka.NewWriter()
表示:
txt
创建Kafka生产者
Brokers
go
Brokers: []string{"localhost:9092"}
Kafka 地址。
Topic
go
Topic: "order-topic"
消息发到哪个 Topic。
WriteMessages
go
w.WriteMessages()
真正发送消息。
Value
go
Value: []byte("hello kafka")
消息内容。
二十六、Kafka 为什么用 []byte
因为:
Kafka:
底层:
只认识:
txt
二进制数据
所以:
字符串:
必须:
go
[]byte(...)
转换。
二十七、Go 读取消息(消费者)
示例
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))
}
}
二十八、代码解析
NewReader
go
kafka.NewReader()
创建消费者。
GroupID
go
GroupID: "g1"
消费者组。
现在:
先不用深究。
你可以简单理解:
txt
消费者编号
ReadMessage
go
r.ReadMessage()
从 Kafka 读取消息。
msg.Value
go
msg.Value
消息内容。
二十九、为什么消费者一直 for
因为:
Kafka:
消息:
会不断产生。
所以:
消费者:
通常:
txt
一直监听
三十、现在你已经掌握了 Kafka 最核心用法
你已经会:
创建 Topic
bash
kafka-topics.sh
发消息
bash
kafka-console-producer.sh
或者:
go
WriteMessages()
收消息
bash
kafka-console-consumer.sh
或者:
go
ReadMessage()
三十一、真实项目里的 Kafka
真实开发:
最经典:
就是:
用户下单
订单服务:
txt
发Kafka消息
其他服务
消费:
- 库存
- 短信
- 邮件
- 推荐系统
三十二、最后一句总结(必须记住)
Kafka 最核心:
txt
Producer 发消息
↓
Topic 存消息
↓
Consumer 读消息
你现在:
最重要先会:
txt
发
收
别一开始:
研究:
txt
Partition
Offset
副本机制
容易直接崩。