IT 基礎知識 ch08 API 與非同步:系統之間怎麼說話
CH 08 新手先修

API 與非同步:系統之間怎麼說話

API 與 RESTJSON同步 vs 非同步佇列與解耦Queue vs Pub/Sub

最後一章補上「系統與系統之間怎麼溝通」:API 是什麼、REST 的慣例、以及分散式系統最重要的觀念——同步與非同步、佇列與解耦。讀完後 AWS ch08(API Gateway)和 ch09(SQS、SNS、EventBridge)那些「解耦」「fan-out」「緩衝尖峰流量」的說法就不再是黑話。恭喜你完成 IT 基礎全部八章!

你的手機 App 怎麼跟伺服器要資料?程式跟程式之間怎麼互相使喚?靠 API(Application Programming Interface,應用程式介面)。

  • 類比:餐廳的服務生+菜單。你(客戶端)不用進廚房(伺服器內部),也不用知道菜怎麼煮(內部實作)——看菜單(API 文件)知道有什麼能點,跟服務生(API)下單,餐點會送上來(回應)。
  • 好處是隔離:廚房怎麼改裝、換廚師(重構、換技術),只要菜單不變,客人完全無感。
  • Endpoint(端點):每道菜的「點餐窗口」,實際上是一個網址。例如 https://api.example.com/users/123 =「使用者 123 號」這項資源的窗口。
  • JSON:現代 API 傳遞資料最通用的格式——人看得懂、機器好解析的巢狀鍵值對:
    { "name": "Andy", "age": 30, "tags": ["aws", "dev"] }。
💡 你已經每天在用:AWS 管理主控台上的每個按鈕,背後都是對 AWS API 的呼叫;AWS CLI、SDK 也是同一套 API 的不同外衣。CloudTrail(AWS ch11)記錄的就是「誰呼叫了哪個 API」。

REST 是一套 API 的設計慣例(不是新技術),核心就兩條:「網址表達資源、HTTP 動詞表達動作」——基礎篇 ch02 學的 HTTP 動詞直接用上:

  • GET /users = 給我使用者列表(讀取)
  • GET /users/123 = 給我 123 號使用者(讀取單筆)
  • POST /users = 新增一個使用者
  • PUT /users/123 = 更新 123 號使用者
  • DELETE /users/123 = 刪除 123 號使用者

回應用 HTTP 狀態碼表達結果(ch02 的知識再用一次):200 成功、404 找不到這筆、429 你叫太兇被限流、500 廚房炸了。

  • 因為全世界都遵守同一套規矩,任何語言寫的程式都能互相溝通——這就是 REST 風行的原因。
⭐ AWS 對應:API Gateway 就是「幫你開餐廳門面」的服務——它站在最前面收單(統一入口),處理驗證(誰能點餐)、限流(一人一分鐘最多點幾次,超過回 429)、版本管理,然後把單子轉給後面的廚房(Lambda、EC2)。詳見 AWS ch08。

系統之間的溝通分兩種模式,這是理解 AWS ch09 整章的鑰匙:

  • 同步(Synchronous)= 打電話:發出請求後原地等待回應,拿到答案才繼續。優點:馬上知道結果。缺點:對方慢,你就跟著慢;對方掛了,你就跟著失敗——命運綁在一起。
  • 非同步(Asynchronous)= 留言/傳訊息:把訊息留下就繼續做自己的事,對方有空再處理。優點:彼此解耦、各忙各的。缺點:不會馬上有結果,要另外設計「怎麼知道做完了」。
  • 什麼場景該用非同步?後續動作「不需要馬上完成」的:下單後的發票開立、Email 通知、影片上傳後的轉檔——使用者按下按鈕只需要知道「收到了」,不需要站在原地等全部做完。
💡 判斷口訣:使用者等著要答案(查詢、登入)→ 同步(API 直接回);交辦了就能走(通知、轉檔、報表)→ 非同步(丟進佇列慢慢做)。考題說「使用者不應等待耗時處理完成」→ 非同步(SQS + 背景 worker)。

非同步的「留言板」具體長什麼樣?就是佇列(Queue)——一條先進先出的訊息隊伍:

  • 生產者(Producer)把訊息丟進佇列就走人;消費者(Consumer)依自己的步調從佇列取出處理,做完把訊息刪掉。
  • 類比:銀行取號機。客人抽號碼牌(訊息進佇列)就可以去旁邊坐(生產者不用等),櫃檯(消費者)照自己的速度一號一號叫。
  • 佇列帶來三大好處,AWS 考題翻來覆去就考這三個:
    ・解耦(Decoupling):前後端只認識佇列、不直接認識彼此——後端全掛了,訊息還安穩地排在佇列裡,修好再處理,一筆都不丟。
    ・削峰填谷(緩衝):搶購瞬間湧入十萬筆訂單?全部先進佇列排著,後端照常速消化——尖峰流量被「拉平」了。
    ・獨立擴展:佇列越積越長=後端不夠力,多開幾個消費者就好,前端完全不用動。
⭐ AWS 對應:SQS 就是代管的佇列。考題觸發詞:「decouple」「buffer」「burst/spike 流量」「不能遺失訊息」→ SQS。佇列長度還能當 Auto Scaling 的指標(隊伍太長就加人)。詳見 AWS ch09。

非同步訊息還有第二種模式,兩者的差別是 AWS ch09 的核心考點:

  • 佇列(Queue)= 工單池:每則訊息只會被一個消費者領走處理(處理完就從佇列刪除)。多個消費者是在分工(你處理 1 號單、我處理 2 號單)。適合:任務分派——「這件事,找一個人做掉」。
  • 發布/訂閱(Pub/Sub)= 廣播電台:發布者對一個主題(Topic)喊話,所有訂閱者都收到同一則訊息、各自做各自的事。適合:事件通知——「這件事發生了,所有關心的人都該知道」。
  • 例子:「訂單成立」這個事件,發到 Topic 之後——Email 服務發通知、庫存服務扣庫存、分析服務記一筆——三個系統同時收到、互不干擾。
  • Fan-out(扇出)經典架構:Pub/Sub 的每個訂閱者各接一條佇列(Topic → 多條 Queue),兼得「廣播給所有人」與「每條線各自排隊、不丟訊息」。
💡 AWS 對應:Queue = SQS,Pub/Sub = SNS,fan-out = SNS 後面接多個 SQS(考題超愛)。判斷法:訊息該被「一個人處理」→ SQS;該「通知所有人」→ SNS。EventBridge 是更進階的事件路由(依規則分流),詳見 AWS ch09。
同步 vs 非同步
特性同步(打電話)非同步(留言)
行為發出請求後原地等回應留下訊息就繼續做自己的事
耦合度高:對方慢我就慢、對方掛我就失敗低:透過佇列解耦,各忙各的
結果回饋立即知道成功或失敗延後得知,要另外設計通知機制
適合場景查詢、登入——使用者等著要答案轉檔、通知、報表——交辦了就能走
AWS 典型API Gateway → Lambda 直接回應API 收單 → SQS → 背景 worker 慢慢做
Queue vs Pub/Sub
特性Queue(佇列)Pub/Sub(發布/訂閱)
類比銀行取號機/工單池廣播電台
一則訊息幾人收到只有一個消費者領走處理所有訂閱者都收到同一則
多個接收者的意義分工(各處理不同訊息)廣播(各自處理同一事件)
適合任務分派:「找一個人做掉」事件通知:「所有關心的人都該知道」
AWS 服務SQSSNS(fan-out = SNS 接多個 SQS)

練習題 點選選項查看解析

0 / 7
01 / 7
「App 透過 API 取得資料,完全不需要知道伺服器內部怎麼實作;伺服器只要不改 API 格式,內部隨便重構」。這體現了 API 的什麼價值?
A 加密傳輸
B 隔離(抽象):客戶端只依賴「菜單」,廚房怎麼換廚師、改裝潢都無感
C 壓縮資料
D 自動擴展
解析
API 的核心價值是「介面與實作分離」:菜單(API 契約)不變,廚房(內部實作)自由演進。這也是微服務架構的基礎——服務之間只透過 API 溝通,各自獨立開發部署。
02 / 7
依 REST 慣例,「刪除編號 42 的商品」應該對應哪個請求?
A GET /products/delete?id=42
B DELETE /products/42
C POST /deleteProduct
D PUT /products/42/remove
解析
REST 的規矩:網址表達資源(/products/42 = 42 號商品)、HTTP 動詞表達動作(DELETE = 刪除)。其他選項把動作塞進網址,違反慣例——不是不能動,但全世界的工具與工程師都預期你照規矩來。
03 / 7
公開 API 需要「統一入口、呼叫者驗證、限制每人每秒請求數(超過回 429)」。哪個 AWS 服務就是為此而生?
A ELB
B API Gateway——API 的門面:驗證、限流(throttling)、版本管理一手包
C CloudFront
D SQS
解析
API Gateway = 餐廳門面:站在最前收單、驗身分(配 Cognito/IAM)、限流節流(throttling,超量回 429)、管版本,再把請求轉給後面的 Lambda/EC2。ELB 是流量分配器,不做 API 層的驗證與限流——兩者定位不同(AWS ch08)。
04 / 7
使用者上傳影片後需要轉檔(耗時 10 分鐘)。若採「同步」設計,使用者按下上傳後會發生什麼事?正確的設計是?
A 同步沒問題,10 分鐘很快
B 同步會讓使用者原地等 10 分鐘(多半直接逾時);正確設計是非同步——上傳完成立刻回覆「收到」,轉檔任務丟進佇列由背景 worker 處理
C 同步會自動變成非同步
D 應該請使用者自己轉檔再上傳
解析
同步=打電話原地等,10 分鐘的處理會讓連線逾時、體驗崩壞。標準解法:API 收到上傳後只做「登記任務」(丟 SQS),立即回應;背景 worker 從佇列取任務慢慢轉檔,完成後另行通知。「使用者不應等待耗時處理」→ 非同步+佇列,是 ch09 的核心考型。
05 / 7
訂單系統直接同步呼叫發票系統開發票。某天發票系統當機 2 小時,期間所有下單都跟著失敗。用什麼架構能讓「發票系統掛掉時下單照常運作、發票之後補開、一張不漏」?
A 把兩個系統合併成一個
B 中間加一條佇列(SQS):訂單系統把「開發票」訊息丟進佇列就完成下單;發票系統修好後從佇列把積壓的訊息全部處理掉
C 發票系統多開幾台
D 改用更快的網路連線
解析
這就是「解耦」的價值:加了佇列後,訂單系統只依賴佇列(幾乎不會掛),發票系統掛掉期間訊息安穩排隊、一筆不丟,恢復後照序消化。同步呼叫=命運綁定;佇列=斷開命運鏈。考題觸發詞「decouple」「不能因下游故障而失敗」→ SQS。
06 / 7
「訂單成立」後要同時觸發三件事:寄 Email、扣庫存、寫入分析系統——三個系統都要收到這個事件。該用哪種訊息模式?
A 一條 SQS 佇列讓三個系統搶著領
B Pub/Sub(SNS):把事件發布到 Topic,三個訂閱者各自收到同一則訊息
C 訂單系統依序同步呼叫三個系統
D 把三個系統合併
解析
「所有關心的人都要知道」=廣播=Pub/Sub(SNS Topic)。若用一條 SQS,一則訊息只會被「一個」消費者領走——三個系統會互相搶單而不是各自收到。加分題:SNS 後面給每個訂閱者接一條自己的 SQS(fan-out),兼得廣播與排隊不丟訊息。
07 / 7
SQS 佇列的訊息積壓長度不斷增加。這代表什麼?合理的自動化處置是?
A 佇列壞了,要重建
B 消費者處理速度跟不上生產速度;把佇列長度當 Auto Scaling 指標,自動增加消費者(worker)數量
C 應該丟棄舊訊息
D 要求生產者停止送訊息
解析
佇列長度=供需儀表板:越積越長表示後端消化不及。標準作法是拿佇列深度(ApproximateNumberOfMessages)當 Auto Scaling 指標——隊伍太長就多開櫃檯,消化完再收。這是「佇列+獨立擴展」的經典組合技,AWS ch03+ch09 的交叉考點。

點擊卡片翻面查看答案,共 10 張。

QUESTION
API 的餐廳類比?
點擊翻面
ANSWER
服務生+菜單:客人不進廚房、不管菜怎麼煮
看菜單(文件)→ 下單(請求)→ 上菜(回應)
價值:介面不變,內部隨便改
點擊翻回
QUESTION
Endpoint 和 JSON 各是什麼?
點擊翻面
ANSWER
Endpoint = 每項資源的點餐窗口(一個網址)
JSON = 通用資料格式:{"name": "Andy", "age": 30}
現代 API 的標準組合
點擊翻回
QUESTION
REST 的兩條核心規矩?
點擊翻面
ANSWER
① 網址表達資源:/users/123
② HTTP 動詞表達動作:GET 讀 / POST 增 / PUT 改 / DELETE 刪
結果用狀態碼回report(200/404/429/500)
點擊翻回
QUESTION
API Gateway 的定位與三大功能?
點擊翻面
ANSWER
API 的統一門面(收單櫃檯)
① 驗證(誰能呼叫)
② 限流 throttling(超量回 429)
③ 版本管理,後端轉給 Lambda/EC2
點擊翻回
QUESTION
同步 vs 非同步的類比與口訣?
點擊翻面
ANSWER
同步 = 打電話(原地等答案,命運綁定)
非同步 = 留言(交辦就走,各忙各的)
等著要答案→同步;交辦了就能走→非同步
點擊翻回
QUESTION
佇列的類比與三大好處?
點擊翻面
ANSWER
銀行取號機
① 解耦:前後端只認識佇列,下游掛了訊息不丟
② 削峰:尖峰流量先排隊,後端照常速消化
③ 獨立擴展:隊太長就加消費者
點擊翻回
QUESTION
Queue vs Pub/Sub 一句話區分?
點擊翻面
ANSWER
Queue = 工單池:一則訊息「一個人」領走處理 → SQS
Pub/Sub = 廣播:一則訊息「所有訂閱者」都收到 → SNS
分派工作→SQS;通知大家→SNS
點擊翻回
QUESTION
Fan-out 架構是什麼?
點擊翻面
ANSWER
SNS Topic 後面接多條 SQS(每個訂閱者一條)
兼得:廣播給所有人 + 每條線各自排隊不丟訊息
AWS ch09 最愛考的組合
點擊翻回
QUESTION
「使用者不應等待耗時處理」的標準架構?
點擊翻面
ANSWER
API 收單 → 立即回「收到」
任務丟進 SQS → 背景 worker 依步調處理
完成後另行通知(Email/推播/查詢狀態)
點擊翻回
QUESTION
佇列積壓變長代表什麼?怎麼自動處理?
點擊翻面
ANSWER
消費速度 < 生產速度
拿佇列深度當 Auto Scaling 指標
隊伍太長 → 自動加開 worker(櫃檯)
點擊翻回