Kafka全面解析:分布式消息系统的核心原理与架构
-
- 引言
- 一、Kafka核心概念
-
- 1.1 你的理解验证
- 1.2 Kafka架构总览
- 二、Kafka核心组件详解
-
- 2.1 Topic(主题)
- 2.2 Producer(生产者)
- 2.3 Consumer(消费者)
- 2.4 Broker(代理服务器)
- 三、Kafka与JMS的对比
-
- 3.1 设计理念差异
- 3.2 架构对比图
- 四、ZooKeeper在Kafka中的作用
-
- 4.1 元数据管理
- 4.2 Controller选举
- 五、Kafka的消息存储机制
-
- 5.1 磁盘存储结构
- 5.2 日志清理策略
- 六、Kafka的高可用机制
-
- 6.1 副本机制
- 6.2 ISR机制
- 七、Kafka与RabbitMQ对比
- 八、总结
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
引言
Kafka是Apache基金会下的开源分布式消息系统,由LinkedIn公司开发,使用Scala语言编写。它以其高吞吐、可持久化、分布式等特性,成为大数据领域事实标准的消息中间件。本文将深入解析Kafka的核心概念、架构设计及其与JMS的区别。
一、Kafka核心概念
1.1 你的理解验证
“开源消息系统,由scala写成。Kafka是一个分布式消息队列:生产者、消费者的功能,他提供类似于JMS的特性,但是设计上完全不同,此外它并不是JMS规范的实现。Kafka对消息保存根据Topic进行归类,Producer生产者为发送消息,接收消息为Consumer消费者,Kafka集群有多个Kafka实例组成,每个实例为broker。Kafka所有组件都依赖于Zookeeper集群保存一些元数据信息,来保证系统可用性。”
✅ 非常准确! 你精准地概括了Kafka的核心要点:
- 语言:Scala编写
- 本质:分布式消息队列
- 与JMS关系:类似但不同,不是JMS实现
- 核心概念:Topic、Producer、Consumer、Broker
- 依赖:ZooKeeper管理元数据
1.2 Kafka架构总览
#mermaid-svg-zgpxTZATgpEbON4f{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zgpxTZATgpEbON4f .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zgpxTZATgpEbON4f .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zgpxTZATgpEbON4f .error-icon{fill:#552222;}#mermaid-svg-zgpxTZATgpEbON4f .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zgpxTZATgpEbON4f .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zgpxTZATgpEbON4f .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zgpxTZATgpEbON4f .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zgpxTZATgpEbON4f .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zgpxTZATgpEbON4f .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zgpxTZATgpEbON4f .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zgpxTZATgpEbON4f .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zgpxTZATgpEbON4f .marker.cross{stroke:#333333;}#mermaid-svg-zgpxTZATgpEbON4f svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zgpxTZATgpEbON4f p{margin:0;}#mermaid-svg-zgpxTZATgpEbON4f .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-zgpxTZATgpEbON4f .cluster-label text{fill:#333;}#mermaid-svg-zgpxTZATgpEbON4f .cluster-label span{color:#333;}#mermaid-svg-zgpxTZATgpEbON4f .cluster-label span p{background-color:transparent;}#mermaid-svg-zgpxTZATgpEbON4f .label text,#mermaid-svg-zgpxTZATgpEbON4f span{fill:#333;color:#333;}#mermaid-svg-zgpxTZATgpEbON4f .node rect,#mermaid-svg-zgpxTZATgpEbON4f .node circle,#mermaid-svg-zgpxTZATgpEbON4f .node ellipse,#mermaid-svg-zgpxTZATgpEbON4f .node polygon,#mermaid-svg-zgpxTZATgpEbON4f .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zgpxTZATgpEbON4f .rough-node .label text,#mermaid-svg-zgpxTZATgpEbON4f .node .label text,#mermaid-svg-zgpxTZATgpEbON4f .image-shape .label,#mermaid-svg-zgpxTZATgpEbON4f .icon-shape .label{text-anchor:middle;}#mermaid-svg-zgpxTZATgpEbON4f .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zgpxTZATgpEbON4f .rough-node .label,#mermaid-svg-zgpxTZATgpEbON4f .node .label,#mermaid-svg-zgpxTZATgpEbON4f .image-shape .label,#mermaid-svg-zgpxTZATgpEbON4f .icon-shape .label{text-align:center;}#mermaid-svg-zgpxTZATgpEbON4f .node.clickable{cursor:pointer;}#mermaid-svg-zgpxTZATgpEbON4f .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zgpxTZATgpEbON4f .arrowheadPath{fill:#333333;}#mermaid-svg-zgpxTZATgpEbON4f .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zgpxTZATgpEbON4f .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zgpxTZATgpEbON4f .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zgpxTZATgpEbON4f .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zgpxTZATgpEbON4f .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zgpxTZATgpEbON4f .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zgpxTZATgpEbON4f .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zgpxTZATgpEbON4f .cluster text{fill:#333;}#mermaid-svg-zgpxTZATgpEbON4f .cluster span{color:#333;}#mermaid-svg-zgpxTZATgpEbON4f div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zgpxTZATgpEbON4f .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zgpxTZATgpEbON4f rect.text{fill:none;stroke-width:0;}#mermaid-svg-zgpxTZATgpEbON4f .icon-shape,#mermaid-svg-zgpxTZATgpEbON4f .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zgpxTZATgpEbON4f .icon-shape p,#mermaid-svg-zgpxTZATgpEbON4f .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zgpxTZATgpEbON4f .icon-shape rect,#mermaid-svg-zgpxTZATgpEbON4f .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zgpxTZATgpEbON4f .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zgpxTZATgpEbON4f .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zgpxTZATgpEbON4f :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Kafka集群
Broker集群
发送消息
发送消息
消费
消费
消费
管理
管理
管理
Broker 1
Producer 1
Producer 2
Broker 2
Consumer 1
Consumer 2
Broker 3
Consumer 3
ZooKeeper集群元数据管理
二、Kafka核心组件详解
2.1 Topic(主题)
Topic是Kafka中消息的逻辑分类,类似于数据库中的表。
public class TopicExample {
// 创建Topic
/*
命令:kafka-topics.sh –create \\
–zookeeper localhost:2181 \\
–replication-factor 3 \\
–partitions 6 \\
–topic orders
参数说明:
–replication-factor: 副本数,保证高可用
–partitions: 分区数,决定并行度
*/
// Topic在磁盘上的存储结构
/*
/data/kafka/
├── orders-0/ # 分区0
│ ├── 00000000000000000000.log
│ ├── 00000000000000000000.index
│ └── 00000000000000000000.timeindex
├── orders-1/ # 分区1
│ ├── 00000000000000000000.log
│ └── 00000000000000000000.index
└── orders-2/ # 分区2
├── 00000000000000000000.log
└── 00000000000000000000.index
*/
}
2.2 Producer(生产者)
Producer负责发布消息到指定的Topic。
public class KafkaProducerExample {
public static void main(String[] args) {
Properties props = new Properties();
// 配置Kafka集群地址
props.put("bootstrap.servers", "broker1:9092,broker2:9092");
// 序列化器
props.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
// 可靠性配置
props.put("acks", "all"); // 所有副本确认
props.put("retries", 3); // 重试次数
props.put("enable.idempotence", true); // 启用幂等性
KafkaProducer<String, String> producer =
new KafkaProducer<>(props);
// 发送消息
for (int i = 0; i < 100; i++) {
ProducerRecord<String, String> record =
new ProducerRecord<>("orders",
"key-" + i, "value-" + i);
producer.send(record, new Callback() {
public void onCompletion(RecordMetadata metadata, Exception e) {
if (e == null) {
System.out.printf("消息发送成功: partition=%d, offset=%d%n",
metadata.partition(), metadata.offset());
} else {
e.printStackTrace();
}
}
});
}
producer.close();
}
}
2.3 Consumer(消费者)
Consumer负责订阅和处理消息。
public class KafkaConsumerExample {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "broker1:9092,broker2:9092");
props.put("group.id", "order-consumer-group"); // 消费者组
// 反序列化器
props.put("key.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
// 消费偏移量配置
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("auto.offset.reset", "earliest"); // 从最早开始消费
KafkaConsumer<String, String> consumer =
new KafkaConsumer<>(props);
// 订阅主题
consumer.subscribe(Arrays.asList("orders"));
try {
while (true) {
ConsumerRecords<String, String> records =
consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.printf("partition=%d, offset=%d, key=%s, value=%s%n",
record.partition(), record.offset(),
record.key(), record.value());
// 业务处理
processOrder(record.value());
}
}
} finally {
consumer.close();
}
}
}
2.4 Broker(代理服务器)
Broker是Kafka集群中的单个服务实例,负责消息的存储和转发。
public class BrokerConfig {
// server.properties配置
/*
broker.id=1 # Broker唯一ID
listeners=PLAINTEXT://host:9092 # 监听地址
log.dirs=/data/kafka/logs # 日志存储目录
num.partitions=3 # 默认分区数
default.replication.factor=2 # 默认副本数
# 日志保留策略
log.retention.hours=168 # 保留7天
log.segment.bytes=1073741824 # 单个日志文件大小(1GB)
log.retention.check.interval.ms=300000 # 检查间隔5分钟
*/
// Broker的角色
// 1. 消息存储:持久化消息到磁盘
// 2. 消息复制:Leader-Follower机制
// 3. 元数据管理:通过ZooKeeper
}
三、Kafka与JMS的对比
3.1 设计理念差异
| 设计目标 | 高吞吐、日志处理 | 可靠消息传递 |
| 消息模型 | 发布-订阅 | 点对点、发布订阅 |
| 消息存储 | 磁盘顺序写入 | 内存/数据库 |
| 消费方式 | Consumer主动Pull | Broker主动Push |
| 消息确认 | 偏移量管理 | ACK机制 |
| 顺序保证 | 分区内有序 | 队列有序 |
| 性能 | 百万级/秒 | 万级/秒 |
3.2 架构对比图
#mermaid-svg-le4fRI4TQ2kmt58F{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-le4fRI4TQ2kmt58F .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-le4fRI4TQ2kmt58F .error-icon{fill:#552222;}#mermaid-svg-le4fRI4TQ2kmt58F .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-le4fRI4TQ2kmt58F .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-le4fRI4TQ2kmt58F .marker{fill:#333333;stroke:#333333;}#mermaid-svg-le4fRI4TQ2kmt58F .marker.cross{stroke:#333333;}#mermaid-svg-le4fRI4TQ2kmt58F svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-le4fRI4TQ2kmt58F p{margin:0;}#mermaid-svg-le4fRI4TQ2kmt58F .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-le4fRI4TQ2kmt58F .cluster-label text{fill:#333;}#mermaid-svg-le4fRI4TQ2kmt58F .cluster-label span{color:#333;}#mermaid-svg-le4fRI4TQ2kmt58F .cluster-label span p{background-color:transparent;}#mermaid-svg-le4fRI4TQ2kmt58F .label text,#mermaid-svg-le4fRI4TQ2kmt58F span{fill:#333;color:#333;}#mermaid-svg-le4fRI4TQ2kmt58F .node rect,#mermaid-svg-le4fRI4TQ2kmt58F .node circle,#mermaid-svg-le4fRI4TQ2kmt58F .node ellipse,#mermaid-svg-le4fRI4TQ2kmt58F .node polygon,#mermaid-svg-le4fRI4TQ2kmt58F .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-le4fRI4TQ2kmt58F .rough-node .label text,#mermaid-svg-le4fRI4TQ2kmt58F .node .label text,#mermaid-svg-le4fRI4TQ2kmt58F .image-shape .label,#mermaid-svg-le4fRI4TQ2kmt58F .icon-shape .label{text-anchor:middle;}#mermaid-svg-le4fRI4TQ2kmt58F .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-le4fRI4TQ2kmt58F .rough-node .label,#mermaid-svg-le4fRI4TQ2kmt58F .node .label,#mermaid-svg-le4fRI4TQ2kmt58F .image-shape .label,#mermaid-svg-le4fRI4TQ2kmt58F .icon-shape .label{text-align:center;}#mermaid-svg-le4fRI4TQ2kmt58F .node.clickable{cursor:pointer;}#mermaid-svg-le4fRI4TQ2kmt58F .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-le4fRI4TQ2kmt58F .arrowheadPath{fill:#333333;}#mermaid-svg-le4fRI4TQ2kmt58F .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-le4fRI4TQ2kmt58F .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-le4fRI4TQ2kmt58F .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-le4fRI4TQ2kmt58F .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-le4fRI4TQ2kmt58F .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-le4fRI4TQ2kmt58F .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-le4fRI4TQ2kmt58F .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-le4fRI4TQ2kmt58F .cluster text{fill:#333;}#mermaid-svg-le4fRI4TQ2kmt58F .cluster span{color:#333;}#mermaid-svg-le4fRI4TQ2kmt58F div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-le4fRI4TQ2kmt58F .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-le4fRI4TQ2kmt58F rect.text{fill:none;stroke-width:0;}#mermaid-svg-le4fRI4TQ2kmt58F .icon-shape,#mermaid-svg-le4fRI4TQ2kmt58F .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-le4fRI4TQ2kmt58F .icon-shape p,#mermaid-svg-le4fRI4TQ2kmt58F .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-le4fRI4TQ2kmt58F .icon-shape rect,#mermaid-svg-le4fRI4TQ2kmt58F .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-le4fRI4TQ2kmt58F .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-le4fRI4TQ2kmt58F .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-le4fRI4TQ2kmt58F :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
JMS架构
Push模式
推送
Producer
Broker
Consumer
Broker管理消费状态
Kafka架构
Pull模式
拉取
Producer
Broker
Consumer
Consumer自己管理偏移量
四、ZooKeeper在Kafka中的作用
4.1 元数据管理
public class ZookeeperInKafka {
// ZooKeeper存储的Kafka元数据
/*
/kafka
├── brokers
│ ├── ids
│ │ ├── 0 -> {"host":"broker1","port":9092}
│ │ ├── 1 -> {"host":"broker2","port":9092}
│ │ └── 2 -> {"host":"broker3","port":9092}
│ └── topics
│ ├── orders
│ │ ├── partitions
│ │ │ ├── 0
│ │ │ │ └── state
│ │ │ └── 1
│ │ │ └── state
│ │ └── users
├── consumers
│ ├── group1
│ │ ├── offsets
│ │ │ ├── orders-0
│ │ │ └── orders-1
│ └── group2
└── controller
└── controller_epoch
*/
// ZooKeeper的作用
// 1. Broker注册与发现
// 2. Topic元数据存储
// 3. 消费者组管理
// 4. Leader选举
// 5. 集群成员管理
}
4.2 Controller选举
/**
* Kafka Controller的Leader选举
*/
public class ControllerElection {
// 第一个启动的Broker会成为Controller
// 负责:
// 1. 分区Leader选举
// 2. 分区重新分配
// 3. Broker成员管理
// 当Controller宕机时,其他Broker通过ZooKeeper竞选
/*
1. 所有Broker监听 /controller节点
2. Controller宕机,/controller节点消失
3. Broker尝试创建/controller节点
4. 第一个成功的成为新Controller
*/
}
五、Kafka的消息存储机制
5.1 磁盘存储结构
public class KafkaStorage {
// 消息存储格式
/*
MessageSet (消息集合)
├── Message 1
│ ├── offset: 8字节
│ ├── size: 4字节
│ ├── crc: 4字节
│ ├── magic: 1字节
│ ├── attributes: 1字节
│ ├── timestamp: 8字节
│ ├── key length: 4字节
│ ├── key: 变长
│ ├── value length: 4字节
│ └── value: 变长
├── Message 2
└── …
*/
// 索引文件
/*
索引文件存储 (相对offset -> 物理位置)
(1000, 2048) // offset 1000在文件位置2048
(2000, 4096) // offset 2000在文件位置4096
(3000, 6144) // offset 3000在文件位置6144
*/
}
5.2 日志清理策略
public class LogCleaner {
// 两种清理策略
// 1. delete: 删除过期日志
/*
log.cleanup.policy=delete
log.retention.hours=168 # 保留7天
log.retention.bytes=-1 # 大小不限
*/
// 2. compact: 保留每个key的最新值
/*
log.cleanup.policy=compact
适用于:用户信息、配置等需要保留最新值的场景
输入:
key1:value1@t1
key1:value2@t2
key2:value3@t3
compact后:
key1:value2@t2
key2:value3@t3
*/
}
六、Kafka的高可用机制
6.1 副本机制
#mermaid-svg-ejV4DNttzIWNZ2AP{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ejV4DNttzIWNZ2AP .error-icon{fill:#552222;}#mermaid-svg-ejV4DNttzIWNZ2AP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ejV4DNttzIWNZ2AP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ejV4DNttzIWNZ2AP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ejV4DNttzIWNZ2AP .marker.cross{stroke:#333333;}#mermaid-svg-ejV4DNttzIWNZ2AP svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ejV4DNttzIWNZ2AP p{margin:0;}#mermaid-svg-ejV4DNttzIWNZ2AP .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP .cluster-label text{fill:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP .cluster-label span{color:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP .cluster-label span p{background-color:transparent;}#mermaid-svg-ejV4DNttzIWNZ2AP .label text,#mermaid-svg-ejV4DNttzIWNZ2AP span{fill:#333;color:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP .node rect,#mermaid-svg-ejV4DNttzIWNZ2AP .node circle,#mermaid-svg-ejV4DNttzIWNZ2AP .node ellipse,#mermaid-svg-ejV4DNttzIWNZ2AP .node polygon,#mermaid-svg-ejV4DNttzIWNZ2AP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ejV4DNttzIWNZ2AP .rough-node .label text,#mermaid-svg-ejV4DNttzIWNZ2AP .node .label text,#mermaid-svg-ejV4DNttzIWNZ2AP .image-shape .label,#mermaid-svg-ejV4DNttzIWNZ2AP .icon-shape .label{text-anchor:middle;}#mermaid-svg-ejV4DNttzIWNZ2AP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ejV4DNttzIWNZ2AP .rough-node .label,#mermaid-svg-ejV4DNttzIWNZ2AP .node .label,#mermaid-svg-ejV4DNttzIWNZ2AP .image-shape .label,#mermaid-svg-ejV4DNttzIWNZ2AP .icon-shape .label{text-align:center;}#mermaid-svg-ejV4DNttzIWNZ2AP .node.clickable{cursor:pointer;}#mermaid-svg-ejV4DNttzIWNZ2AP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ejV4DNttzIWNZ2AP .arrowheadPath{fill:#333333;}#mermaid-svg-ejV4DNttzIWNZ2AP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ejV4DNttzIWNZ2AP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ejV4DNttzIWNZ2AP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ejV4DNttzIWNZ2AP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ejV4DNttzIWNZ2AP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ejV4DNttzIWNZ2AP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ejV4DNttzIWNZ2AP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ejV4DNttzIWNZ2AP .cluster text{fill:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP .cluster span{color:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ejV4DNttzIWNZ2AP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ejV4DNttzIWNZ2AP rect.text{fill:none;stroke-width:0;}#mermaid-svg-ejV4DNttzIWNZ2AP .icon-shape,#mermaid-svg-ejV4DNttzIWNZ2AP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ejV4DNttzIWNZ2AP .icon-shape p,#mermaid-svg-ejV4DNttzIWNZ2AP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ejV4DNttzIWNZ2AP .icon-shape rect,#mermaid-svg-ejV4DNttzIWNZ2AP .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ejV4DNttzIWNZ2AP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ejV4DNttzIWNZ2AP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ejV4DNttzIWNZ2AP :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Partition 0 副本集
写入
读取
同步
同步
Leader读写
Follower 1同步复制
Follower 2同步复制
Producer
Consumer
6.2 ISR机制
public class ISRExample {
// ISR (In-Sync Replicas) 同步副本集
// 写入一致性配置
/*
acks=0 : 不等待确认,可能丢数据
acks=1 : Leader确认,Leader宕机可能丢数据
acks=all : 所有ISR确认,最安全
*/
// min.insync.replicas 最小同步副本数
// 如果ISR数量小于此值,写入失败
}
七、Kafka与RabbitMQ对比
| 设计定位 | 分布式日志系统 | 消息代理 |
| 协议 | 自定义TCP协议 | AMQP |
| 性能 | 百万级/秒 | 万级/秒 |
| 消息存储 | 磁盘持久化 | 内存/磁盘 |
| 消费模型 | Pull | Push |
| 顺序保证 | 分区内有序 | 队列有序 |
| 典型场景 | 日志收集、流处理 | 任务队列、RPC |
八、总结
| Producer | 发布消息 | 幂等性、事务、分区策略 |
| Broker | 存储转发 | 副本机制、ISR、日志清理 |
| Consumer | 消费消息 | 消费者组、偏移量管理 |
| Topic | 消息分类 | 多分区、多副本 |
| ZooKeeper | 协调服务 | 元数据、选举、监控 |
核心要点:
一句话总结:Kafka是一个高吞吐、可持久化、分布式的消息系统,通过Topic分区、副本机制和ZooKeeper协调,实现了海量消息的可靠传输和处理。

|
🌺The End🌺点点关注,收藏不迷路🌺 |


