kafka
大约 2 分钟languagejava
概述
可以理解为是消息中间件,类似 RabbitMQ 和 RocketMQ
安装部署
下面安装方法在 2025年11月8日 在自己的虚拟机 ubuntu24server 上测试成功
# 安装 docker-compose
sudo apt install docker-compose-plugin
# 验证安装 docker-compose 成功
docker compose version
# 创建目录
sudo mkidr /home/chanchaw/kafk4.1.0
# 创建 docker-compose 使用到的配置文件
sudo vim docker-compose.yml
# 填写如下内容
version: '3.8'
services:
kafka:
image: apache/kafka:4.1.0
container_name: kafka
restart: always # 关键配置:总是自动重启
ports:
- "9092:9092"
environment:
# KRaft 模式必需配置
KAFKA_KRAFT_MODE: "true"
KAFKA_PROCESS_ROLES: "broker,controller"
KAFKA_NODE_ID: "1"
KAFKA_CLUSTER_ID: "2g0iVAaKR2WwmtK5_L321g"
# 控制器配置
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka:9093"
# 监听器配置
KAFKA_LISTENERS: "PLAINTEXT://:9092,CONTROLLER://:9093"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://192.168.0.123:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
# 存储配置
KAFKA_LOG_DIRS: "/tmp/kraft-combined-logs"
# 其他配置
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1"
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: "1"
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: "1"
volumes:
- ./kafka_data:/tmp/kraft-combined-logs
# 上面配置文件最后一行表示将运行日志映射到宿主机的目录 /home/chanchaw/kafk4.1.0/kafka_data 下
# 前提是配置文件在 /home/chanchaw/kafk4.1.0/ 下,即该配置文件和 kafka_data 处于同一目录下
# 注意上面配置文件 KAFKA_ADVERTISED_LISTENERS 后面填写 docker 宿主机的IP地址
# 创建 kafka 运行中文件保存到宿主机的目录
sudo mkdir -p /home/chanchaw/kafk4.1.0/kafka_data
# 设置新建目录的权限
sudo chown -R 1000:1000 /home/chanchaw/kafk4.1.0/kafka_data
# 如果之前通过 docker-compose 创建过容器,先删除
sudo docker compose down -v
# 创建容器并运行
sudo docker compose up -d
# 查看容器是否启动成功,看到有名称为 kafka 的容器即表示成功
sudo docker ps
概念
消息队列
类似 RabbitMQ 和 RocketMQ 有微服务作为生产者生产消息,也有微服务作为消费者消费消息。
Topic
为消息分类,新订单 作为一个独立的 topic,已付款 可以作为另外一个独立的 topic
Partition
每个主题 Topic 可以有任意个分区即 partition,kafka 可以保证每个分区的消息是有序的,但是一个 topic 内的多个 partition 是无序的,需要开发者自己控制
Broker
一个 broker 是一个服务器,一个 broker 可以有多个 topic 和多个 partition,一个 partition 可以在 Broker1 作为 Leader ,在 Broker2 和 Broker3 作为 Follower,后者作为前者的备份,即 Leader 负责对外进行读写请求,Follower 复制前者的数据作为备份。
ConsumerGroup
多个消费者构成一个 ConsumerGroup,一个消息只能被一个 ConsumerGroup 中的一个消费者消费,但是可以被多个 ConsumeGroup 消费。
