欢迎光临
我们一直在努力

Kafka全面解析:分布式消息系统的核心原理与架构

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 设计理念差异

维度KafkaJMS (如ActiveMQ)
设计目标 高吞吐、日志处理 可靠消息传递
消息模型 发布-订阅 点对点、发布订阅
消息存储 磁盘顺序写入 内存/数据库
消费方式 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对比

特性KafkaRabbitMQ
设计定位 分布式日志系统 消息代理
协议 自定义TCP协议 AMQP
性能 百万级/秒 万级/秒
消息存储 磁盘持久化 内存/磁盘
消费模型 Pull Push
顺序保证 分区内有序 队列有序
典型场景 日志收集、流处理 任务队列、RPC

八、总结

组件作用关键特性
Producer 发布消息 幂等性、事务、分区策略
Broker 存储转发 副本机制、ISR、日志清理
Consumer 消费消息 消费者组、偏移量管理
Topic 消息分类 多分区、多副本
ZooKeeper 协调服务 元数据、选举、监控

核心要点:

  • Kafka是分布式消息系统,以高吞吐著称
  • Topic是消息分类,通过分区实现并行
  • Producer和Consumer 通过Broker进行解耦
  • ZooKeeper 管理元数据和集群协调
  • 与JMS不同,Kafka采用Pull模型和顺序IO
  • 一句话总结:Kafka是一个高吞吐、可持久化、分布式的消息系统,通过Topic分区、副本机制和ZooKeeper协调,实现了海量消息的可靠传输和处理。

    在这里插入图片描述

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

    赞(0)
    未经允许不得转载:171主机测评 » Kafka全面解析:分布式消息系统的核心原理与架构
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址