Apache Pulsar:用計算/儲存分離統一 messaging 與 streaming

文字解析 · 1 支影片 · 產生於 2026-10-01 00:54

🎧 語音解析📝 筆記✍️ 練習

🎧 語音解析 15m34s · TTS 講解與作者原聲交錯;點章節可跳。
邊聽邊看逐句講稿,點任一句從那裡開始
章節(9)

1. Outline

  1. 起點 · What Is Apache Pulsar? The Cloud-Native Messaging & Streaming Platform
    從「為什麼需要中間層」推到「Pulsar 靠分離架構同時做 queue 與 streaming」,再推出五個能力與四類用途。

2. YouTuber 的思維推導

What Is Apache Pulsar? The Cloud-Native Messaging & Streaming Platform

The Data and AI Guy · 10m04s · 字幕 en · vision=on (使用者指定 vision=true;影片在 277s 明說「going to a diagram」,架構段落有圖。) · YouTube

預估 vs 實際耗時
階段預估實際
fetch 6s 2s
segment 50s 1m15s
shot 37s 5s
analyze 2m15s 4m00s
render 5s 5s

作者從一個工程問題出發(即時、可靠、大規模地把資料從系統的一處搬到另一處),先說明為什麼需要一個「中間層」,再指出中間層歷史上分成 queue 與 streaming 兩種、必須二選一。Pulsar 的賣點就是回應這個「二選一」:一個平台做兩件事。接著他把重點放在「為什麼 Pulsar 做得到」:關鍵是 compute 與 storage 分離——先用 Kafka 的耦合架構與 rebalancing 痛點建立對照,再介紹 Pulsar 的 broker 層、BookKeeper 儲存層、ZooKeeper 協調層與 ledger 分段。

有了架構,他才推出五個優勢(每個都是分離架構的直接結果),再對應到四類實際用途,最後把「為什麼流行」收束回架構本身。整支影片的推理是一條線:問題 → 中間層 → 二選一的痛 → 統一平台 → 靠分離架構做到 → 架構帶來的能力 → 能力對應的用途。

推理鏈:每段留給下一段的線索

每一列是一段,箭頭後的字是這段留給下一段的線索。點段落標題跳到該段。

  1. 問題:即時、可靠、大規模搬資料 → 「Kafka 很好但長大會痛」——那到底為什麼系統之間需要一個像 Kafka 這樣的東西?先得弄清楚「中間層」解決什麼問題。
  2. 中間層:broker、queue vs streaming → 「同時維護兩套完全不同的系統」是痛點。Pulsar 的回答是:如果一個平台能同時做兩種呢?那它是什麼、從哪來?
  3. Pulsar 的定位與 Yahoo 起源 → 定義說了「能做兩種 workload」也說了「為超大規模設計」,但都還沒解釋怎麼做到。下一步要看 Pulsar 內部到底怎麼運作。
  4. 基本詞彙與核心想法:計算與儲存分離 → Kafka 的耦合造成 rebalancing 之痛。Pulsar 說要分離——那具體分成哪兩層、各層做什麼?
  5. 兩層架構:無狀態 broker + BookKeeper → 兩層都無狀態或分散了,那「哪個 broker 負責哪個 topic、某段資料存在哪幾個 bookie」這些對應關係由誰記得?
  6. 協調層、ledger 分段與 tiered storage → 架構講完了:分離的三個角色、分段的資料。那這樣的架構具體換來哪些別人做不到的能力?
  7. 架構帶來的五個優勢 → 能力清單有了,但能力要落到場景才有意義:真實公司拿這些能力做什麼?
  8. 誰在用、用來做什麼 → 四類用途各自對回一項能力,能力又各自對回分離架構。所以「為什麼這些大公司選它」的答案應該可以收束成幾句話。
  9. 為什麼在流行與收尾

3. 逐段說明

What Is Apache Pulsar? The Cloud-Native Messaging & Streaming Platform

1. 問題:即時、可靠、大規模搬資料 0:00–0:52

作者提出一個看似簡單但會弄垮團隊的問題:如何在系統各部分之間即時、可靠、大規模地搬資料。過去十年的預設答案是 Kafka;本片要介紹為了解決 Kafka 在成長時的痛點而設計的 Apache Pulsar,並預告內容:是什麼、架構、用途、為什麼在流行、誰在用。

影片開場的議程/標題畫面,確認本片涵蓋的五個面向
0:36 · 影片開場的議程/標題畫面,確認本片涵蓋的五個面向
承上 前情提要中的「分散式系統裡各服務需要交換資料」這個基本情境:一旦服務多起來,資料如何流動就成為架構問題。

推理因為資料流動是所有分散式系統都躲不掉的問題,作者先把它明確定義成一句話:「如何可靠、即時、大規模地把資料從 A 搬到 B」。接著點名過去十年的預設答案是 Kafka,並埋下伏筆:Kafka 在規模長大後會出現痛點,而 Pulsar 就是針對這些痛點設計的。他用 Yahoo、Tencent、Splunk、Cisco、Discord 等採用者建立可信度,並列出本片五個面向:是什麼、架構、用途、為什麼流行、誰在用。

AI 補充作者沒說「reliably at scale in real time」三個詞各自的意思,但後面整支影片就是圍繞它們展開:可靠(reliably)對應資料不能遺失;大規模(at scale)對應擴展與百萬 topic;即時(real time)對應 streaming 而非批次。先把這三個詞記住,後面每個架構決策都能對回其中一個。畫面上是 Pulsar 官網的 features 頁,六個特色(快速水平擴展、低延遲 messaging 與 streaming、geo-replication、multi-tenancy、自動負載平衡、多語言 client)就是影片後半會逐一展開的清單。

術語:Apache Kafka

Apache Kafka

Apache Kafka(分散式事件串流平台)

過去十年最主流的分散式事件串流平台,以「連續、有序、可重播的 log」為核心模型。本片把它當作 Pulsar 的主要對照組。

由 LinkedIn 開發、2011 年開源。核心抽象是 topic 切成多個 partition,每個 partition 是一個只能追加的有序 log,consumer 用 offset 記錄自己讀到哪。broker 同時負責處理請求與在本機磁碟保存 partition 資料,因此擴容時必須搬 partition。2023 年後的 KRaft 模式移除了對 ZooKeeper 的依賴。

相關術語: Apache Pulsar (本片的對照組)、Streaming (代表實作)

出處:第 1 段「問題:即時、可靠、大規模搬資料」

Apache Pulsar

Apache Pulsar(雲原生訊息與串流平台)

本片主角:開源的分散式 messaging 與 streaming 平台,設計目標是解決 Kafka 在規模成長後的痛點。

2013 年在 Yahoo 內部誕生,2016 開源,2018 成為 Apache 頂級專案。與 Kafka 最大的差異是分層架構:broker 無狀態、資料交給 BookKeeper。一個系統同時支援 queue 語意(逐筆 ack、共享訂閱)與 stream 語意(累積 ack、順序保證)。

相關術語: Apache Kafka (要解決其痛點)

出處:第 1 段「問題:即時、可靠、大規模搬資料」

留給下一段 「Kafka 很好但長大會痛」——那到底為什麼系統之間需要一個像 Kafka 這樣的東西?先得弄清楚「中間層」解決什麼問題。

2. 中間層:broker、queue vs streaming 0:52–2:06

用叫車 app 的司機位置更新舉例:多個服務都要同一筆資料,服務互相直呼會變義大利麵。解法是放一個中央管線,producer 發一次、有興趣的 consumer 訂閱,雙方只約定 channel。這就是 message broker / streaming platform。這類系統有兩種口味:message queuing(RabbitMQ,任務交接後 ack)與 streaming(Kafka,連續有序 log 可重播),過去必須二選一並維護兩套。

中央管線示意:producer 發布一次、多個 consumer 訂閱
1:20 · 中央管線示意:producer 發布一次、多個 consumer 訂閱
queue vs streaming 兩種模型的對照
1:50 · queue vs streaming 兩種模型的對照
承上 上一段留下的問題:為什麼系統之間需要一個像 Kafka 這樣的中間層?

推理因為要說明中間層的必要,作者用叫車 app 舉例:一百萬個司機每秒更新位置,同一筆資料要同時給乘客畫面、定價引擎、詐欺偵測、分析儀表板。若服務直接互呼,連線數是 N×M 的義大利麵,任一慢元件會拖垮全體。所以在中間放一根「中央管線」:位置更新只發布一次,誰需要誰訂閱,producer 與 consumer 互不認識、只約定 channel。這根管線就叫 message broker 或 streaming platform。接著他指出這類系統有兩種口味:message queuing(RabbitMQ:交付一個任務、被領走、處理、回 ack)和 streaming(Kafka:連續有序 log,多個 consumer 可從任一點讀與重播)。歷史上兩者要二選一,通常是同時養兩套系統。

AI 補充投影片把三件事疊在一起:上方是 point-to-point 的義大利麵(問題),中間是 queuing 與 streaming 的歷史分裂(兩種模型、兩套團隊與維運),下方是 Pulsar 的「一根管線同時裝兩種 workload」(解法預告)。兩種模型的本質差異是「訊息被消費後還在不在」:queue 模型裡任務被 ack 後就消失,適合分派工作;streaming 模型裡訊息留在 log 上,consumer 只是移動自己的讀取位置,適合多方各自讀同一份歷史。作者沒明說,但這個差異正是後面「兩種 ack 方式」的根源。

術語:Acknowledge (ack)

Message broker / streaming platform

訊息代理/串流平台

放在服務之間的中央管線:producer 發布一次,任何有興趣的 consumer 訂閱即可取得,雙方解耦。

兩個詞常混用,但側重不同:message broker 強調「轉送與交付」,訊息被消費後通常就不保留;streaming platform 強調「保存與重播」,訊息以 log 形式留存一段時間。Pulsar 與 Kafka 都屬後者,但 Pulsar 也能扮演前者。

相關術語: Message queuing (兩種口味之一)、Streaming (兩種口味之一)、Topic (以 topic 為 channel)

出處:第 2 段「中間層:broker、queue vs streaming」

Message queuing

訊息佇列

訊息模型之一(如 RabbitMQ):交付一個任務,某個 consumer 領走、處理、回 ack 後任務消失。適合工作分派。

典型代表 RabbitMQ、ActiveMQ、SQS。適合「一件工作只要有人做一次」的場景。特徵:多個 worker 競爭同一個 queue、每則訊息被 ack 後刪除、未 ack 的訊息會重新派給別人。缺點是無法重播歷史、難以讓多個獨立系統各自完整讀同一份資料。

相關術語: Acknowledge (ack) (靠 ack 完成交付)、Streaming (相對模型)

出處:第 2 段「中間層:broker、queue vs streaming」

Streaming

串流

訊息模型之二(如 Kafka):訊息以連續、有序的 log 保存,多個 consumer 可各自從任意位置讀取與重播。

訊息被保留在有序 log 上(通常依時間或大小做保留策略),每個 consumer group 自行維護讀取位置。同一份資料可以被分析、告警、備份等多個系統各自完整消費,也可以倒回去重讀。代價是 consumer 必須自己處理「已處理到哪」的狀態。

相關術語: Message queuing (相對模型)、Apache Kafka (代表實作)

出處:第 2 段「中間層:broker、queue vs streaming」

Acknowledge (ack)

確認(已處理)

consumer 告訴系統「這則訊息我處理完了」的回覆;系統據此決定訊息是否可以視為已消費。

ack 是可靠性的核心機制:系統只在收到 ack 後才認定訊息已被消費;若 consumer 在 ack 前當機,訊息會重新派送,因此 consumer 邏輯要能容忍重複(冪等)。Pulsar 有兩種 ack:individual(只確認這一則)與 cumulative(確認這一則及之前全部)。

相關術語: Message queuing (核心機制)

出處:第 2 段「中間層:broker、queue vs streaming」

留給下一段 「同時維護兩套完全不同的系統」是痛點。Pulsar 的回答是:如果一個平台能同時做兩種呢?那它是什麼、從哪來?

3. Pulsar 的定位與 Yahoo 起源 2:06–3:12

Pulsar 的賣點:一個平台同時處理 queue 型與 stream 型工作負載。它是開源分散式 messaging & streaming 平台,從第一天就為 cloud-native 與超大規模設計。2013 年在 Yahoo 內部誕生、2015 上線、2016 開源,動機是要服務 100+ 個產品、跨全球、零訊息遺失。多租戶、跨區域、不容忍資料遺失都內建在核心。

Yahoo 起源與時間線
2:30 · Yahoo 起源與時間線
承上 上一段留下「一個平台同時做 queue 與 streaming」的提案,需要知道 Pulsar 是什麼、為什麼會被造出來。

推理因為提案已經丟出來,作者先給正式定義:Pulsar 是開源、分散式的 messaging 與 streaming 平台,能在同一系統處理 queue 型與 stream 型工作,並且從第一天就為 cloud-native 與超大規模設計。接著用起源說明「為什麼它會有這些性質」:2013 年 Yahoo 內部需要一套能服務 100+ 產品(Mail、Finance、Ads…)、跨全球、絕不掉訊息的系統,市面上沒有,於是自己造,2015 上線、2016 開源,之後持續演進(4.1 版去年釋出)。因此多租戶、跨區域、零資料遺失都是核心內建,不必使用者自己疊上去。

AI 補充這段的邏輯是「需求決定設計」:Yahoo 的三個需求(多產品共用、跨區域、不掉訊息)分別對應後面會講的 multi-tenancy、geo-replication、以及寫入複製後才 ack 的耐久性保證。把這個對應記住,後面的優勢清單就不是零散功能,而是同一組需求的落實。另外「cloud-native」在這裡的實際含義是:元件可以獨立、無狀態地增減,這正是下一步要講的分離架構。

Cloud-native

雲原生

為雲端環境設計的架構性質:元件可以獨立、快速地增減與替換,通常靠無狀態服務與分離的儲存達成。

CNCF 的定義強調:容器化、動態編排(Kubernetes)、微服務、宣告式 API。在訊息系統脈絡下,實際含義是「任何一個節點可以隨時被殺掉或新增而不影響資料」,這要求計算節點無狀態、儲存節點可獨立複製與擴展。

相關術語: Stateless broker (靠它達成)、Compute/Storage 分離 (靠它達成)

出處:第 3 段「Pulsar 的定位與 Yahoo 起源」

Multi-tenant(多租戶)

多租戶

同一套實體系統安全地服務多個彼此隔離的使用單位(團隊、產品),各有自己的存取控制與資源配額。

常見誤解是「多租戶 = 多個使用者帳號」。真正的多租戶要求:資源隔離(一個租戶爆量不影響其他)、安全隔離(各自的認證授權)、配額與政策獨立、以及命名空間不衝突。Pulsar 用 tenant/namespace 兩層結構把這些政策掛在明確的位置。

相關術語: Tenant / Namespace / Topic 階層 (用此結構實作)

出處:第 3 段「Pulsar 的定位與 Yahoo 起源」

留給下一段 定義說了「能做兩種 workload」也說了「為超大規模設計」,但都還沒解釋怎麼做到。下一步要看 Pulsar 內部到底怎麼運作。

4. 基本詞彙與核心想法:計算與儲存分離 3:12–4:12

共通詞彙:producer 寫、consumer 讀、messages 組織成 topic(具名 channel)。定義 Pulsar 的大想法是把 compute 與 storage 分離。對比 Kafka:每個 broker 同時處理訊息收發與把資料存本機磁碟,簡單快速,但加新機器時是空的,必須複製大量既有資料(rebalancing),大叢集上可能耗時數小時並拖慢效能。

Kafka broker 同時負責 compute 與 storage 的耦合示意
3:50 · Kafka broker 同時負責 compute 與 storage 的耦合示意
rebalancing:新 broker 加入時要搬資料
4:07 · rebalancing:新 broker 加入時要搬資料
承上 上一段留下「Pulsar 內部怎麼運作」的問題,先需要一套共通詞彙才能描述架構。

推理因為要講架構,作者先定義三個所有這類系統共用的詞:producer 寫訊息、consumer 讀訊息、messages 組織進 topic(一個具名 channel,如 driver-locations)。然後直接點出定義 Pulsar 的大想法:compute 與 storage 分離。為了讓這個想法有份量,他用 Kafka 做對照:Kafka 的每個 broker 同時做兩件事——處理訊息進出、把資料存在自己本機磁碟。這很簡單很快,但有個代價:新加一台 broker 時它是空的,Kafka 必須把大量既有資料實體複製過去(rebalancing),大叢集上可能要數小時,期間效能受損。

AI 補充「compute 與 storage 分離」是整支影片的樞紐概念,之後每個優勢都從它推出。理解方式:在 Kafka 裡「處理能力」和「資料在哪」綁在同一台機器,所以擴充處理能力必然牽動資料搬遷;只要把兩者拆開,擴充其中一個就不需要動另一個。作者這裡只講了 Kafka 的痛,還沒講 Pulsar 怎麼拆——這是刻意的鋪陳。補充一點作者略過的細節:Kafka 的 rebalancing 之所以慢,是因為 partition 是儲存單位也是負載單位,搬 partition 等於搬整段歷史資料。

術語:Producer / ConsumerCompute/Storage 分離

Producer / Consumer

生產者/消費者

producer 是任何寫入訊息的東西,consumer 是任何讀取訊息的東西;兩者透過 topic 互動而不直接認識對方。

producer 只知道 topic 名稱,不知道有幾個 consumer、consumer 在哪;consumer 也不知道訊息從哪個 producer 來。這種解耦是 pub/sub 模式的核心,讓兩端可以獨立部署、獨立擴展、獨立故障。

相關術語: Topic (透過 topic 互動)、Message broker / streaming platform (連到中間層)

出處:第 4 段「基本詞彙與核心想法:計算與儲存分離」

Topic

主題(具名頻道)

訊息的具名 channel(如 driver-locations、payment-events);producer 寫入 topic,consumer 從 topic 讀取。

topic 是邏輯上的訊息分類。在 Pulsar 裡完整名稱是 persistent://tenant/namespace/topic。topic 可以再切成 partition 以平行處理,但本片沒有討論 partition。Pulsar 支援百萬級 topic,所以「每個裝置一個 topic」是合理設計。

相關術語: Producer / Consumer (兩端角色)、Tenant / Namespace / Topic 階層 (位於階層最底層)

出處:第 4 段「基本詞彙與核心想法:計算與儲存分離」

Compute/Storage 分離

計算/儲存分離

把「處理訊息收發」與「持久保存訊息資料」放在不同的機器層,讓兩者可以獨立擴展。定義 Pulsar 架構的核心想法。

這是近十年資料系統的共同趨勢(Snowflake、BigQuery、Kafka 的 tiered storage 也是朝這方向)。好處是兩個維度獨立擴縮、計算節點可隨時替換;代價是多一次網路跳躍(broker → bookie),延遲略高於本機磁碟。

相關術語: Stateless broker (計算層)、Apache BookKeeper (儲存層)、Rebalancing (消除此痛點)

出處:第 4 段「基本詞彙與核心想法:計算與儲存分離」

Rebalancing

再平衡(資料重新分佈)

Kafka 在新增 broker 時,為了平衡負載而把既有資料實體複製到新機器的過程;大叢集上可能耗時數小時並影響效能。

Kafka 的 partition reassignment:新增 broker 後要把部分 partition 的 leader 與 replica 移過去,過程中需要複製整個 partition 的歷史資料。大 partition 可能是數百 GB,搬遷期間佔用網路與磁碟 I/O,也是 Kafka 運維最常見的痛點之一。

相關術語: Compute/Storage 分離 (被此設計避免)、Apache Kafka (Kafka 的痛點)

出處:第 4 段「基本詞彙與核心想法:計算與儲存分離」

見仁見智 4:04
「Kafka has to physically copy huge amounts of existing data over, just called rebalancing. And then on a big cluster, this can take hours and hurt performance while it's happening.」
對「本機磁碟存全部資料」的傳統 Kafka 成立;但 Kafka 3.9(2024)起 tiered storage 已可正式使用,歷史資料放在物件儲存,partition 搬遷只需搬本機的熱資料段,「數小時」的情況已大幅縮小。另外 KRaft 模式不影響資料搬遷,作者沒有混淆這點。
依據: KIP-405 Tiered Storage,Kafka 3.6 early access、3.9 production-ready(2024-11)
留給下一段 Kafka 的耦合造成 rebalancing 之痛。Pulsar 說要分離——那具體分成哪兩層、各層做什麼?

5. 兩層架構:無狀態 broker + BookKeeper 4:12–5:25

Pulsar 把兩個工作拆成兩層。第一層 broker 只做訊息收發與 ack 追蹤,且是 stateless、不存資料,像交通指揮。第二層是儲存層,由 Apache BookKeeper 負責,節點叫 bookie;broker 收到訊息就寫進 BookKeeper,預設三份複本。好處:要更多訊息容量就加 broker,立刻上線、無需複製;要更多儲存就加 bookie,立刻接新寫入。官方說法「rapid scaling without data reshuffling」,兩個維度獨立、秒級擴展。

作者明說「going to a diagram」:broker 層與 BookKeeper 儲存層的兩層圖
4:38 · 作者明說「going to a diagram」:broker 層與 BookKeeper 儲存層的兩層圖
獨立擴展:加 broker / 加 bookie 各自不影響對方
5:05 · 獨立擴展:加 broker / 加 bookie 各自不影響對方
承上 上一段留下:Pulsar 具體分成哪兩層、各層做什麼?

推理因為要回答「怎麼拆」,作者直接給兩層。第一層是 broker:只做訊息收發——接收 producer 的訊息、派送給 consumer、追蹤 ack——而且是 stateless,不在自己磁碟存任何訊息資料,作者比喻為交通指揮。第二層是儲存層,由另一個 Apache 專案 BookKeeper 負責,其節點叫 bookie;broker 收到訊息就寫進 BookKeeper,BookKeeper 耐久保存並複製到多個 bookie(預設三份)。這樣拆的收穫是:需要更多訊息處理能力就加 broker,因為它不帶資料所以立即上線、沒東西要複製;需要更多儲存就加 bookie,立即接收新寫入、不用重排既有資料。官方口號「rapid scaling without data reshuffling」,兩個維度各自獨立、秒級而非小時級。

AI 補充投影片左半是兩層圖(producer/consumer → brokers → bookies,附 3× replication 放大鏡),右半是「payoff」:加 broker 的天平顯示 capacity 增加、data copying 為零;加 bookie 則 new writes 立即開始。這裡有個容易誤解的點:「加 bookie 不用 reshuffle」不代表舊資料會自動平均分佈到新 bookie——舊資料留在原處,只是新寫入會用到新節點;這對擴容來說已足夠,因為訊息系統的寫入壓力永遠在「新資料」上。另外 BookKeeper 本身是一個獨立的分散式 write-ahead log 服務,Pulsar 只是它的使用者之一,這也是為什麼儲存層能被單獨演進。

術語:Broker(Pulsar)Stateless broker

Broker(Pulsar)

Pulsar 代理節點

Pulsar 的訊息層節點:接收訊息、派送給 consumer、追蹤 ack;不儲存訊息資料本身。

每個 topic 在任一時刻由一個 broker 擁有(ownership),該 broker 負責這個 topic 的所有讀寫;ownership 記錄在 metadata store,broker 掛掉時 topic 會被別的 broker 接管,因為資料不在 broker 上所以接管很快。

相關術語: Stateless broker (性質)、Apache BookKeeper (把資料寫到)

出處:第 5 段「兩層架構:無狀態 broker + BookKeeper」

Stateless broker

無狀態代理

broker 不在本機磁碟保存任何訊息資料,所有狀態都在儲存層與協調層;因此可以隨時增減而不需搬資料。

「無狀態」是相對的:broker 在記憶體有快取與 consumer 的游標,但沒有任何「只有這台才有」的持久資料。這讓 broker 可以像 web server 一樣放在自動擴縮群組裡,而不需要考慮資料搬遷。

相關術語: Broker(Pulsar) (描述對象)、Compute/Storage 分離 (分離的結果)、Cloud-native (cloud-native 前提)

出處:第 5 段「兩層架構:無狀態 broker + BookKeeper」

Apache BookKeeper

Apache BookKeeper(分散式日誌儲存)

Pulsar 的儲存層,一個獨立的 Apache 分散式日誌儲存專案;負責把訊息耐久寫入並跨節點複製。

原本是 Hadoop HDFS NameNode 的 edit log 儲存,後來獨立為通用的分散式 write-ahead log 服務。核心單位是 ledger:只能追加、一旦關閉就不可變。寫入時可設定 ensemble(用幾台)、write quorum(寫幾份)、ack quorum(幾份確認才算成功)。

相關術語: Bookie (由 bookie 組成)、Replication

出處:第 5 段「兩層架構:無狀態 broker + BookKeeper」

Bookie

BookKeeper 儲存節點

BookKeeper 叢集中的單一儲存節點。

每個 bookie 用 journal(順序寫、fsync)保證耐久性,再非同步整理到 entry log 供讀取。這種設計讓寫入延遲穩定。bookie 之間不互相溝通,由 client(這裡是 broker)負責把資料寫到多個 bookie。

相關術語: Apache BookKeeper (所屬叢集)

出處:第 5 段「兩層架構:無狀態 broker + BookKeeper」

Replication(複本)

複本

同一筆資料在多個 bookie 上各存一份(Pulsar 預設三份),任一台故障資料仍在。

broker.conf 預設 ensemble / write quorum / ack quorum 都是 2;生產環境常設成 3-3-2:每則訊息寫到三個 bookie,兩個確認就回 ack 給 producer,第三份非同步完成,兼顧耐久性與延遲。

相關術語: Apache BookKeeper (由它執行)、Bookie (跨 bookie 存放)

出處:第 5 段「兩層架構:無狀態 broker + BookKeeper」

見仁見智 4:52
「stores it durably and replicates it across multiple bookies, three copies by default」
Pulsar broker.conf 的預設是 managedLedgerDefaultEnsembleSize=2 / WriteQuorum=2 / AckQuorum=2,也就是預設兩份;三份是官方文件與多數生產部署的建議值,不是「預設」。standalone 模式更只有一份。
依據: apache/pulsar conf/broker.conf 預設值;Pulsar 文件 BookKeeper persistence policies
留給下一段 兩層都無狀態或分散了,那「哪個 broker 負責哪個 topic、某段資料存在哪幾個 bookie」這些對應關係由誰記得?

6. 協調層、ledger 分段與 tiered storage 5:25–6:31

誰記得哪個 broker 擁有哪個 topic、資料段在哪?metadata 存在 Apache ZooKeeper(通常三台高可用),是共享的 source of truth;新版正在改用替代方案,概念上就是一個協調大腦。資料不是一個大檔,而是切成 segment(Pulsar 叫 ledger)分散在多個 bookie,所以單一 topic 的歷史不會困在一台機器上;這也讓 tiered storage 成為可能:冷資料自動推到 S3 之類的物件儲存,熱資料留在本地。收束:stateless broker 管訊息、bookie 管耐久複製儲存、ZooKeeper 管 metadata,各自獨立且即時擴展。

ZooKeeper 作為 broker 與 bookie 之間的協調層
5:40 · ZooKeeper 作為 broker 與 bookie 之間的協調層
ledger 分段分散到多個 bookie,以及 tiered storage 推到 S3
6:12 · ledger 分段分散到多個 bookie,以及 tiered storage 推到 S3
承上 上一段留下:broker 與資料的對應關係由誰記得?

推理因為 broker 無狀態、資料又分散,作者引入第三個角色:metadata 存在 Apache ZooKeeper(通常三台高可用小叢集),它是系統的共享 source of truth,記錄哪個 broker 擁有哪個 topic、資料段在哪些 bookie。他補充新版正轉向 ZooKeeper 的替代品,但概念上就是「一個協調大腦」。接著說明資料在儲存層的實體形狀:不是一個大檔,而是切成 segment(Pulsar 叫 ledger)散佈在多個 bookie,所以單一 topic 的歷史不會被困在一台機器;這既是擴展順暢的原因,也讓 tiered storage 成為可能——冷資料自動推到 S3 之類的便宜物件儲存,熱資料留在本地保持快。最後他把三個角色收束成一句:stateless broker 管訊息、bookie 管耐久複製儲存、ZooKeeper 管 metadata,各自獨立且即時擴展,這就是 Pulsar 的核心。

AI 補充投影片下半三格對應這段三個概念:左「coordination brain」(大腦圖示連到 broker 與 bookie)、中「distributed ledgers」(topic history 被切成 L1、L2、L3…分散)、右「tiered storage」(舊 ledger 推向雲端)。ledger 是理解 Pulsar 擴展性的關鍵:一個 topic 的資料 = 一串 ledger,每個 ledger 各自選一組 bookie 存放,所以「加 bookie」後新開的 ledger 自然落到新節點,這就是上一段「不用 reshuffle」的實作原因。作者提到的 ZooKeeper 替代方案,實務上指的是 Pulsar 可插拔的 metadata store(例如以 etcd 或 Oxia 取代),目的是拿掉 ZooKeeper 這個運維負擔。

術語:Apache ZooKeeper / Metadata storeLedger(segment)

Apache ZooKeeper / Metadata store

ZooKeeper/中繼資料儲存

保存系統 metadata(topic 歸屬、ledger 位置)的高可用小叢集,是所有 broker 與 bookie 共享的 source of truth;新版 Pulsar 可換成其他實作。

ZooKeeper 是一個小型、強一致的分散式 KV 與協調服務,長期被 Kafka、HBase、Pulsar 用來存 metadata 與做 leader 選舉。缺點是要另外維運、規模有限。Pulsar 2.10+ 把 metadata store 做成可插拔介面,可換 etcd 或 StreamNative 的 Oxia。

相關術語: Source of truth (扮演此角色)、Broker(Pulsar) (記錄 topic 歸屬)

出處:第 6 段「協調層、ledger 分段與 tiered storage」

Source of truth

唯一權威來源

系統中唯一被視為權威的狀態來源;其他元件的認知都以它為準。

分散式系統中必須有一個地方對「誰擁有什麼」做最終裁決,否則兩個 broker 可能同時認為自己擁有同一個 topic(腦裂)。metadata store 提供強一致的讀寫與 lock,扮演這個角色。

相關術語: Apache ZooKeeper / Metadata store (由它提供)

出處:第 6 段「協調層、ledger 分段與 tiered storage」

Ledger(segment)

分段帳本

Pulsar 儲存資料的基本分段單位:一個 topic 的歷史由一串 ledger 組成,每個 ledger 分散存在不同 bookie 上。

一個 topic 的資料由一串 ledger 組成:目前開啟的 ledger 接收寫入,達到大小或時間上限就關閉、開新的。每個 ledger 各自選一組 bookie,所以新 bookie 加入後自然會被新 ledger 用到——這就是「不用 reshuffle」的實作機制。

相關術語: Bookie (分散存放於)、Tiered storage (可整段卸載)

出處:第 6 段「協調層、ledger 分段與 tiered storage」

Tiered storage

分層儲存

依冷熱把資料放在不同成本的儲存層:較舊的 ledger 自動卸載到 S3 等物件儲存,近期資料留在 bookie 上。

已關閉的 ledger 是不可變的,正好適合搬到 S3/GCS 這類物件儲存。搬走後 topic 仍可讀取舊資料(由 broker 透明地從物件儲存讀),只是延遲較高。這讓「保留全部歷史」的成本大幅下降。

相關術語: Ledger(segment) (以 ledger 為單位)

出處:第 6 段「協調層、ledger 分段與 tiered storage」

留給下一段 架構講完了:分離的三個角色、分段的資料。那這樣的架構具體換來哪些別人做不到的能力?

7. 架構帶來的五個優勢 6:31–8:20

一、多租戶是一等公民:tenant → namespace → topic 三層階層,一個叢集可安全服務整個組織,各團隊有獨立存取控制與資源政策(Yahoo 原始需求,Kafka 沒有原生支援)。二、geo-replication 開箱即用,且支援自動 client failover。三、單叢集可達百萬 topic,可以每個使用者/裝置一個 topic。四、彈性訂閱型態:逐筆 ack(RabbitMQ 風格,適合任務佇列)或累積 ack(Kafka offset 風格,適合有序串流),這就是「messaging 與 streaming 合一」的具體化。五、Pulsar Functions:內建的輕量 serverless 計算,用 Java/Python/Go 寫小函式做過濾、路由、轉換、豐富化,不必另起串流處理系統。

tenant / namespace / topic 三層階層圖
6:42 · tenant / namespace / topic 三層階層圖
兩種 ack 模式(individual vs cumulative)的對照
7:42 · 兩種 ack 模式(individual vs cumulative)的對照
承上 上一段留下:分離架構具體換來哪些能力?

推理因為架構已建立,作者逐一推出五個優勢,每個都能對回架構。一、multi-tenancy 是一等公民:topic 組織成 tenant → namespace → topic 三層,一個實體叢集可安全服務整個組織,各團隊有獨立存取控制與資源政策——這是 Yahoo 的原始需求,Kafka 沒有原生支援。二、geo-replication 開箱即用,策略彈性,且獨特地支援自動 client failover:整個區域掛掉,client 自動切到健康叢集。三、單叢集可達百萬 topic,因為儲存是分散的;這解鎖「每個使用者/裝置一個專屬 topic」的設計,不必把大家塞進幾個共享 channel 再過濾。四、彈性訂閱型態:可以逐筆 ack(RabbitMQ 風格,適合任務佇列)也可以累積 ack(Kafka offset 風格,適合有序串流)——同一系統、兩種模型,這就是「messaging 與 streaming 合一」的具體實現。五、Pulsar Functions:內建的輕量 serverless 計算,用 Java/Python/Go 寫小函式在訊息到達時做過濾、路由、轉換、豐富化,簡單處理不必另起一套串流處理系統。

AI 補充投影片把五項排成一張圖,值得對照架構看:百萬 topic 之所以可能,是因為 topic 資料是 ledger 分段而非每 topic 一個實體檔案;geo-replication 能做到 client failover,是因為 broker 無狀態、資料在儲存層有複本。第四項回應了最早「queue vs streaming 二選一」的痛:差別只在 consumer 怎麼 ack,Pulsar 讓同一個 topic 支援兩種訂閱方式。作者這裡對「multi-tenancy Kafka 不原生支援」說得略重——Kafka 有 ACL 與 quota,但沒有 tenant/namespace 這種一等結構,隔離要靠命名慣例與外部工具拼湊。

術語:Tenant / Namespace / Topic 階層

Tenant / Namespace / Topic 階層

租戶/命名空間/主題 三層結構

Pulsar 的三層命名結構:tenant 對應組織單位(團隊),namespace 對應一組相關 topic 的政策範圍,topic 是實際 channel。隔離與配額掛在 tenant 與 namespace 上。

tenant 掛認證與授權(誰能用)、namespace 掛政策(保留期、配額、複製到哪些叢集、schema 規則)、topic 是實際資料。政策在 namespace 層設定一次,底下所有 topic 自動繼承,這是管理數萬 topic 時必要的抽象。

相關術語: Multi-tenant(多租戶) (實作多租戶)、Topic (最底層)

出處:第 7 段「架構帶來的五個優勢」

Geo-replication

跨地域複製

把 topic 資料自動複製到其他地理區域的叢集,策略可設定。

在 namespace 層設定要複製到哪些叢集;broker 會把訊息非同步轉送到遠端叢集。可以做雙向(active-active)或單向(災備)。與 Kafka 需要外掛 MirrorMaker 不同,Pulsar 內建。

相關術語: Client failover (搭配使用)、Replication(複本) (跨區域版本)

出處:第 7 段「架構帶來的五個優勢」

Client failover

客戶端自動切換

當整個區域的叢集不可用時,client 自動改連到健康的叢集,不需人工介入。

Pulsar client 可以設定多個叢集 URL 與健康檢查;主叢集不可用時自動切到備援叢集。搭配 geo-replication,應用程式不需要改碼就能跨區域容錯。

相關術語: Geo-replication (依賴)

出處:第 7 段「架構帶來的五個優勢」

Subscription type(訂閱型態)

訂閱型態

consumer 消費同一 topic 的方式:逐筆 ack(individual,queue 風格)或累積 ack(cumulative,offset 風格);Pulsar 允許同一系統同時支援。

Pulsar 有四種:Exclusive(單一 consumer、保序)、Failover(主備、保序)、Shared(多 consumer 輪詢、不保序、適合 queue)、Key_Shared(依 key 分配、同 key 保序)。本片講的「逐筆 ack vs 累積 ack」是 ack 方式,跟訂閱型態搭配使用。

相關術語: Acknowledge (ack) (決定 ack 方式)、Message queuing (逐筆 ack 對應)、Streaming (累積 ack 對應)

出處:第 7 段「架構帶來的五個優勢」

Pulsar Functions

Pulsar 函式(內建輕量計算)

內建於 Pulsar 的輕量 serverless 計算:以 Java/Python/Go 寫小函式,在訊息流經時做過濾、路由、轉換、豐富化。

函式從一或多個 topic 讀入、處理後寫到輸出 topic,由 Pulsar 自己排程執行(可跑在 broker 內、獨立 process 或 Kubernetes)。適合無狀態或簡單狀態的轉換;複雜的視窗、join 仍應交給 Flink 這類串流引擎。

相關術語: Topic (讀寫 topic)

出處:第 7 段「架構帶來的五個優勢」

見仁見智 6:57
「this was a Yahoo requirement from the start, and something that Kafka just doesn't do natively」
Kafka 沒有 tenant/namespace 這種一等結構是事實,但它原生有 ACL、quota(per client/user 的頻寬與請求配額)與 topic 命名前綴慣例,可以拼出多租戶隔離;說「完全不做」偏重,說「沒有一等公民的多租戶抽象」較準確。
依據: Kafka 文件 Security/Authorization 與 Quotas 章節
留給下一段 能力清單有了,但能力要落到場景才有意義:真實公司拿這些能力做什麼?

8. 誰在用、用來做什麼 8:20–9:30

四類用途:一、公司級訊息平台,把 Kafka、RabbitMQ、ActiveMQ、SQS 合併成一個多租戶 Pulsar,只維運一套。二、任務佇列:影片轉檔、縮圖、背景工作,靠 shared subscription 與逐筆 ack。三、可擴展的 RPC:服務透過 topic 而非直接 API 互通,因為 topic 便宜所以可行。四、關鍵任務應用:銀行、支付、訂單,訊息先複製到多個 bookie 並寫入磁碟才回 ack,機器斷電資料也在。

多套系統整併為單一 Pulsar 平台的示意
8:30 · 多套系統整併為單一 Pulsar 平台的示意
承上 上一段留下:真實公司拿這些能力做什麼?

推理因為能力要落到場景,作者列四類用途,每類對應前面某項能力。一、公司級訊息平台:把 Kafka、RabbitMQ、ActiveMQ、SQS 通通整併成一個多租戶 Pulsar,只維運一套技術,不同團隊的服務互通變得簡單——這靠 multi-tenancy 與兩種模型合一。二、任務佇列:影片轉檔、縮圖、按鈕觸發的背景工作,需要分派給一池 worker 並可靠 ack——Pulsar 的 shared subscription 與逐筆 ack 原生支援。三、可擴展的 RPC:服務透過 topic 而非直接 API 呼叫互通,因為 Pulsar 的 topic 便宜到可以每個請求路徑一個,其他系統會貴到做不起。四、關鍵任務應用:銀行、支付、訂單處理,掉一則訊息就不可接受;Pulsar 保證訊息複製到多個 bookie 並寫入磁碟後才回 ack 給應用,機器斷電資料也在。

AI 補充畫面是 Pulsar 官網的 use cases 頁:Cisco IoT(數億裝置、跨多個 Kubernetes 叢集、取代舊 message queue)、vivo(監控架構)、Netdata(每個 agent 一個專屬 topic)、以及 Huawei、Verizon Media。Netdata 的例子正是「百萬 topic」能力的實際用法。第四類的耐久性保證值得展開:「複製到多個 bookie 且落盤後才 ack」意味著 producer 收到 ack 的那一刻資料已經在多台機器的磁碟上,這是比 Kafka 預設(acks 可設、fsync 通常延後)更強的預設保證,代價是寫入延遲略高。

術語:RPC over topicsDurable write(落盤後 ack)

Shared subscription

共享訂閱

多個 consumer 共用同一個訂閱,訊息以輪詢方式分派給其中一個 consumer;搭配逐筆 ack 就是典型的工作佇列。

多個 consumer 掛在同一個 subscription 名稱下,broker 以 round-robin 把訊息分派給其中一個;某個 consumer 沒 ack 就重派給別人。這正是傳統工作佇列的語意,也是 Pulsar 能取代 RabbitMQ 的關鍵。

相關術語: Subscription type(訂閱型態) (是其中一種)、Message queuing (實現 queue 語意)

出處:第 8 段「誰在用、用來做什麼」

RPC over topics

以主題實作遠端呼叫

服務之間不直接呼叫 API,而是把請求與回應都放進 topic 傳遞;需要系統能便宜地支撐大量 topic。

請求放進 request topic、回應放進 reply topic(常常每個 client 一個),中間由 broker 轉送。好處是自動得到緩衝、重試、解耦;代價是延遲比直接 HTTP 高。只有在 topic 很便宜的系統上才划算。

相關術語: Topic (建立在 topic 上)

出處:第 8 段「誰在用、用來做什麼」

Durable write(落盤後 ack)

耐久寫入(落盤後確認)

訊息先複製到多個 bookie 並寫入磁碟,系統才向 producer 回 ack;保證 ack 之後的資料不會因單機故障或斷電遺失。

Pulsar 的預設路徑是:broker → 寫到多個 bookie → bookie 寫 journal 並 fsync → 達到 ack quorum → broker 回 ack 給 producer。所以 producer 一旦拿到 ack,資料已在多台機器的磁碟上。Kafka 可以設到同等強度(acks=all + 調整 flush),但預設不是。

相關術語: Replication(複本) (先複製再 ack)、Acknowledge (ack) (ack 的時機)

出處:第 8 段「誰在用、用來做什麼」

留給下一段 四類用途各自對回一項能力,能力又各自對回分離架構。所以「為什麼這些大公司選它」的答案應該可以收束成幾句話。

9. 為什麼在流行與收尾 9:30–10:04

為什麼大公司採用:cloud-native 的分離式架構、整併多套系統、能在那個規模下維運。作者收尾:這是入門介紹,若想看實際怎麼用請留言。

承上 上一段留下:「為什麼大公司選它」應該能收束成幾句話。

推理因為前面已把用途對回能力、能力對回架構,作者的收束很短:一、cloud-native 的分離式架構;二、整併多套系統為一套;三、能在那種規模下維運。這三點分別就是本片第二部分(架構)、第一部分(queue 與 streaming 合一)、第三部分(能力)的濃縮。最後他說明這只是入門,若想看實際怎麼使用 Pulsar,請留言,他會再做後續。

AI 補充作者的三句收束其實漏了一個他自己前面強調過的點:「不掉資料」的耐久性保證,這是金融類採用者的主因。另外,影片完全沒碰的面向是運維成本與生態:Pulsar 需要 broker + bookie + metadata store 三種元件,比 Kafka(尤其 KRaft 模式後只剩 broker)多;而 Kafka 的 connector、串流處理(Kafka Streams、Flink 整合)生態更成熟。這些是選型時要自己補的功課,也是下一步值得看的方向。

留給下一段 總結收束

4. 總結

影片建立了一條推理鏈:服務間資料流動需要中間層(message broker)→ 中間層歷史上分成 queue 與 streaming、必須二選一並養兩套 → Pulsar 提案一個平台做兩種 → 做得到的原因是 compute 與 storage 分離:stateless broker 只管訊息、BookKeeper 的 bookie 管耐久複製儲存、ZooKeeper(或替代品)管 metadata,資料切成 ledger 分散存放 → 分離帶來五個能力(multi-tenancy、geo-replication 與 client failover、百萬 topic、兩種 ack 型態、Pulsar Functions)→ 能力落到四類用途(公司級訊息平台、任務佇列、topic 上的 RPC、不可掉訊息的關鍵應用)→ 這就是大公司採用的理由。整條鏈的樞紐是「分離」:擴展其中一維不需要搬動另一維的資料。

勘誤總整理

確定錯誤/已過時見仁見智(取決於版本或情境)

段落原話(transcript 逐字)說明
4. 基本詞彙與核心想法:計算與儲存分離
4:04
「Kafka has to physically copy huge amounts of existing data over, just called rebalancing. And then on a big cluster, this can take hours and hurt performance while it's happening.」對「本機磁碟存全部資料」的傳統 Kafka 成立;但 Kafka 3.9(2024)起 tiered storage 已可正式使用,歷史資料放在物件儲存,partition 搬遷只需搬本機的熱資料段,「數小時」的情況已大幅縮小。另外 KRaft 模式不影響資料搬遷,作者沒有混淆這點。
依據: KIP-405 Tiered Storage,Kafka 3.6 early access、3.9 production-ready(2024-11)
5. 兩層架構:無狀態 broker + BookKeeper
4:52
「stores it durably and replicates it across multiple bookies, three copies by default」Pulsar broker.conf 的預設是 managedLedgerDefaultEnsembleSize=2 / WriteQuorum=2 / AckQuorum=2,也就是預設兩份;三份是官方文件與多數生產部署的建議值,不是「預設」。standalone 模式更只有一份。
依據: apache/pulsar conf/broker.conf 預設值;Pulsar 文件 BookKeeper persistence policies
7. 架構帶來的五個優勢
6:57
「this was a Yahoo requirement from the start, and something that Kafka just doesn't do natively」Kafka 沒有 tenant/namespace 這種一等結構是事實,但它原生有 ACL、quota(per client/user 的頻寬與請求配額)與 topic 命名前綴慣例,可以拼出多租戶隔離;說「完全不做」偏重,說「沒有一等公民的多租戶抽象」較準確。
依據: Kafka 文件 Security/Authorization 與 Quotas 章節

5. 推薦三個下一步

1. 往下挖深:BookKeeper 與 ledger 的實際運作

本片把「加 bookie 不用 reshuffle」當結論講,但沒說 ledger 怎麼開新、怎麼選 bookie、故障時怎麼恢復;這是理解 Pulsar 可靠性與延遲的關鍵缺口。

YouTube 搜尋:Apache BookKeeper architecture Pulsar ledger ensemble write quorum Pulsar segment storage explained

2. 往旁邊對照:Pulsar vs Kafka 的實務取捨

本片幾乎只講 Pulsar 的優點;作者自己也略過了運維複雜度(三種元件)與生態成熟度(connector、Flink 整合)。選型需要另一邊的觀點。

YouTube 搜尋:Pulsar vs Kafka 2025 Kafka KRaft tiered storage why we moved from Kafka to Pulsar

3. 往上應用:動手跑一個 Pulsar 並寫 producer / consumer

作者在片尾說「怎麼實際用」留待下一支;把 topic、subscription type、Pulsar Functions 親手跑一次,才能把五個能力從名詞變成操作。

YouTube 搜尋:Apache Pulsar tutorial docker Pulsar Python client producer consumer Pulsar Functions example

📄 全部影片 · 主題區: 訊息與串流系統