欢迎光临
我们一直在努力

深入解析云原生时代的高性能消息中间件:基于Apache Pulsar与Kafka架构对比的万亿级数据吞吐与低延迟实时处理实战

深入解析云原生时代的高性能消息中间件:基于Apache Pulsar与Kafka架构对比的万亿级数据吞吐与低延迟实时处理实战

在云原生与大数据深度融合的今天,消息中间件作为连接数据生产者与消费者的“数字血管”,其性能与架构直接决定了企业数据处理的上限。Apache Kafka 凭借其高吞吐和久经沙场的稳定性,长期占据统治地位;而 Apache Pulsar 作为云原生时代的“后起之秀”,以其存算分离架构和灵活的IO模型迅速崛起。本文将深入解析两者的架构差异,并探讨在万亿级数据吞吐场景下的实战选择。

1. 云原生消息中间件的核心挑战

在讨论具体技术之前,我们需要明确云原生时代消息系统面临的三大核心挑战:

  • 弹性伸缩:如何在存储和计算资源独立扩缩容,而不影响数据服务?
  • 多租户隔离:在一个集群中安全地运行成千上万个不同优先级的业务(如核心交易与日志分析)。
  • 跨地域复制:如何在不同可用区(AZ)甚至不同地域之间保证数据的一致性与灾备。
    下图展示了现代消息系统在云原生环境下的典型定位:
  • #mermaid-svg-X3rDObytAHckLmNq{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-X3rDObytAHckLmNq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-X3rDObytAHckLmNq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-X3rDObytAHckLmNq .error-icon{fill:#552222;}#mermaid-svg-X3rDObytAHckLmNq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-X3rDObytAHckLmNq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-X3rDObytAHckLmNq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-X3rDObytAHckLmNq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-X3rDObytAHckLmNq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-X3rDObytAHckLmNq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-X3rDObytAHckLmNq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-X3rDObytAHckLmNq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-X3rDObytAHckLmNq .marker.cross{stroke:#333333;}#mermaid-svg-X3rDObytAHckLmNq svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-X3rDObytAHckLmNq p{margin:0;}#mermaid-svg-X3rDObytAHckLmNq .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-X3rDObytAHckLmNq .cluster-label text{fill:#333;}#mermaid-svg-X3rDObytAHckLmNq .cluster-label span{color:#333;}#mermaid-svg-X3rDObytAHckLmNq .cluster-label span p{background-color:transparent;}#mermaid-svg-X3rDObytAHckLmNq .label text,#mermaid-svg-X3rDObytAHckLmNq span{fill:#333;color:#333;}#mermaid-svg-X3rDObytAHckLmNq .node rect,#mermaid-svg-X3rDObytAHckLmNq .node circle,#mermaid-svg-X3rDObytAHckLmNq .node ellipse,#mermaid-svg-X3rDObytAHckLmNq .node polygon,#mermaid-svg-X3rDObytAHckLmNq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-X3rDObytAHckLmNq .rough-node .label text,#mermaid-svg-X3rDObytAHckLmNq .node .label text,#mermaid-svg-X3rDObytAHckLmNq .image-shape .label,#mermaid-svg-X3rDObytAHckLmNq .icon-shape .label{text-anchor:middle;}#mermaid-svg-X3rDObytAHckLmNq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-X3rDObytAHckLmNq .rough-node .label,#mermaid-svg-X3rDObytAHckLmNq .node .label,#mermaid-svg-X3rDObytAHckLmNq .image-shape .label,#mermaid-svg-X3rDObytAHckLmNq .icon-shape .label{text-align:center;}#mermaid-svg-X3rDObytAHckLmNq .node.clickable{cursor:pointer;}#mermaid-svg-X3rDObytAHckLmNq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-X3rDObytAHckLmNq .arrowheadPath{fill:#333333;}#mermaid-svg-X3rDObytAHckLmNq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-X3rDObytAHckLmNq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-X3rDObytAHckLmNq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X3rDObytAHckLmNq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-X3rDObytAHckLmNq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X3rDObytAHckLmNq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-X3rDObytAHckLmNq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-X3rDObytAHckLmNq .cluster text{fill:#333;}#mermaid-svg-X3rDObytAHckLmNq .cluster span{color:#333;}#mermaid-svg-X3rDObytAHckLmNq 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-X3rDObytAHckLmNq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-X3rDObytAHckLmNq rect.text{fill:none;stroke-width:0;}#mermaid-svg-X3rDObytAHckLmNq .icon-shape,#mermaid-svg-X3rDObytAHckLmNq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X3rDObytAHckLmNq .icon-shape p,#mermaid-svg-X3rDObytAHckLmNq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-X3rDObytAHckLmNq .icon-shape rect,#mermaid-svg-X3rDObytAHckLmNq .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X3rDObytAHckLmNq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-X3rDObytAHckLmNq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-X3rDObytAHckLmNq :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    计算消费层

    消息中间件层

    数据源层

    IoT设备

    用户行为日志

    数据库CDC

    Apache Kafka

    Apache Pulsar

    Flink实时计算

    Spark批处理

    微服务订阅


    2. 架构对决:Kafka的存算一体 vs Pulsar的存算分离

    这是两者最本质的区别,直接决定了运维复杂度和扩展能力。

    2.1 Kafka 架构:紧耦合的分区日志

    Kafka 的架构简单而强大。数据以分区形式存储在 Broker 节点上,每个 Broker 既是计算节点(处理读写请求),也是存储节点(持有数据副本)。

    #mermaid-svg-AIOVIKYVyIENfg3O{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-AIOVIKYVyIENfg3O .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AIOVIKYVyIENfg3O .error-icon{fill:#552222;}#mermaid-svg-AIOVIKYVyIENfg3O .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AIOVIKYVyIENfg3O .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AIOVIKYVyIENfg3O .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AIOVIKYVyIENfg3O .marker.cross{stroke:#333333;}#mermaid-svg-AIOVIKYVyIENfg3O svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AIOVIKYVyIENfg3O p{margin:0;}#mermaid-svg-AIOVIKYVyIENfg3O .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-AIOVIKYVyIENfg3O .cluster-label text{fill:#333;}#mermaid-svg-AIOVIKYVyIENfg3O .cluster-label span{color:#333;}#mermaid-svg-AIOVIKYVyIENfg3O .cluster-label span p{background-color:transparent;}#mermaid-svg-AIOVIKYVyIENfg3O .label text,#mermaid-svg-AIOVIKYVyIENfg3O span{fill:#333;color:#333;}#mermaid-svg-AIOVIKYVyIENfg3O .node rect,#mermaid-svg-AIOVIKYVyIENfg3O .node circle,#mermaid-svg-AIOVIKYVyIENfg3O .node ellipse,#mermaid-svg-AIOVIKYVyIENfg3O .node polygon,#mermaid-svg-AIOVIKYVyIENfg3O .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AIOVIKYVyIENfg3O .rough-node .label text,#mermaid-svg-AIOVIKYVyIENfg3O .node .label text,#mermaid-svg-AIOVIKYVyIENfg3O .image-shape .label,#mermaid-svg-AIOVIKYVyIENfg3O .icon-shape .label{text-anchor:middle;}#mermaid-svg-AIOVIKYVyIENfg3O .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AIOVIKYVyIENfg3O .rough-node .label,#mermaid-svg-AIOVIKYVyIENfg3O .node .label,#mermaid-svg-AIOVIKYVyIENfg3O .image-shape .label,#mermaid-svg-AIOVIKYVyIENfg3O .icon-shape .label{text-align:center;}#mermaid-svg-AIOVIKYVyIENfg3O .node.clickable{cursor:pointer;}#mermaid-svg-AIOVIKYVyIENfg3O .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AIOVIKYVyIENfg3O .arrowheadPath{fill:#333333;}#mermaid-svg-AIOVIKYVyIENfg3O .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AIOVIKYVyIENfg3O .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AIOVIKYVyIENfg3O .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AIOVIKYVyIENfg3O .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AIOVIKYVyIENfg3O .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AIOVIKYVyIENfg3O .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AIOVIKYVyIENfg3O .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AIOVIKYVyIENfg3O .cluster text{fill:#333;}#mermaid-svg-AIOVIKYVyIENfg3O .cluster span{color:#333;}#mermaid-svg-AIOVIKYVyIENfg3O 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-AIOVIKYVyIENfg3O .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AIOVIKYVyIENfg3O rect.text{fill:none;stroke-width:0;}#mermaid-svg-AIOVIKYVyIENfg3O .icon-shape,#mermaid-svg-AIOVIKYVyIENfg3O .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AIOVIKYVyIENfg3O .icon-shape p,#mermaid-svg-AIOVIKYVyIENfg3O .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AIOVIKYVyIENfg3O .icon-shape rect,#mermaid-svg-AIOVIKYVyIENfg3O .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AIOVIKYVyIENfg3O .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AIOVIKYVyIENfg3O .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AIOVIKYVyIENfg3O :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    Kafka Cluster

    Broker 1存储: P0, P1

    ZooKeeper元数据管理

    Broker 2存储: P1, P2

    Broker 3存储: P2, P0

    Kafka 特点:

    • 依赖 ZooKeeper:用于控制器选举、分区副本状态管理等(尽管Kraft模式正在移除ZK,但存量市场多基于ZK)。
    • 扩容痛点:增加 Broker 节点虽然能增加计算能力,但必须等待分区副本重新平衡(Rebalance),这会消耗大量的网络带宽和IO,可能导致集群抖动。
    • 存储限制:Broker 的存储容量受限于物理机磁盘,一旦磁盘满,迁移分区数据极其繁琐。

    2.2 Pulsar 架构:云原生的分层设计

    Pulsar 采用了计算与存储分离的架构,引入了 Broker(服务层)和 BookKeeper(存储层)。

    #mermaid-svg-4nOsSNV2GPnYqw5G{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-4nOsSNV2GPnYqw5G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4nOsSNV2GPnYqw5G .error-icon{fill:#552222;}#mermaid-svg-4nOsSNV2GPnYqw5G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4nOsSNV2GPnYqw5G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4nOsSNV2GPnYqw5G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4nOsSNV2GPnYqw5G .marker.cross{stroke:#333333;}#mermaid-svg-4nOsSNV2GPnYqw5G svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4nOsSNV2GPnYqw5G p{margin:0;}#mermaid-svg-4nOsSNV2GPnYqw5G .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G .cluster-label text{fill:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G .cluster-label span{color:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G .cluster-label span p{background-color:transparent;}#mermaid-svg-4nOsSNV2GPnYqw5G .label text,#mermaid-svg-4nOsSNV2GPnYqw5G span{fill:#333;color:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G .node rect,#mermaid-svg-4nOsSNV2GPnYqw5G .node circle,#mermaid-svg-4nOsSNV2GPnYqw5G .node ellipse,#mermaid-svg-4nOsSNV2GPnYqw5G .node polygon,#mermaid-svg-4nOsSNV2GPnYqw5G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4nOsSNV2GPnYqw5G .rough-node .label text,#mermaid-svg-4nOsSNV2GPnYqw5G .node .label text,#mermaid-svg-4nOsSNV2GPnYqw5G .image-shape .label,#mermaid-svg-4nOsSNV2GPnYqw5G .icon-shape .label{text-anchor:middle;}#mermaid-svg-4nOsSNV2GPnYqw5G .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4nOsSNV2GPnYqw5G .rough-node .label,#mermaid-svg-4nOsSNV2GPnYqw5G .node .label,#mermaid-svg-4nOsSNV2GPnYqw5G .image-shape .label,#mermaid-svg-4nOsSNV2GPnYqw5G .icon-shape .label{text-align:center;}#mermaid-svg-4nOsSNV2GPnYqw5G .node.clickable{cursor:pointer;}#mermaid-svg-4nOsSNV2GPnYqw5G .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4nOsSNV2GPnYqw5G .arrowheadPath{fill:#333333;}#mermaid-svg-4nOsSNV2GPnYqw5G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4nOsSNV2GPnYqw5G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4nOsSNV2GPnYqw5G .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4nOsSNV2GPnYqw5G .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4nOsSNV2GPnYqw5G .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4nOsSNV2GPnYqw5G .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4nOsSNV2GPnYqw5G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4nOsSNV2GPnYqw5G .cluster text{fill:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G .cluster span{color:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G 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-4nOsSNV2GPnYqw5G .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4nOsSNV2GPnYqw5G rect.text{fill:none;stroke-width:0;}#mermaid-svg-4nOsSNV2GPnYqw5G .icon-shape,#mermaid-svg-4nOsSNV2GPnYqw5G .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4nOsSNV2GPnYqw5G .icon-shape p,#mermaid-svg-4nOsSNV2GPnYqw5G .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4nOsSNV2GPnYqw5G .icon-shape rect,#mermaid-svg-4nOsSNV2GPnYqw5G .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4nOsSNV2GPnYqw5G .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4nOsSNV2GPnYqw5G .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4nOsSNV2GPnYqw5G :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    协调层

    存储层

    计算层

    Broker 1

    Broker 2

    Broker 3

    Bookie 1Ledger 1, 2

    Bookie 2Ledger 2, 3

    Bookie 3Ledger 3, 1

    ZooKeeper

    Pulsar 特点:

    • 无状态 Broker:Broker 不持久化数据,只负责连接和协议处理。如果 Broker 挂了,可以直接重启,甚至不需要数据恢复时间。
    • 分层存储:支持将热数据留在 Bookie 内存/SSD,冷数据自动下沉到 AWS S3/HDFS,极大降低了长周期存储成本。
    • 独立扩缩:读写压力大时扩容 Broker;存储压力大时扩容 Bookie。两者互不影响。

    3. 存储模型深度解析:分区 vs 分段

    3.1 Kafka 的分区日志模型

    Kafka 将 Topic 划分为多个 Partition,每个 Partition 是一个有序的、不可变的消息日志序列。文件系统以段(Segment,包含.log数据文件和.index索引文件)为单位存储。

    ConsumerZooKeeperDiskKafkaProducerConsumerZooKeeperDiskKafkaProducer#mermaid-svg-M79PBVK265d8PkbX{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-M79PBVK265d8PkbX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-M79PBVK265d8PkbX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-M79PBVK265d8PkbX .error-icon{fill:#552222;}#mermaid-svg-M79PBVK265d8PkbX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-M79PBVK265d8PkbX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-M79PBVK265d8PkbX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-M79PBVK265d8PkbX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-M79PBVK265d8PkbX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-M79PBVK265d8PkbX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-M79PBVK265d8PkbX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-M79PBVK265d8PkbX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-M79PBVK265d8PkbX .marker.cross{stroke:#333333;}#mermaid-svg-M79PBVK265d8PkbX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-M79PBVK265d8PkbX p{margin:0;}#mermaid-svg-M79PBVK265d8PkbX .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-M79PBVK265d8PkbX text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-M79PBVK265d8PkbX .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-M79PBVK265d8PkbX .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-M79PBVK265d8PkbX .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-M79PBVK265d8PkbX .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-M79PBVK265d8PkbX #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-M79PBVK265d8PkbX .sequenceNumber{fill:white;}#mermaid-svg-M79PBVK265d8PkbX #sequencenumber{fill:#333;}#mermaid-svg-M79PBVK265d8PkbX #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-M79PBVK265d8PkbX .messageText{fill:#333;stroke:none;}#mermaid-svg-M79PBVK265d8PkbX .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-M79PBVK265d8PkbX .labelText,#mermaid-svg-M79PBVK265d8PkbX .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-M79PBVK265d8PkbX .loopText,#mermaid-svg-M79PBVK265d8PkbX .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-M79PBVK265d8PkbX .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-M79PBVK265d8PkbX .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-M79PBVK265d8PkbX .noteText,#mermaid-svg-M79PBVK265d8PkbX .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-M79PBVK265d8PkbX .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-M79PBVK265d8PkbX .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-M79PBVK265d8PkbX .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-M79PBVK265d8PkbX .actorPopupMenu{position:absolute;}#mermaid-svg-M79PBVK265d8PkbX .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-M79PBVK265d8PkbX .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-M79PBVK265d8PkbX .actor-man circle,#mermaid-svg-M79PBVK265d8PkbX line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-M79PBVK265d8PkbX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}顺序写盘,效率极高Produce Message追加写入 Active Segment更新 Offset/High WatermarkFetch Request读取 Segment 索引返回数据返回消息

    实战影响:

    • 性能优势:基于操作系统的 Page Cache,顺序读写吞吐量极高。
    • 扩展难点:Partition 数量是并发度的瓶颈。Partition 过多会增加 Leader 选举时长和 ZK 压力;过少则限制消费速度。

    3.2 Pulsar 的 Ledger 模型

    Pulsar 的存储单元称为 Ledger,这是一个分布式的写日志文件。Topic 的每个分区被映射为一系列 Ledger。

    渲染错误: Mermaid 渲染失败: Parse error on line 2:
    … –> L1[Ledger 1(已封存)] Topic –>
    ———————–^
    Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

    实战影响:

    • 并发写放大:由于 Ledger 在 Bookie 间是条带化写入的,Pulsar 可以利用所有 Bookie 的聚合带宽,解决了 Kafka 单节点磁盘带宽上限的问题。
    • 数据完整性:利用 Quorum 机制(如 Ensemble 3, Write Quorum 2, Ack Quorum 2),保证在部分节点故障时数据不丢,且无需像 Kafka 那样等待 ISR 同步完所有副本。

    4. 云原生特性:多租户与 Geo-Replication

    在云原生环境中,资源通常是共享的,但业务需求却是隔离的。

    4.1 Pulsar 的原生多租户

    Pulsar 在设计之初就将多租户作为一等公民。层级结构为:Tenant -> Namespace -> Topic。

    #mermaid-svg-KMvztx2dXUpkuLH5{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-KMvztx2dXUpkuLH5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KMvztx2dXUpkuLH5 .error-icon{fill:#552222;}#mermaid-svg-KMvztx2dXUpkuLH5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KMvztx2dXUpkuLH5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KMvztx2dXUpkuLH5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KMvztx2dXUpkuLH5 .marker.cross{stroke:#333333;}#mermaid-svg-KMvztx2dXUpkuLH5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KMvztx2dXUpkuLH5 p{margin:0;}#mermaid-svg-KMvztx2dXUpkuLH5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 .cluster-label text{fill:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 .cluster-label span{color:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 .cluster-label span p{background-color:transparent;}#mermaid-svg-KMvztx2dXUpkuLH5 .label text,#mermaid-svg-KMvztx2dXUpkuLH5 span{fill:#333;color:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 .node rect,#mermaid-svg-KMvztx2dXUpkuLH5 .node circle,#mermaid-svg-KMvztx2dXUpkuLH5 .node ellipse,#mermaid-svg-KMvztx2dXUpkuLH5 .node polygon,#mermaid-svg-KMvztx2dXUpkuLH5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KMvztx2dXUpkuLH5 .rough-node .label text,#mermaid-svg-KMvztx2dXUpkuLH5 .node .label text,#mermaid-svg-KMvztx2dXUpkuLH5 .image-shape .label,#mermaid-svg-KMvztx2dXUpkuLH5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-KMvztx2dXUpkuLH5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KMvztx2dXUpkuLH5 .rough-node .label,#mermaid-svg-KMvztx2dXUpkuLH5 .node .label,#mermaid-svg-KMvztx2dXUpkuLH5 .image-shape .label,#mermaid-svg-KMvztx2dXUpkuLH5 .icon-shape .label{text-align:center;}#mermaid-svg-KMvztx2dXUpkuLH5 .node.clickable{cursor:pointer;}#mermaid-svg-KMvztx2dXUpkuLH5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KMvztx2dXUpkuLH5 .arrowheadPath{fill:#333333;}#mermaid-svg-KMvztx2dXUpkuLH5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KMvztx2dXUpkuLH5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KMvztx2dXUpkuLH5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KMvztx2dXUpkuLH5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KMvztx2dXUpkuLH5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KMvztx2dXUpkuLH5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KMvztx2dXUpkuLH5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KMvztx2dXUpkuLH5 .cluster text{fill:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 .cluster span{color:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 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-KMvztx2dXUpkuLH5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KMvztx2dXUpkuLH5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-KMvztx2dXUpkuLH5 .icon-shape,#mermaid-svg-KMvztx2dXUpkuLH5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KMvztx2dXUpkuLH5 .icon-shape p,#mermaid-svg-KMvztx2dXUpkuLH5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KMvztx2dXUpkuLH5 .icon-shape rect,#mermaid-svg-KMvztx2dXUpkuLH5 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KMvztx2dXUpkuLH5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KMvztx2dXUpkuLH5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KMvztx2dXUpkuLH5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    Pulsar Cluster

    Tenant A: 交易部门

    Tenant B: 日志部门

    Namespace: 生产

    Namespace: 测试

    Namespace: 审计

    资源配额/认证授权

    实战价值:

    • 资源隔离:可以为 Namespace 配置最大的带宽、内存和 CPU 使用量。例如,限制日志部门不能抢占交易部门的 Broker 资源。
    • 策略隔离:不同的 Namespace 可以配置不同的 retention(保留策略)和 backlog(积压策略)。

    4.2 跨地域复制对比

    对于全球业务,跨地域复制是刚需。

    • Kafka:主要依赖 MirrorMaker 2.0。它本质上是消费者-生产者程序,链路较长,配置复杂,且通常只是单向或主-主复制,冲突解决机制较弱。
    • Pulsar:原生支持 Geo-Replication。

    #mermaid-svg-l9kBbjml8SOJUMlX{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-l9kBbjml8SOJUMlX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-l9kBbjml8SOJUMlX .error-icon{fill:#552222;}#mermaid-svg-l9kBbjml8SOJUMlX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-l9kBbjml8SOJUMlX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-l9kBbjml8SOJUMlX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-l9kBbjml8SOJUMlX .marker.cross{stroke:#333333;}#mermaid-svg-l9kBbjml8SOJUMlX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-l9kBbjml8SOJUMlX p{margin:0;}#mermaid-svg-l9kBbjml8SOJUMlX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-l9kBbjml8SOJUMlX .cluster-label text{fill:#333;}#mermaid-svg-l9kBbjml8SOJUMlX .cluster-label span{color:#333;}#mermaid-svg-l9kBbjml8SOJUMlX .cluster-label span p{background-color:transparent;}#mermaid-svg-l9kBbjml8SOJUMlX .label text,#mermaid-svg-l9kBbjml8SOJUMlX span{fill:#333;color:#333;}#mermaid-svg-l9kBbjml8SOJUMlX .node rect,#mermaid-svg-l9kBbjml8SOJUMlX .node circle,#mermaid-svg-l9kBbjml8SOJUMlX .node ellipse,#mermaid-svg-l9kBbjml8SOJUMlX .node polygon,#mermaid-svg-l9kBbjml8SOJUMlX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-l9kBbjml8SOJUMlX .rough-node .label text,#mermaid-svg-l9kBbjml8SOJUMlX .node .label text,#mermaid-svg-l9kBbjml8SOJUMlX .image-shape .label,#mermaid-svg-l9kBbjml8SOJUMlX .icon-shape .label{text-anchor:middle;}#mermaid-svg-l9kBbjml8SOJUMlX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-l9kBbjml8SOJUMlX .rough-node .label,#mermaid-svg-l9kBbjml8SOJUMlX .node .label,#mermaid-svg-l9kBbjml8SOJUMlX .image-shape .label,#mermaid-svg-l9kBbjml8SOJUMlX .icon-shape .label{text-align:center;}#mermaid-svg-l9kBbjml8SOJUMlX .node.clickable{cursor:pointer;}#mermaid-svg-l9kBbjml8SOJUMlX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-l9kBbjml8SOJUMlX .arrowheadPath{fill:#333333;}#mermaid-svg-l9kBbjml8SOJUMlX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-l9kBbjml8SOJUMlX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-l9kBbjml8SOJUMlX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-l9kBbjml8SOJUMlX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-l9kBbjml8SOJUMlX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-l9kBbjml8SOJUMlX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-l9kBbjml8SOJUMlX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-l9kBbjml8SOJUMlX .cluster text{fill:#333;}#mermaid-svg-l9kBbjml8SOJUMlX .cluster span{color:#333;}#mermaid-svg-l9kBbjml8SOJUMlX 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-l9kBbjml8SOJUMlX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-l9kBbjml8SOJUMlX rect.text{fill:none;stroke-width:0;}#mermaid-svg-l9kBbjml8SOJUMlX .icon-shape,#mermaid-svg-l9kBbjml8SOJUMlX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-l9kBbjml8SOJUMlX .icon-shape p,#mermaid-svg-l9kBbjml8SOJUMlX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-l9kBbjml8SOJUMlX .icon-shape rect,#mermaid-svg-l9kBbjml8SOJUMlX .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-l9kBbjml8SOJUMlX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-l9kBbjml8SOJUMlX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-l9kBbjml8SOJUMlX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    本地写入优先

    异步复制

    异步复制

    异步复制

    低延迟

    Cluster A: 美东

    Cluster B: 美西

    Cluster C: 欧洲

    Client

    Pulsar 的复制在 Broker 层面完成,配置简单。用户可以指定某个 Namespace 的数据必须同时复制到至少 2 个集群才算写入成功,满足合规要求。

    5. 性能基准:吞吐与延迟的权衡

    5.1 吞吐量

    • Kafka:在大批量、非实时的日志收集场景(如每秒写入 100MB+)下,Kafka 的利用 Page Cache 和 Zero Copy 技术使其吞吐量略占优势,特别是当批量大小较大时。
    • Pulsar:在 Partition 数量极多(数万分区)的场景下,Pulsar 的吞吐表现更稳定。因为 Kafka 受限于 Broker 线程数和磁盘 IOPS,而 Pulsar 将压力分散到了 Bookie 集群。

    5.2 延迟

    这是 Pulsar 的传统强项。

    #mermaid-svg-CwpFwI2fiywyMhsL{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-CwpFwI2fiywyMhsL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CwpFwI2fiywyMhsL .error-icon{fill:#552222;}#mermaid-svg-CwpFwI2fiywyMhsL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CwpFwI2fiywyMhsL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CwpFwI2fiywyMhsL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CwpFwI2fiywyMhsL .marker.cross{stroke:#333333;}#mermaid-svg-CwpFwI2fiywyMhsL svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CwpFwI2fiywyMhsL p{margin:0;}#mermaid-svg-CwpFwI2fiywyMhsL .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-CwpFwI2fiywyMhsL .cluster-label text{fill:#333;}#mermaid-svg-CwpFwI2fiywyMhsL .cluster-label span{color:#333;}#mermaid-svg-CwpFwI2fiywyMhsL .cluster-label span p{background-color:transparent;}#mermaid-svg-CwpFwI2fiywyMhsL .label text,#mermaid-svg-CwpFwI2fiywyMhsL span{fill:#333;color:#333;}#mermaid-svg-CwpFwI2fiywyMhsL .node rect,#mermaid-svg-CwpFwI2fiywyMhsL .node circle,#mermaid-svg-CwpFwI2fiywyMhsL .node ellipse,#mermaid-svg-CwpFwI2fiywyMhsL .node polygon,#mermaid-svg-CwpFwI2fiywyMhsL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CwpFwI2fiywyMhsL .rough-node .label text,#mermaid-svg-CwpFwI2fiywyMhsL .node .label text,#mermaid-svg-CwpFwI2fiywyMhsL .image-shape .label,#mermaid-svg-CwpFwI2fiywyMhsL .icon-shape .label{text-anchor:middle;}#mermaid-svg-CwpFwI2fiywyMhsL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CwpFwI2fiywyMhsL .rough-node .label,#mermaid-svg-CwpFwI2fiywyMhsL .node .label,#mermaid-svg-CwpFwI2fiywyMhsL .image-shape .label,#mermaid-svg-CwpFwI2fiywyMhsL .icon-shape .label{text-align:center;}#mermaid-svg-CwpFwI2fiywyMhsL .node.clickable{cursor:pointer;}#mermaid-svg-CwpFwI2fiywyMhsL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CwpFwI2fiywyMhsL .arrowheadPath{fill:#333333;}#mermaid-svg-CwpFwI2fiywyMhsL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CwpFwI2fiywyMhsL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CwpFwI2fiywyMhsL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CwpFwI2fiywyMhsL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CwpFwI2fiywyMhsL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CwpFwI2fiywyMhsL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CwpFwI2fiywyMhsL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CwpFwI2fiywyMhsL .cluster text{fill:#333;}#mermaid-svg-CwpFwI2fiywyMhsL .cluster span{color:#333;}#mermaid-svg-CwpFwI2fiywyMhsL 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-CwpFwI2fiywyMhsL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CwpFwI2fiywyMhsL rect.text{fill:none;stroke-width:0;}#mermaid-svg-CwpFwI2fiywyMhsL .icon-shape,#mermaid-svg-CwpFwI2fiywyMhsL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CwpFwI2fiywyMhsL .icon-shape p,#mermaid-svg-CwpFwI2fiywyMhsL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CwpFwI2fiywyMhsL .icon-shape rect,#mermaid-svg-CwpFwI2fiywyMhsL .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CwpFwI2fiywyMhsL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CwpFwI2fiywyMhsL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CwpFwI2fiywyMhsL :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    Pulsar 路径

    网络

    内存

    网络

    异步刷盘

    Producer

    Broker

    Managed Ledger Cache

    Consumer

    Bookie Disk

    Kafka 路径

    网络

    Page Cache

    网络

    Producer

    Broker

    FSync to Disk?配置依赖

    Consumer

    • Kafka:为了持久化,通常依赖 fsync 或依靠操作系统的后台刷盘。在极端情况下,如 Page Cache 竞争,延迟会出现毛刺(Tail Latency)。
    • Pulsar:Broker 确认写入主要依赖 Bookie 的 Journal(内存/Write Ahead Log)。只要写入内存 Journal 并同步到副本内存,即可确认 ACK。这使得 Pulsar 在 99% 分位延迟(P99)上通常优于 Kafka,非常适合风控、广告竞价等对延迟极其敏感的业务。

    6. 实战选型指南

    没有完美的架构,只有最适合的场景。以下是基于万亿级数据吞吐场景的选型建议:

    特性Apache KafkaApache Pulsar
    核心架构 存算一体 存算分离
    运维复杂度 中等(磁盘管理复杂) 较高(组件多:BK/Broker/ZK)
    云原生适配 一般(扩容需 Rebalance) 优秀(计算/存储独立扩容)
    多租户 弱(依赖 ACL/RBAC) 强(原生 Tenant 资源隔离)
    持久化/分层 本地磁盘 本地 + 云存储
    生态成熟度 极高 快速追赶中

    6.1 选择 Kafka 的场景

  • 现有的传统大数据生态:如果你的技术栈深度依赖 Kafka Connect(数据同步)、Kafka Streams(流处理),且团队对 Kafka 运维非常有经验,替换成本太高。
  • 极高吞吐的日志聚合:场景主要是非实时的离线数仓入湖,对秒级延迟不敏感,但对单位时间吞入量有极致要求。
  • 单集群单地域:不需要复杂的多云容灾和跨地域复制。
  • 6.2 选择 Pulsar 的场景

  • 云原生/多云环境:业务部署在 Kubernetes 上,需要利用云存储(S3)无限扩容,且需要在不同云厂商之间做灾备。
  • 多租户 SaaS 平台:需要为成百上千个租户提供消息服务,必须严格的资源配额和隔离,防止“吵闹邻居”效应。
  • Function 即服务:Pulsar Functions 允许在 Broker 或 Worker 上直接运行轻量级计算函数,实现了“消息即计算”的边缘处理能力。
  • 万亿级有序数据:需要数万个分区,且对 P99 延迟敏感的金融/交易场景。
  • 结语

    Apache Kafka 是过去十年大数据领域的王者,其稳健的架构足以支撑大多数企业级应用。然而,随着云原生技术的普及和业务对实时性要求的提高,Apache Pulsar 凭借其先进的分层架构和灵活性,正成为构建下一代万亿级数据平台的基石。在实战中,理解“存算一体”与“存算分离”的深层差异,是架构师做出正确技术选型的关键。

    赞(0)
    未经允许不得转载:171主机测评 » 深入解析云原生时代的高性能消息中间件:基于Apache Pulsar与Kafka架构对比的万亿级数据吞吐与低延迟实时处理实战
    分享到: 更多 (0)

    评论 抢沙发

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