【Kafka】快速入门

参考视频: 【30分钟Kafka光速入门,2025年新版Kafka4.0.0教程!】

最后两部分待更新 (っ °Д °;)っ

安装配置 Docker实操

Kafka主要是为服务端Linux环境设计的,建议在Linux系统上安装和使用。这里使用 Docker 安装。

bash 复制代码
# docker + pull + 镜像名称和版本号
docker pull apache/kafka:4.0.0
# 查看本地 docker 镜像的列表
docker images
# 启动容器 -d 表示让容器在后台运行  
# --name 表示容器名字为 kafka 
# -p 表示将 容器的9092端口映射到主机的9092端口  比如 9192:9092 就是将容器的9092端口映射到主机的9192端口
docker run -d --name kafka -p 9092:9092 apache/kafka:4.0.0
# 查看正在运行的容器列表
docker ps
# 进入容器 docker exec 命令
# -it 表示以交互模式运行
# kafka 是容器名称或ID
# bash 表示进入容器后启动bash终端
docker exec -it kafka bash

进入bash之后

kafka的安装目录在 根目录下的 opt/kafka/ 中

创建和管理主题

用来管理kafka主题的脚本:bin目录下的 kafka topics脚本

bash 复制代码
	ls bin

这个脚本能够完成创建、修改、删除主题

bash 复制代码
# --bootstrap-server 表示连接到kafka服务的地址 这里连接本地
# 在容器内也是localhost:9092,因为容器内的localhost:9092直接指向kafka容器自身的9092
# --list 表示列出所有的主题
bin/kafka-topics --bootstrap-server localhost:9092 --list
# 如果是在docker内,要改成.sh脚本,由于我在docker中使用,所以后续代码中全是.sh
bin/kafka-topics.sh --bootstrap-server localhost:9092 --list

创建主题

还没有创建主题时,返回结果为空

bash 复制代码
# 创建主题 
# --create --topic + 创建的主题名称
bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic my-topic

查看主题的详细信息

bash 复制代码
bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe

tips: 在命令后面加 反斜杠 可以分行输入

但是尝试了一下因为换行 \后面打了空格会导致命令拼接

修改主题

修改分区数,保留时间等。

默认情况下kafka消息会保留7天。

查看配置
bash 复制代码
bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe
修改配置
bash 复制代码
# 把保留时间改为10s
bin/kafka-configs.sh \
	--bootstrap-server localhost:9092 \		# 服务器地址参数
	--entity-type topics \			# 表示要修改的是主题的配置
	--entity-name my-topic \		# 表示要修改的主题的名称
	--alter \ 表示要修改配置
	--add-config retention.ms=10000	

删除主题

bash 复制代码
# 用delete关键字
bin/kafka-topics --bootstrap-server localhost:9092 --delete --topic my-topic

发送和接收消息

脚本用来发送消息到指定的kafka主题

发送消息 producer 脚本

bash 复制代码
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic my-topic
# 回车后可以开始输入事件数据
# 每输入一行数据会作为一条消息
# 发送到指定的topic中
# 输入完成后使用 ctrl+C 来退出

接收消息 consumer 脚本

bash 复制代码
# --from-beginning 表示从主题的开头开始读取消息
# 不加会从上次消费的位置开始读取
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-topic

此时在生产者中加入新的消息,消费者会实时显示,实现实时消息传递

GUI 工具介绍

offset Explorer 工具

在代码中使用kafka

使用 kafkaJs

前置步骤
bash 复制代码
mkdir kafka-js-demo
cd kafka-js-demo
# 使用 pnpm 包管理器下载 kafkajs
# pnpm 是包管理器 也可以用npm等
pnpm init
pnpm install kafkajs
# 在vscode中打开
code . 
第一个例子

生产者代码 preducer.js

js 复制代码
// kafka producer example
const {Kafka} = require('kafkajs');

// 创建 kafka 客户端参数
const kafka = new Kafka({
    clientId: 'my-producer',    // 客户端唯一标识
    brokers: ['localhost:9092'] // broker地址列表 集群环境可写多个,用逗号分离
});

// 创建生产者实例
const producer = kafka.producer();

// 创建一个发送消息的函数
async function sendMessage(topic, message){
    try {
        await producer.connect();
        console.log('Producer connected');

        const result = await producer.send({
            topic: topic,
            messages:[
                {value:message}
            ]
        });
        console.log('Message sent successfully:', result);
    }catch (error) {
        console.error('Error sending message:', error);
    }finally {
        await producer.disconnect();
        console.log('Producer disconnected')
    }
}

sendMessage("my-topic", "Hello, Kafka!");   // 第一个参数是主题名称,第二个参数是消息内容

在终端执行

bash 复制代码
node producer.js

返回 生产者创建成功

bash 复制代码
Producer connected
Message sent successfully: [
  {
    topicName: 'my-topic',
    partition: 0,
    errorCode: 0,
    baseOffset: '11',
    logAppendTime: '-1',
    logStartOffset: '11'
  }
]
Producer disconnected

消费者代码 consumer.js

js 复制代码
// kafka consumer example
const {Kafka} = require('kafkajs');

const kafka = new Kafka({
    clientId: 'my-consumer',
    brokers: ['localhost:9092'],
});

const consumer = kafka.consumer({ groupId: 'my-group' });

async function consumeMessages(topic){
    try {
        await consumer.connect();
        console.log('Consumer connected');

        await consumer.subscribe({ topic: topic, fromBeginning: true });
        console.log(`Subscribed to topic: ${topic}`);

        await consumer.run({
            eachMessage: async ({ topic, partition, message }) => {
                console.log(`Received message: ${message.value.toString()} from topic: ${topic}`);
            },
        });
    }catch (error) {
        console.error('Error consuming messages:', error);
    }
}

consumeMessages('my-topic');

同样运行,能够看到生产者发送的 Hello, Kafka!

相关推荐
future02102 小时前
Kafka再平衡:从救火到优雅控场
学习·kafka
Coder_Boy_2 小时前
分布式系统“三高”与数据一致性核心实践(基于实操梳理)
java·jvm·spring boot·分布式·微服务·性能优化
SoleMotive.2 小时前
rabbitmq消息堆积怎么处理?
分布式·rabbitmq
SMF191913 小时前
【分布式文件存储系统Minio】使用Docker快速搭建 MinIO文件存储服务以及JAVA
分布式
2401_8480097214 小时前
rabbitmq的高级知识-ttl与死信队列
分布式·rabbitmq·java-rabbitmq
wangjinxun15 小时前
LLM Xinference 安装使用(支持CPU、Metal、CUDA推理和分布式部署)
分布式
你这个代码我看不懂17 小时前
POD重启问题排查
分布式
indexsunny19 小时前
互联网大厂Java面试实录:从Spring Boot到微服务架构的深度剖析
java·spring boot·redis·kafka·microservices·互联网大厂·面试经验