跳至主要內容
Study Jam:雲端基礎實作 — 第 3/10 篇

設定 App 開發環境

內文字級

設定 App 開發環境
更新:2026-10-12

課程概述

假設使用者上傳一張圖片,你想在背景產生縮圖,又不希望上傳頁面一直等。這時可以把檔案放進 Cloud Storage,透過事件或 Pub/Sub 通知函式接手處理。這堂課就用這條流程,認識幾個服務怎麼接在一起。

事件驅動開發環境:檔案上傳與訊息發布進入事件路由和訂閱,Push 與 Pull 消費者各自處理,函式在事件抵達時啟動,完成後寫回物件並發布新訊息;重試與死信路徑處理失敗事件

發布者只管把訊息送進 Topic,不用知道後面有幾個訂閱者。Cloud Storage 事件或 Pub/Sub 訂閱可以觸發函式;但事件可能重送,所以處理前要辨認是否做過,避免同一筆資料被重複寫入。訂閱設定了死信主題時,反覆失敗的訊息會轉送過去,留待排查。

你將學到

  • 建立與配置 Cloud Storage bucket 並設定存取權限
  • 使用 Pub/Sub 實現非同步訊息傳遞
  • 部署第一個 Cloud Run function(原 Cloud Functions)處理事件
  • 理解事件驅動架構的基本模式
  • 使用 Cloud Shell Editor 進行開發

核心概念

Pub/Sub 訊息模式

Pub/Sub 讓發訊息的一方不用直接呼叫處理訊息的程式。先記住三個名稱就夠了:

  • Topic(主題):訊息的發布目標
  • Subscription(訂閱):從 Topic 接收訊息的端點
  • Push vs Pull:Push 主動推送到端點;Pull 由訂閱者主動拉取
# 建立 Topic
gcloud pubsub topics create my-topic

# 建立 Subscription
gcloud pubsub subscriptions create my-sub --topic=my-topic

# 發布訊息
gcloud pubsub topics publish my-topic --message="Hello"
Pub/Sub 訊息從 Publisher、Topic、Subscription 到 Consumer 的生命週期,成功 ACK 後停止投遞,失敗或逾時會重新投遞並可在超過重試上限後進入 Dead-letter Topic

Consumer 在 Ack Deadline 內處理成功並 ACK,訊息才算完成;失敗或逾時會再次投遞。多次失敗的訊息可送往 Dead-letter Topic 隔離調查,因此 Consumer 必須假設同一訊息可能看到不只一次。

Cloud Run functions 事件觸發

Cloud Run functions 支援多種觸發來源:

觸發類型來源範例
HTTPHTTP 請求REST API 端點
Cloud Storage檔案上傳/刪除圖片縮放處理
Pub/Sub訊息發布資料管線處理
Firestore文件變更即時通知

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 24, "rankSpacing": 32}}}%%
flowchart TD
  WORK["定義函式要回應的業務事件"] --> SYNC{"呼叫端是否要同步<br/>等待結果?"}
  SYNC -->|"是"| HTTP["HTTP Trigger<br/>驗證身分、輸入與回應狀態"]
  SYNC -->|"否"| OBJECT{"事件來自物件<br/>上傳、刪除或封存?"}
  OBJECT -->|"是"| STORAGE["Cloud Storage Event"]
  OBJECT -->|"否"| FANOUT{"發布者是否要與消費者解耦,<br/>或讓多個訂閱者各自處理?"}
  FANOUT -->|"是"| PUBSUB["Pub/Sub Trigger<br/>設計 ACK、重試與 Dead-letter"]
  FANOUT -->|"否"| DOC{"事件是否是<br/>Firestore 文件變更?"}
  DOC -->|"是"| FIRESTORE["Firestore Trigger"]
  DOC -->|"否"| REVIEW["重新定義事件來源與交付契約"]
先判斷同步回應、物件生命週期、訊息解耦或文件變更,再選 Trigger;事件型路徑都要假設可能重送,並使用 Event ID 保持冪等。
冪等事件處理流程:兩次收到相同 Event ID 時,第一次執行業務寫入並記錄 ID,第二次由 Dedup Store 辨識後跳過重複寫入

至少一次傳遞不等於業務效果一定重複。處理器先用 Event ID 查 Dedup Store,只有尚未處理的事件才能執行寫入並記錄 ID;重送事件直接跳過副作用但仍回 ACK,就能得到一次業務效果。

實作重點

  • 用 gcloud functions deploy 部署的函式預設 timeout 為 60 秒;Cloud Run functions (1st gen) 最長可調至 540 秒,Cloud Run functions 的 HTTP 函式最長 3600 秒、事件驅動函式(以 Cloud Functions v2 API 建立)最長 540 秒
  • Pub/Sub 預設是至少傳遞一次(at-least-once),需設計冪等處理邏輯
  • 開發時善用 gcloud functions logs read 查看最近的日誌(預設列出最新 20 筆)
  • 注意 Cloud Run functions (1st gen) 與 Cloud Run functions(原 Cloud Functions 第 1 代與第 2 代)的差異

Skill Badge 指引

Lab 連結:Set Up an App Dev Environment on Google Cloud — 完成此 lab 可獲得 Skill Badge

延伸學習

Study Jam:雲端基礎實作 — 第 3 篇/共 10 篇 查看系列全覽 →

讀完後,留一個學習紀錄

試著用自己的話說出一個重點,以及你會如何運用。實作文章請先核對結果與清理資源,再標記為讀完。

文章進度以你確認讀完的標記為準,可隨時取消。舊版造訪紀錄保留,但不計入讀完;這份自評不代表已掌握內容。

留言討論

文章目錄與系列

徽章解鎖!