Kafka如何支撑百万并发架构?

Kafka是大型架构核心,下面我详解Kafka百万并发架构@mikechen

Kafka百万并发架构

典型 Kafka 高并发架构:

Kafka如何支撑百万并发架构?-mikechen

                Producer Cluster
                       │
                       ▼
               Load Balancer
                       │
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
   Kafka Broker1  Kafka Broker2  Kafka Broker3
        │              │              │
     Partition      Partition      Partition
        │              │              │
        ▼              ▼              ▼
      Consumer Group(并行消费)

典型配置:

参数 配置
Broker数量 5-10
Partition数量 200+
副本数 3
Producer批量 开启

这样的集群:轻松达到百万 。

很多互联网公司日志系统:

  • 日志采集;
  • 埋点系统;
  • 实时计算;

都会使用 Kafka 作为 流量入口层。

 

顺序写磁盘(Sequential I/O)

传统系统写磁盘时,经常是 随机写(Random I/O)。

Kafka如何支撑百万并发架构?-mikechen

随机写的问题:

  • 磁盘寻道时间高;
  • IOPS 限制严重;
  • 性能很容易成为瓶颈;

而 Kafka 的设计原则是:

所有消息都采用顺序写入日志文件(Commit Log)。

写入模式:

Producer
   │
   ▼
Kafka Broker
   │
   ▼
Append Log(顺序追加)

Kafka 的 Topic 在底层是:

Topic
 ├─ Partition 0
 │   └─ Log Segment
 ├─ Partition 1
 │   └─ Log Segment
 └─ Partition 2

每个 Partition 本质就是一个 追加写日志文件

顺序写的优势:

类型 吞吐能力
随机写 几百 IOPS
顺序写 几万 IOPS

因此 Kafka 可以把磁盘性能 榨到接近带宽极限

零拷贝技术(Zero Copy)

在传统数据传输中,数据通常会经过 多次拷贝

Kafka如何支撑百万并发架构?-mikechen

磁盘
 ↓
Kernel Buffer
 ↓
User Buffer
 ↓
Socket Buffer
 ↓
网卡

这个过程会产生 多次 CPU copy。

而 Kafka 使用 零拷贝技术。

核心调用:

sendfile()

数据路径变成:

磁盘
 ↓
Kernel Buffer
 ↓
Socket Buffer
 ↓
网卡

特点:

  • 减少 CPU 拷贝
  • 减少上下文切换
  • 提升网络吞吐

因此 Kafka 在 消息消费阶段可以达到极高吞吐。

很多场景:单 Broker 网络吞吐可达到 GB/s级别。

分区并行机制

Kafka 的核心设计是 Partition 分区模型。

Kafka如何支撑百万并发架构?-mikechen

Topic
 ├─ Partition0
 ├─ Partition1
 ├─ Partition2
 ├─ Partition3
 └─ PartitionN

每个 Partition:

  • 可以在不同 Broker 上
  • 可以被不同 Consumer 并行消费

Producer 写入流程:

Producer
   │
   ▼
Partitioner
   │
   ├─ Partition0
   ├─ Partition1
   ├─ Partition2
   └─ PartitionN

这意味着:

Kafka 可以水平扩展吞吐能力。

例如:

Partition数量 理论吞吐
10 10万 TPS
100 100万 TPS
1000 千万 TPS

只要:

  • Broker 足够;
  • Partition 足够.

Kafka 的吞吐能力几乎 线性扩展。

评论交流
    说说你的看法