🗺️ GCP 服務地圖
應用整合與 IoT・訊息與事件・ACE/PCD/PDE

Pub/Sub:訂閱、確認與無效信件主題

訊息送出去之後,誰來拿、多久要回覆、沒回覆會怎樣、一直失敗又該送去哪裡?把確認期限、重試政策與無效信件主題設對,訊息才不會重複處理,也不會讓一則壞訊息拖住整條流程。

傳遞模擬:逾時重送與無效信件 10 張情境卡選對服務 主控台 × gcloud × Terraform 同步操作

💡 先搞懂問題

虛構的「晴空食品」有一套線上訂購系統。顧客送出訂單後,系統要通知倉庫備貨、請帳務系統開發票、替會員加點數,還要把訂單寫進資料倉儲做報表。第一版的寫法是下單 API 依序呼叫這四個服務,全部成功才回應顧客。上線之後,倉庫系統每天凌晨更新要停機十分鐘,這段時間的訂單全部失敗;母親節檔期一開跑,請求一路壓到帳務系統,整個網站跟著變慢;行銷部門想再接一個推薦系統,工程師只好又改一次下單程式、重新測試部署。

這是典型的緊耦合(tight coupling):上游要等下游回應,下游一慢、一掛,上游就跟著失敗;每多一個下游,上游就多一段程式。解法是解耦(decoupling):下單服務只負責宣布「有一筆新訂單」,至於誰要處理、什麼時候處理、失敗要不要重試,交給中間那一層和各個下游自己決定。在 Google Cloud 上,這一層最常用的就是 Pub/Sub:發布者(publisher)把訊息送到主題(topic),每個訂閱(subscription)各自收到一份,訂閱背後的程式(訂閱者,subscriber)處理完要回覆確認(acknowledge,簡稱 ack)。

之前:下單時依序呼叫每個下游(同步) 訂單服務 倉庫(停機中) 帳務 會員點數 一個下游掛掉,下單就失敗每加一個下游,就要改一次下單程式 之後:發布到 Pub/Sub 主題(非同步) 訂單服務發布完就回應 主題 倉庫的訂閱 帳務的訂閱 點數的訂閱 倉庫(停機中) 帳務照常處理 點數照常處理 倉庫停機時,訊息留在它的訂閱裡等它回來(訂閱預設保留未確認訊息 7 天)
解耦的重點是把「通知」和「處理」分開。訂單服務只要把訊息成功發布到主題就能回應顧客;任何一個下游停機、變慢或要擴充,都不會反過來拖累下單。

生活比喻:報社發報與訂戶簽收

想像一家報社。編輯部每天出一份報紙,不需要知道是誰在看,只要把報紙交給發行部。發行部手上有一份訂戶名冊,名冊上每一戶都會收到一份完整的報紙,多一戶就多印一份,少一戶也不影響其他人。有些訂戶是一整間公司,公司收發室收到報紙後,交給當天有空的同事分頭剪報,同一份報紙只要一位同事處理就好。

報紙送到之後,訂戶要在送報員規定的時間內簽收。沒簽收,送報員就當作沒送到,晚點再送一次;有些訂戶故意不簽,是因為報紙被雨淋濕了,請送報員再送一份。如果同一份報紙送了五次都沒人簽收,發行部不會無止境地送下去,而是把它轉到客服部的「異常件」櫃,等客服人員來查原因。

回到 Google Cloud:報社的編輯部是發布者,每天那份報紙就是主題上的訊息(message)。訂戶名冊上的每一戶是一個訂閱,每個訂閱都收到一份完整副本,這就是扇出(fan-out);公司收發室把報紙分給有空的同事,對應同一個訂閱底下的多個訂閱者分攤訊息。規定的簽收時間是確認期限(ack deadline),「沒簽收就再送」是逾時重送,「淋濕了請再送」是否定確認(negative acknowledgment,nack);送幾次的上限是最大傳遞次數(maximum delivery attempts),客服的異常件櫃就是無效信件主題(dead-letter topic)。
報社發報(比喻) Pub/Sub 的正式名稱 編輯部出報,不管誰在看 名冊上每一戶各收一份 收發室分給有空的同事 規定時間內簽收,沒簽就再送 淋濕了,請送報員再送 送五次沒人簽,轉客服 發布者 → 主題 多個訂閱:扇出(像 SNS) 同訂閱多訂閱者:分攤(像 SQS) 確認期限(ack deadline) 否定確認(nack)+重試政策 最大傳遞次數+無效信件主題
左欄是比喻,右欄是正式名稱。第二列與第三列合起來,就是 Pub/Sub 一個服務同時做到 Amazon SNS 的扇出與 Amazon SQS 的佇列分攤;後三列是實驗室一要模擬的行為。

這個比喻有三個地方和實際不同,剛好也是考試常考的地方。第一,報社一份報紙只送一次,但 Pub/Sub 預設是至少傳遞一次(at-least-once),偶爾同一則訊息會送到兩次,而且不保證順序,所以處理程式要寫成重複執行也不會出錯,也就是等冪(idempotent);真的要避免重送,可以在提取訂閱開啟恰好一次傳遞(exactly-once delivery),要依序就用排序鍵(ordering key)。第二,送報員會依自己的路線決定什麼時候補送,Pub/Sub 則讓你在訂閱上設定重試政策(retry policy):預設是立即重送,也可以改成指數退避(exponential backoff),每次失敗後等久一點再送。第三,客服的異常件櫃一定有人看,但無效信件主題只是另一個主題,它底下沒有訂閱的話,轉過去的訊息就會遺失,而且 Pub/Sub 要有權限才能把訊息轉過去,這兩點在操作教學會實際設定。

多個訂閱:每個都收一份同一訂閱:訂閱者分攤 主題 訂閱 A 訂閱 B 訂閱 C 發布 2 則,每個訂閱都有 2 則 對應 Amazon SNS 的扇出 主題 一個訂閱 訂閱者 1 訂閱者 2 訂閱者 3 每則訊息只交給其中一位 對應 Amazon SQS 的佇列 方塊代表訊息,數量為示意
同一則訊息「給幾份」看的是訂閱數,「給誰處理」看的是訂閱底下有幾個訂閱者。AWS 上要 SNS 主題加多條 SQS 佇列才能組出左右合併的效果,Pub/Sub 一個服務就涵蓋了,這也是從 AWS 轉過來最常見的觀念轉換。

新手最常卡在哪裡

第一個坑是確認期限比處理時間短:確認期限預設只有 10 秒,處理一筆要 30 秒的程式還沒做完,訊息就被重送給別人,同一張訂單出貨兩次;用 Google 提供的用戶端程式庫時,程式庫會自動延長期限(租約管理),但直接呼叫 API 或用推送訂閱時,就要自己把期限設對。第二個坑是沒有設無效信件主題:一則格式錯誤的訊息每次處理都失敗,就一直被重送,佔用訂閱者,開了排序時還會卡住同一個排序鍵後面的所有訊息。第三個坑是設了無效信件主題卻沒給權限、或沒替它建訂閱:Pub/Sub 轉不過去,或轉過去卻沒人收。第四個坑是選錯服務:把 Pub/Sub 當成可以指定時間、控制速率的工作佇列,或拿它做多步驟流程。實驗室一處理前三個坑,實驗室二處理第四個。

🎮 互動實驗室一:Pub/Sub 傳遞模擬器

晴空食品的主題 orders 上有一個倉庫用的訂閱 orders-warehouse,裡面有 5 筆訂單,由三個訂閱者(或推送端點的三個處理槽)同時處理。其中訂單 #102 的地址格式錯誤,是一則毒訊息(poison message):每次處理到第 3 秒就失敗並回覆否定確認。左邊調整訂閱類型、確認期限、正常訂單的處理時間、最大傳遞次數、重試政策,以及要不要設無效信件主題、自動延長期限、恰好一次傳遞與訊息排序;右邊按「下一個事件」一步一步看訊息被交付、確認、逾時重送,或被轉到無效信件主題,也可以按「自動播放」或「跳到結束」。設定一改,模擬就從頭開始。跑完會檢查下方三個挑戰目標,並說明原因。

一、訂閱設定

傳遞類型
預設 10 秒,可設 10~600 秒。推送訂閱時,它同時是推送請求的逾時時間。
處理一筆正常訂單需要的時間(示意)。毒訊息固定在第 3 秒失敗。
5~100,預設 5;只有設定了無效信件主題才會計算與生效。
重試政策(retry policy)

二、挑戰目標

模擬時間 t = 0 秒
訂閱 orders-warehouse 的待處理訊息 提取訂閱
無效信件主題 orders-dlq → orders-dlq-sub
成功確認 0 / 4
重複處理 0 次
轉到無效信件 0
傳遞次數合計 0
    按「下一個事件」開始。
    畫面說明:載入中。

    行為依 Pub/Sub 官方文件「Dead-letter topics」「Subscription retry policy」「Exactly-once delivery」「Order messages」「Push subscriptions」與 gcloud 指令參考(查證時間 2026 年 10 月)。為了看得懂,模擬做了幾個簡化:時間以秒為單位、每個訂閱者一次只處理一則、閒置的訂閱者會立刻拿到下一則;指數退避的等待時間用「10 秒起、每次加倍、最長 600 秒」示意,官方只保證介於你設定的最小與最大值之間逐次拉長;官方說明最大傳遞次數是「大約」,實際可能多幾次或少幾次才轉送,模擬一律剛好在達到上限時轉送。沒開恰好一次傳遞時,「至少一次」的偶發重送在真實環境無法預測,模擬固定讓 #202 在確認後 2 秒被重送一次來呈現;期限過後才送達的確認,若訊息還沒被重新交付,模擬當作確認成功(盡力而為),若已重新交付就當作無效。推送訂閱的整體退避(100 毫秒~60 秒)與推送視窗沒有模擬。

    🎮 互動實驗室二:情境分診,這該用哪個服務?

    下面有 10 張虛構公司的情境卡。讀完情境與卡片下方的關鍵需求,從 8 個選項裡點一個最適合的服務或 Pub/Sub 訂閱類型,畫面會立即說明對錯與原因;答錯也可以再點其他選項,看看差在哪裡。上方的圓點可以跳到任一張卡,全部答完會顯示總結。注意 Pub/Sub Lite 已在 2026-03-18 關閉,所以不在選項裡。

    第一次就選對 0 / 0
    選一個選項。
    畫面說明:載入中。

    🛠️ 操作教學:建立主題、訂閱與無效信件主題

    不用登入 Google Cloud,也能先把流程走一遍:選專案並啟用 Pub/Sub API、建立主題 orders、建立無效信件主題與它的訂閱、建立倉庫用的訂閱並設定確認期限、無效信件與重試政策、授予 Pub/Sub 服務代理權限、發布一則測試訊息,最後提取並確認。左邊是簡化的主控台,右邊同步顯示等效的 gcloud 指令與 Terraform,黃色底的那幾行就是目前這一步對應的內容。可以故意填錯名稱或數字看看驗證訊息,也可以改名稱、傳遞類型或重試政策,看右邊怎麼跟著變。

    示意畫面:簡化重繪,只保留和本主題有關的欄位;實際畫面以 Google Cloud 控制台為準。
    雲端主控台搜尋資源、文件與產品Pub/Sub
    同一件事的三種做法:主控台、gcloud 與 Terraform 最後呼叫的都是同一組 Pub/Sub API(建立主題、建立訂閱、設定 IAM 政策、發布、提取……),也都經過同一套 IAM 權限檢查,所以建出來的資源一樣。主控台適合第一次建立、想看每個欄位說明的時候,而且設定無效信件時,畫面會直接提示並幫你授予服務代理權限;gcloud 適合寫成腳本或在 Cloud Shell 裡快速測試,但每一步都要自己做,包括權限;Terraform 把主題、訂閱、無效信件政策與 IAM 繫結寫成可以版本控管的設定檔,適合正式環境與多個環境重複部署,練習完執行 terraform destroy,它建立的主題、訂閱與 IAM 繫結會一起刪除。想讓 Google 代管 Terraform 的執行與狀態檔,可以用 Infrastructure Manager;舊的 Deployment Manager 已經停止支援、2027-06-30 之後關閉,新專案不要再用。

    自己動手時要注意

    權限方面,建立與刪除主題、訂閱,發布與提取訊息,用 Pub/Sub 編輯者(roles/pubsub.editor)就夠;但它沒有設定 IAM 政策的權限,第 6 步替服務代理授予角色要用 Pub/Sub 管理員(roles/pubsub.admin)或專案擁有者。如果還沒啟用 Pub/Sub API,啟用時需要專案層級的服務使用權限(例如 Service Usage 管理員)。無效信件要能運作,Pub/Sub 服務代理 service-專案編號@gcp-sa-pubsub.iam.gserviceaccount.com 必須在無效信件主題上有 roles/pubsub.publisher(才能把訊息轉過去),在原本的訂閱上有 roles/pubsub.subscriber(才能把轉走的訊息從原訂閱確認掉);官方文件也提醒,權限沒設好時傳遞次數不會被計算。注意這裡要的是「專案編號」不是專案 ID,可以用 gcloud projects describe 查。推送訂閱若開啟驗證,建立訂閱的人還要能「以該服務帳戶身分執行」(iam.serviceAccounts.actAs);寫入 BigQuery 的訂閱,資料表要先建好,服務代理也要有寫入那張資料表的權限。

    費用方面,Pub/Sub 依傳輸的資料量計費,練習量通常很小;但沒設無效信件主題的毒訊息會一直重送,訊息保留與主題保留也會產生儲存費用。新帳戶的免費試用是 90 天、300 美元抵用金,另有每月的免費用量(查證日期 2026-10-08,實際條件以 Google Cloud 免費方案頁為準)。範例裡的專案一律用 my-project-id、PROJECT_NUMBER 這種佔位,不要把服務帳戶金鑰下載到電腦或寫進腳本;在 Cloud Shell 或用自己的使用者憑證(gcloud auth login)操作即可,CI/CD 等外部系統請改用 Workload Identity Federation。訊息內容不要放個資或密碼。練習完依下面的順序刪除(刪除主題不會自動刪除它的訂閱,訂閱要另外刪):

    ☁️ 對照 AWS 與 Azure 的做法:AWS 要用兩個服務組出同樣的效果:Amazon SNS 主題負責扇出,每個下游再接一條 Amazon SQS 佇列負責緩衝與重試;SQS 的可見性逾時對應確認期限,maxReceiveCount 加寄不出的信件佇列(DLQ)對應最大傳遞次數加無效信件主題,而且佇列還要另外寫存取政策讓 SNS 能送進來。可以對照 AWS 站的「SQS、SNS 與 EventBridge」互動教學。Azure 上最接近的是 Azure Service Bus:佇列對應單一訂閱的分攤,主題加訂閱對應扇出,訊息用 peek-lock 鎖定一段時間,超過最大傳遞次數就移到每個佇列或訂閱內建的寄不出信件子佇列,不必另外建主題;大量串流擷取則交給 Azure Event Hubs。可以對照 Azure 站的「訊息服務怎麼選」節點。

    📘 原理補完

    主題、訂閱、訂閱者:三層關係先分清楚

    Pub/Sub 的資源只有兩種要建立:主題與訂閱,兩者都是專案層級的全域資源,不必選 Region,也不用預先規劃分割區或分片,容量會自動擴展。訊息發布到主題時,Pub/Sub 會替主題上每一個訂閱各保留一份;訂閱建立之前發布的訊息,新訂閱預設收不到(除非主題開了訊息保留,再用 seek 回到過去的時間點)。同一個訂閱底下可以有很多個訂閱者程式,它們分攤這個訂閱的訊息,每則只交給其中一個。所以題目說「三個系統都要收到每一筆訂單」,答案是三個訂閱;說「同一個系統要加開處理程式分攤負載」,答案是同一個訂閱多開幾個訂閱者。

    幾個常用的上限與預設值(依 Pub/Sub 官方文件與本站節點,查證時間 2026 年 10 月):訊息資料最大 10 MB、每則最多 100 個屬性;每個主題最多 10,000 個訂閱;訂閱預設保留未確認訊息 7 天,可設 10 分鐘到 31 天;主題也能設訊息保留(10 分鐘到 31 天),讓訂閱用 seek 重播;訂閱閒置 31 天預設會過期刪除。訂閱還可以設篩選條件(filter),只收符合屬性的訊息,但篩選條件建立後就不能修改。

    提取(pull)推送(push)匯出(export) 訂閱 訂閱者程式GKE、VM、Dataflow 程式自己來拉、自己控速可延長租約、可開恰好一次適合常駐、高吞吐的處理 訂閱 HTTPS 端點例如 Cloud Run Pub/Sub 主動 POST 過去回 2xx 就算確認適合可縮到零的服務 訂閱 BigQuery資料表 CloudStorage Pub/Sub 直接寫入不用寫訂閱者程式只搬資料、不做轉換 PullPOST
    注意提取訂閱的箭頭方向:是訂閱者往上去拉。推送與匯出則是 Pub/Sub 主動送出。匯出訂閱目前支援 BigQuery 與 Cloud Storage(Bigtable 為 Preview);訊息需要轉換、彙總或視窗計算時,改用 Dataflow。
    項目提取訂閱推送訂閱匯出訂閱(BigQuery/Cloud Storage)
    誰發起傳遞訂閱者呼叫 Pull/StreamingPullPub/Sub 以 HTTPS POST 送到端點Pub/Sub 直接寫入目的地
    怎麼算確認程式呼叫 acknowledge端點回 102、200、201、202、204寫入成功即確認
    確認期限可由程式延長(用戶端程式庫自動處理)同時是推送請求逾時,不能對單則延長由服務處理
    恰好一次傳遞支援(訂閱者連同一 Region)不支援不支援
    排序支援支援,但每個排序鍵一次只有一則在途依目的地而定(本頁不展開)
    適合常駐、高吞吐、要自己控速無伺服器、可縮到零的服務原封不動落地分析或封存

    一則訊息的一生:確認期限、重試政策與傳遞次數

    訊息交給訂閱者那一刻開始,確認期限開始倒數(預設 10 秒,可設 10~600 秒)。期限內收到確認,這則訊息在這個訂閱就算處理完;收到否定確認,或期限到了都沒有回覆,Pub/Sub 會再傳一次。什麼時候再傳由重試政策決定:預設是立即重試,可能馬上又送回同一個訂閱者;改成指數退避後,每次失敗會等一段逐次拉長的時間,你可以設最小與最大退避(各 0~600 秒,預設 10 秒與 600 秒),而且退避是逐則訊息計算,不會拖慢其他訊息。官方也提醒,重試政策不是拿來刻意延遲訊息的工具,要排定未來時間執行請用 Cloud Tasks。

    設定了無效信件主題之後,Pub/Sub 會計算每則訊息的傳遞次數:1 加上「否定確認次數」再加上「確認期限逾時次數」。次數達到最大傳遞次數(5~100,預設 5)還是沒被確認,就轉到無效信件主題。官方特別說明這個次數是「大約」的,屬於盡力而為,可能早幾次或晚幾次轉送;訊息裡會帶著目前的傳遞次數(提取訂閱是 delivery_attempt 欄位,推送是 deliveryAttempt),程式可以據此決定要不要記錄或特別處理。

    發布者Publish 待傳遞留在訂閱裡 已交付確認期限倒數 已確認ack 重試政策立即,或指數退避後 無效信件主題底下要有訂閱才保存得住 交付 期限內確認 nack 或逾時 傳遞次數達上限, 而且設了無效信件主題 沒設:一直重試, 直到保留期間(預設 7 天)到期 傳遞次數 = 1 + 否定確認次數 + 確認期限逾時次數(大約,盡力而為)
    逾時和否定確認都算一次失敗的傳遞。所以處理時間比確認期限長時,連正常訊息都會被一直重送、把傳遞次數用光,最後被誤送進無效信件主題,實驗室一的預設設定就是在重現這件事。
    確認期限 10 秒、處理 30 秒、沒有延長租約(示意) 傳遞訂閱者 A訂閱者 B訂閱者 C 0 秒1020304050 第 1 次 第 2 次 第 3 次 A 處理 #101 B 又處理一次 C 再處理一次 修正:把確認期限設得比處理時間長,或讓用戶端程式庫自動延長租約
    只要處理時間一直比確認期限長,同一則訊息就會被一再交付;設了無效信件主題的話,傳遞次數還會被這些逾時用光。用官方用戶端程式庫的提取訂閱時,程式庫預設會在處理期間自動延長期限(最長可延到一小時);推送訂閱不能對單則訊息延長,只能把訂閱的確認期限調大。
    毒訊息在第 3 秒失敗、最大傳遞次數 5(示意) 立即重試指數退避 0 秒50100150200 轉送 轉送 +10+20+40+80 每個方塊是一次傳遞;退避秒數為示意,官方只保證介於最小與最大退避之間逐次拉長
    立即重試讓暫時性錯誤(例如下游剛好重啟)很快恢復,但遇到一直會失敗的訊息,就會在短時間內密集重送、壓在下游身上。指數退避讓重試之間有喘息時間,代價是暫時性錯誤也要等比較久才會重試。

    無效信件主題與服務代理權限

    無效信件主題本身就是一個普通主題,設定是放在訂閱上,不是放在原本的主題上。官方文件的幾個重點:它必須和訂閱所附加的主題不同;可以放在別的專案;Pub/Sub 只是把訊息「發布」過去,所以無效信件主題底下一定要先建好訂閱,不然發布到沒有訂閱的主題,訊息就遺失了。轉送這個動作是由 Pub/Sub 服務代理(每個專案一個,格式是 service-專案編號@gcp-sa-pubsub.iam.gserviceaccount.com)代你執行:它要能發布到無效信件主題(roles/pubsub.publisher),也要能在原訂閱上把轉走的訊息確認掉(roles/pubsub.subscriber)。少了任何一個,訊息就會停在原訂閱一直重試,傳遞次數也不會被計算。

    主題orders 訂閱orders-warehouse 無效信件主題orders-dlq 訂閱 orders-dlq-sub Pub/Sub 服務代理service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com 達上限轉送 publisher subscriber
    主控台在你勾選無效信件時,會在畫面上提示服務代理缺少哪些角色,並提供授予按鈕;用 gcloud 或 Terraform 就要自己寫這兩條 IAM 繫結。主控台的「最大傳遞次數」與畫面文字以實際控制台為準。

    恰好一次傳遞與訊息排序:條件與代價

    恰好一次傳遞只支援提取訂閱(包含 StreamingPull),而且訂閱者要連到同一個 Region 才有保證。開啟後,Pub/Sub 保證兩件事:訊息成功確認之後不會再被送出;在確認期限內(訊息還在途中)也不會重送給別人。它不保證你的處理程式只執行一次:處理時間超過確認期限,訊息照樣會重新交付,這時舊的確認會失敗並回傳錯誤(官方建議用「確認並取得回應」的介面,才知道確認有沒有成功);發布端因為重試而送了兩次的訊息,會是兩個不同的訊息 ID,也不在保證範圍內。代價是發布到接收的延遲明顯變高。

    訊息排序要兩邊配合:訂閱建立時開啟訊息排序(建立後不能改),發布者替相關的訊息設相同的排序鍵,而且同一個排序鍵要從同一個 Region 發布。沒有排序鍵的訊息不排序。每個排序鍵的發布吞吐量上限是 1 MBps;某一則訊息被重送時,同一個排序鍵後面的訊息(包含已確認的)也會跟著重送;推送訂閱每個排序鍵一次只有一則在途。無效信件主題是盡力而為,轉送過去的訊息順序可能不會保留。

    排序鍵 客戶甲排序鍵 客戶乙 #101 ✓ #102 ✗ #103 等待 #201 ✓ #202 ✓ #102 一直失敗,同一個鍵的 #103 只能等 客戶乙和客戶甲無關,照順序處理完 沒有無效信件主題:#102 一直重送,客戶甲卡到保留期間到期 有無效信件主題:#102 轉走後 #103 才能繼續,但客戶甲的順序少了一筆
    排序鍵通常設成「需要保序的最小單位」,例如客戶編號或訂單編號,不要整個系統只用一個鍵,否則所有訊息都只能一則一則來,還會碰到每個鍵 1 MBps 的上限。實驗室一勾選「訊息排序」就能看到這張圖的情況。

    遇到題目時的判斷步驟

    1. 是不是固定時間觸發(每天、每小時)?是就選 Cloud Scheduler,取代 VM 上的 crontab。
    2. 是不是 Google Cloud 的事件(值區裡的物件建立、稽核記錄裡的 API 呼叫、第三方事件)發生後要自動執行程式?是就選 Eventarc,事件以 CloudEvents 格式送到 Cloud Run 等目標。
    3. 是不是多步驟流程,要依序呼叫、分支、等待人工核准或回呼?是就選 Workflows。
    4. 是不是要由發送端指定目標、控制每秒幾次、排定未來時間?是就選 Cloud Tasks(明確呼叫)。
    5. 已經在用 Kafka API、Kafka Connect,要最少修改搬上雲?選 Managed Service for Apache Kafka(Pub/Sub Lite 已在 2026-03-18 關閉,不是選項)。
    6. 剩下的「一對多扇出、削峰緩衝、串流擷取」選 Pub/Sub,再依處理端挑訂閱類型:常駐程式自己拉選提取;Cloud Run 這類可縮到零的服務選推送;不轉換、直接落地到 BigQuery 或 Cloud Storage 選匯出訂閱。
    固定時間觸發? Google Cloud 事件發生就執行? 多步驟、分支、等待核准? 指定目標、控速、排定時間? 沿用 Kafka API 與生態系? Cloud Scheduler Eventarc Workflows Cloud Tasks Managed Kafka 都不是:一對多扇出、削峰緩衝、串流擷取 → Pub/Sub,再看處理端 常駐程式:提取 可縮到零的服務:推送 直接落地:匯出 是是是是是 否否否否否
    題目常在情境裡藏一兩個關鍵字:「每天凌晨」「上傳後自動」「等待主管核准」「每秒最多 20 次」「15 分鐘後」「既有 Kafka」「直接寫進 BigQuery」。先找關鍵字,再走這張圖。這些服務也常組合使用,例如 Cloud Scheduler 定時發布 Pub/Sub 訊息、Eventarc 觸發 Workflows。

    容易考錯的地方

    要讓三個系統都收到,就讓它們訂同一個訂閱:不對。同一個訂閱的訂閱者是分攤訊息,每則只給一個;要每個系統都收到,就要為每個系統各建一個訂閱。

    訊息被重複處理,就調高最大傳遞次數或延長訊息保留:都無關。重複處理通常是處理時間超過確認期限(調大期限或讓程式庫延長租約),或本來就是至少一次的偶發重送(處理程式要等冪,必要時在提取訂閱開恰好一次傳遞)。最大傳遞次數決定何時放棄,保留期間決定訊息最多放多久。

    恰好一次傳遞可以用在推送訂閱:不行,只有提取訂閱支援,而且訂閱者要連同一 Region。推送到 Cloud Run 的情境,答案通常是把處理程式寫成等冪。

    設了無效信件主題就萬事 OK:還要授予服務代理兩個角色(無效信件主題的發布者、原訂閱的訂閱者),並替無效信件主題建一個訂閱,否則轉過去的訊息沒人保存。最大傳遞次數最低是 5,題目出現 1、2、3 都是不合法的值。

    重試政策可以用來延後處理:官方不建議。指數退避是用來給失敗的訊息喘息時間;要「30 分鐘後再做」請用 Cloud Tasks 的排定時間。

    要順序就整個系統用同一個排序鍵:這會讓所有訊息排成一列、吞吐量被每個鍵 1 MBps 卡住。排序鍵要用最小的保序單位;訊息排序也只能在建立訂閱時開啟。

    要把 Pub/Sub 訊息存進 BigQuery,一定要寫 Dataflow:不用轉換時,BigQuery 匯出訂閱就能直接寫入;要轉換、彙總、視窗計算時才需要 Dataflow。

    Pub/Sub Lite 比較便宜,所以選它:Pub/Sub Lite 已在 2026-03-18 關閉,官方替代是 Managed Service for Apache Kafka 或 Pub/Sub。舊教材或考試大綱若還出現,當成歷史名詞即可。

    相關考試:依 Google Cloud 各考試官方 exam guide(查證時間 2026 年 10 月),Pub/Sub 在 CDL、ACE、ADP、PCD、PDE、PCDOE 的服務清單中被點名,PCA 則點名了 Pub/Sub 模擬器。ACE 與 PCD 偏重訂閱類型、確認與重試的設定細節,PDE 與 ADP 偏重串流擷取(Pub/Sub 到 Dataflow 或 BigQuery),PCD 也考 Pub/Sub、Cloud Tasks、Eventarc、Cloud Scheduler、Workflows 的分工。

    ✅ 自我檢測

    6 題原創題,選完立即顯示對錯與解析,全部作答後會出現總分。目前得分:0 / 6