AWS 認證準備 ch09 訊息與事件驅動
下一章→
CH 09 高頻考點

訊息與事件驅動

SQSSNSKinesisEventBridgeFan-out 模式

本章講解如何讓系統之間解耦:SQS(點對點佇列)、SNS(一對多廣播)、Kinesis (即時串流,支援重播)與 EventBridge(事件路由)。重點是依照「是否需要多個消費者、是否需要順序保證、是否需要重播」這些條件來判斷該選哪個服務。

🧱 白話:佇列 = 銀行取號機——生產者抽了號碼牌就走(非同步:留言而非打電話),消費者照自己的速度一號一號叫。三大好處:解耦(下游掛了訊息不丟)、削峰(尖峰流量先排隊)、獨立擴展(隊太長就加人)。地基見 基礎篇 ch08 API 與非同步。

核心用途:解耦(Decouple)生產者和消費者,緩衝突發流量,實現非同步處理。

  • Standard Queue(標準佇列):無限吞吐量、至少一次交付(At-Least-Once,訊息可能重複)、不保證順序(Best-Effort Ordering)。消費者需要實作冪等性(Idempotency)——意思是「同一筆訊息就算被處理兩次以上,結果也要跟只處理一次一樣」,最常見的做法是讓每筆訊息帶一個唯一 ID,處理前先檢查這個 ID 是否已經處理過(例如查一下資料庫或暫存記錄),處理過就直接略過、不要重複扣款或重複建立訂單。
  • FIFO Queue:嚴格保證順序(First-In-First-Out)、恰好一次(Exactly-Once)、吞吐量上限 3000 msg/s(有批次)。佇列名稱必須以 .fifo 結尾。
  • Visibility Timeout:消費者取得訊息後,訊息在佇列中隱藏一段時間(預設 30 秒)。若消費者在時間內處理完並刪除訊息,訊息消失;若未刪除,訊息重新出現供其他消費者處理。
  • Dead Letter Queue(DLQ):訊息被多次處理失敗(超過 maxReceiveCount)後,自動移到 DLQ,方便後續除錯。Standard 的 DLQ 也是 Standard;FIFO 的 DLQ 必須是 FIFO。
  • Long Polling:消費者等待佇列有訊息才回應(最多等 20 秒),避免空輪詢,減少 API 呼叫費用。建議啟用。
  • 訊息大小:最大 256KB。超過的大訊息用 SQS Extended Client(存在 S3,SQS 只放 S3 URL)。
🚨 考試陷阱:Standard SQS 訊息可能重複,消費者要做冪等性處理。需要嚴格順序且不重複 → FIFO SQS。

核心模式:一對多(One-to-Many)訊息推播(Push)。發布者發送訊息到 Topic,所有訂閱者同時收到。

  • 訂閱類型:SQS、Lambda、HTTP/HTTPS、Email、SMS、Mobile Push(iOS/Android)。
  • SNS FIFO Topic:類似 SQS FIFO,保證順序且去重,只能配合 SQS FIFO 訂閱使用。
  • 訊息篩選(Message Filtering):訂閱者可以設定過濾政策(JSON),只接收符合條件的訊息。例如:一個 SNS Topic 放訂單事件,不同的 SQS 佇列只訂閱特定狀態的訂單。
  • 訊息大小:最大 256KB。
⭐ Fan-out 架構(扇出):SNS Topic + 多個 SQS Queues。生產者只需推送到 SNS,SNS 同時推送到多個 SQS 佇列,各自的消費者獨立處理。這樣可以:① 確保訊息不遺失(SQS 持久化);② 多個系統並行處理同一事件;③ 生產者與消費者完全解耦。

四種 Kinesis 服務:

  • Kinesis Data Streams(KDS):即時串流資料,按 Shard 收費,每個 Shard 1MB/s 輸入、2MB/s 輸出。資料保留 1~365 天(預設 24 小時),可多個消費者同時讀取同一筆資料(SQS 不行),支援資料重播(Replay)。適合即時監控、Log 分析。
  • Kinesis Data Firehose(KDF):全託管的資料載入服務(ETL),將串流資料自動傳送到目的地:S3、Redshift、OpenSearch、Splunk、HTTP Endpoint。不儲存資料,近即時(60 秒延遲),無需管理 Shard,按資料量計費。
  • Kinesis Data Analytics(KDA):使用 SQL 或 Apache Flink 對串流資料進行即時分析。輸入可以是 KDS 或 KDF,輸出可以再送到 KDS、KDF 或 Lambda。
  • Kinesis Video Streams:專門用於串流影片到 AWS(安全攝影機、ML 模型分析)。
🚨 考試重點:KDS vs KDF 的核心差異:KDS 會儲存資料且可重播,需要管理 Shard;KDF 是全自動傳送到目的地,不儲存,更簡單。
💡 KDS vs SQS:需要多個消費者讀取相同資料 → KDS;需要嚴格順序(FIFO)→ SQS FIFO;只需要簡單解耦 → SQS Standard。
  • 核心功能:根據事件規則(Event Rules)將 AWS 服務事件路由到指定目標(Lambda、SQS、SNS、ECS、Step Functions 等)。原名 CloudWatch Events,功能更強大。
  • 事件來源:AWS 服務(EC2 狀態變更、S3 物件建立、CodePipeline 狀態等)、第三方 SaaS(Zendesk、Datadog 等)、自訂應用程式(Custom Event Bus)。
  • Event Pattern 匹配:根據事件的 JSON 內容進行精確匹配,例如只在特定 S3 bucket 發生特定事件時觸發。
  • 排程(Schedule):使用 Cron 或 Rate 表達式定期觸發目標(例如每天早上 8 點執行 Lambda 函數)。
  • Event Archive & Replay:可以封存事件並在之後重播,方便除錯和重新處理。
⭐ EventBridge vs SNS:EventBridge 更適合複雜的事件路由(基於內容過濾、多來源、第三方整合);SNS 更適合簡單的訊息廣播。兩者都可以觸發 Lambda/SQS。
SQS Standard vs FIFO 完整對比
特性SQS StandardSQS FIFO
吞吐量幾乎無限(Unlimited)300 msg/s(無批次)<br>3000 msg/s(有批次)
順序最佳努力(可能亂序)嚴格 First-In-First-Out
重複至少一次(可能重複)恰好一次(去重)
佇列名稱任意必須以 .fifo 結尾
DLQ 類型Standard DLQ必須是 FIFO DLQ
適合高吞吐解耦、批次處理需要順序的金融交易、訂單
SQS vs SNS vs Kinesis 選擇指南
使用情境選擇服務原因
解耦前後端,容忍訊息重複SQS Standard高吞吐、簡單解耦
銀行轉帳,需嚴格順序不重複SQS FIFO保證順序且 Exactly-Once
廣播通知給多個系統SNS + SQS Fan-out一對多,各系統獨立消費
即時 Log 分析,需重播歷史資料Kinesis Data Streams可儲存且多消費者、支援重播
將串流資料載入 S3/RedshiftKinesis Data Firehose全自動傳輸,無需管理
AWS 服務事件的複雜路由EventBridge基於內容的事件路由,支援排程
Kinesis Data Streams vs Kinesis Data Firehose
特性Kinesis Data StreamsKinesis Data Firehose
管理模式需要管理 Shard 數量完全自動(Serverless)
資料儲存儲存 1~365 天不儲存(直接轉發)
重播支援(可重播歷史資料)不支援
延遲毫秒級即時近即時(60秒緩衝)
目的地自訂消費者(Lambda/EC2/APP)S3/Redshift/OpenSearch/Splunk
計費按 Shard 數量 + 資料量按資料量計費

練習題 點選選項查看解析

0 / 24
01 / 24
一個電商系統的訂單服務需要把「新訂單」事件同時通知給:庫存系統、物流系統、會員點數系統。三個系統需要獨立處理,互不影響。最適合的架構是?
A 各自建立三個 SQS 佇列供三系統分別讀取
B 透過 SNS Topic 搭配三個 SQS 佇列進行廣播
C 讓三個系統共同讀取同一個 Kinesis Stream
D 由訂單服務依序呼叫三個 Lambda 函數處理
解析
Fan-out 架構是最佳解:訂單服務只需推送訊息到一個 SNS Topic → SNS 自動廣播到三個 SQS 佇列 → 各系統獨立消費自己的 SQS 佇列。優點:① 訊息持久化(SQS 不會遺失);② 各系統完全解耦,一個掛掉不影響其他;③ 訂單服務不需要知道下游系統的數量和位置。直接寫三個 SQS 佇列也可以,但訂單服務需要維護三份寫入邏輯,不夠解耦。
02 / 24
一個金融系統的交易記錄需要保證:每筆交易必須按照時間順序處理,且絕不能重複處理同一筆交易。應該選擇哪種 SQS 佇列類型?
A 改用 SQS Standard Queue 以換取更高吞吐量
B 改用 SQS FIFO Queue 以保證順序與去重
C 改用 Kinesis Data Streams 依分區維持順序
D 改用 SNS FIFO Topic 直接發布交易事件
解析
SQS FIFO Queue 專為需要嚴格順序和精確一次(Exactly-Once)處理設計:① 嚴格 FIFO 順序,先進先出;② 內建去重機制,防止重複處理(Content-Based Deduplication);③ 適合金融交易、訂單處理等對順序和準確性要求高的場景。雖然 KDS 也可以保證分區內的順序,但 SQS FIFO 對於一般佇列解耦場景更直接,不需要管理 Shard。
03 / 24
公司想要把網站的點擊流(Clickstream)資料和應用程式 Log 即時送入 Amazon S3 進行後續分析,不需要即時處理,只需要近即時地定期批次落地。最簡單的方案是?
A 改用 Kinesis Data Streams 並自建消費邏輯
B 改用 Kinesis Data Firehose 指定 S3 目的地
C 改用 SQS 佇列搭配 Lambda 消費寫入
D 改用 EventBridge 規則觸發寫入 S3
解析
Kinesis Data Firehose 是專門為「將串流資料自動載入目的地(S3、Redshift、OpenSearch 等)」設計的全託管服務。設定一次,資料自動緩衝後批次寫入 S3,無需管理任何伺服器或 Shard。近即時(約 60 秒緩衝),適合大量資料持續落地的場景。如果選 KDS + Lambda,還需要自己寫消費邏輯和管理 Shard,複雜度高很多。
04 / 24
一個 IoT 平台需要即時處理來自 10 萬台感測器的資料串流,且需要多個下游系統(異常偵測、資料儲存、報表)同時讀取相同的資料,並且能夠在發現問題時重播過去 7 天的資料。應該使用哪個服務?
A 改用 SQS Standard Queue 取得無限吞吐量
B 改用 Kinesis Data Firehose 做自動化傳輸
C 改用 Kinesis Data Streams 支援多消費者重播
D 改用 SNS Topic 廣播給多個訂閱系統
解析
Kinesis Data Streams (KDS) 是正確答案,原因:① 支援多個消費者同時讀取相同的 Shard 資料(Enhanced Fan-out);② 資料保留 1~365 天,可以重播歷史資料(SQS 和 SNS 訊息一旦被消費就刪除,無法重播);③ 按 Shard 線性擴展,支援大量 IoT 資料。SQS 訊息被消費後刪除,不支援多消費者讀取相同訊息;KDF 不儲存資料也不支援重播;SNS 也不支援重播。
05 / 24
公司想要在每天凌晨 2 點自動執行一個 Lambda 函數,清理過期的資料庫記錄。哪個 AWS 服務可以做到定期排程觸發?
A 把 SQS 的 Delay Seconds 設為 24 小時之久
B 用 EventBridge 的 Cron 表達式定期觸發任務
C 讓 SNS Topic 設定定時發布通知訊息
D 用 Step Functions 設定定時等待的狀態
解析
Amazon EventBridge(原 CloudWatch Events)支援定期排程觸發,可以使用 Cron 表達式(如 cron(0 18 * * ? *) 表示 UTC 18:00,即台灣時間凌晨 2:00)或 Rate 表達式(如 rate(1 day))定期觸發 Lambda、ECS Task 等。這是 AWS 上實現定時任務的標準方案。SQS 的 Delay 最多只有 15 分鐘,不是 24 小時。
06 / 24
一個 SQS 消費者在處理訊息時失敗,訊息重新出現在佇列中,消費者再次嘗試後又失敗。這種情況持續發生會怎樣?如何處理這些「毒藥訊息」(Poison Pills)?
A 讓失敗訊息留在佇列中,不做任何處理的具體做法
B 設定 DLQ,超過接收次數後自動移入的實務流程
C 讓失敗訊息在處理完後立即自動刪除,是常見做法
D 把 Visibility Timeout 的數值調高一些
解析
Dead Letter Queue(DLQ)是 SQS 處理問題訊息的標準機制:當一個訊息被消費者接收但未成功處理的次數超過 maxReceiveCount(你設定的閾值),SQS 自動將該訊息移動到 DLQ。DLQ 讓你可以:① 隔離問題訊息,避免影響正常訊息處理;② 保留問題訊息供後續分析除錯;③ 設定 CloudWatch Alarm 監控 DLQ 中的訊息數量,及時發現問題。
07 / 24
一個 SQS 消費者取出訊息後需要 60 秒處理,但預設可見性逾時太短,導致訊息在處理完成前又被其他消費者取走重複處理。應調整?
A 把 Visibility Timeout 調整為大於處理時間
B 改為調整 Message Retention 訊息保留期限
C 改為啟用 Long Polling 長輪詢機制
D 改用 Delay Queue 延遲佇列設定
解析
Visibility Timeout 決定訊息被取出後「暫時隱藏、不被其他消費者看到」的時間,應設為略大於處理時間,避免處理未完成就被重複取走。過短會重複處理、過長會拖慢失敗訊息的重試。
08 / 24
想減少 SQS 空輪詢(empty receives)的次數與成本,讓沒有訊息時等待一段時間再回應。應?
A 啟用 Long Polling 以減少空輪詢次數
B 調短 Visibility Timeout 的逾時時間
C 把佇列的類型改換成 FIFO 佇列類型
D 增加負責消費的執行實例的數量,是常見做法
解析
Long Polling 讓 ReceiveMessage 在佇列暫時沒訊息時等待(最長 20 秒)直到有訊息或逾時,減少大量空回應與 API 呼叫成本、也降低延遲。Short Polling 會立即回應(常常空手而回)。
09 / 24
一個事件要通知多個下游系統,且希望「即使某下游暫時離線,訊息也不會遺失、可稍後處理」。最佳架構是?
A SNS 發布並讓各下游各接一個佇列
B 只用 SNS 直接推播給各下游
C 讓所有下游共用同一個佇列
D 改用 Firehose 傳送給下游
解析
SNS + SQS fan-out:SNS 把訊息推到每個下游各自的 SQS 佇列,訊息在佇列中持久保存,下游即使暫時離線也能稍後從自己的佇列消費、互不影響。純 SNS 直推若下游離線可能漏收。
10 / 24
想把串流資料「近即時」自動落地到 S3/Redshift,途中還能用 Lambda 做格式轉換,且完全免管理分片與消費者。應用?
A 改用 Firehose 進行近即時交付
B 改用 Data Streams 自行管理消費
C 改用 SQS 佇列做為緩衝寫入
D 改用 EventBridge 觸發後寫入
解析
Kinesis Data Firehose 是全託管的交付服務,自動把串流資料緩衝、(可選)用 Lambda 轉換後載入 S3、Redshift、OpenSearch 等,免管理分片,適合近即時 ETL 落地。Data Streams 需自管分片與消費者。
11 / 24
Kinesis Data Streams 的吞吐量由什麼決定,且需要多個消費者以低延遲讀取同一串流。應?
A 增加 Shard 分片的數量以提升吞吐上限
B 調高 Visibility Timeout 的逾時時間
C 改用 SQS 佇列來取代原本的方案的具體做法
D 縮短資料在串流中的保留天數限制,是常見做法
解析
Kinesis Data Streams 的吞吐量由 shard 數量決定(每 shard 有固定寫入/讀取上限),要更高吞吐就增加 shard。它天生支援多消費者讀取同一份資料並可在保留期內重播,適合即時串流分析。
12 / 24
一個後端處理能力有限,但前端會突發湧入大量請求。想「削峰填谷」避免壓垮後端。應?
A 在前後端間放置佇列來緩衝請求
B 讓前端直接同步呼叫後端服務
C 額外建立一個 SNS 主題來轉發
D 改用 EventBridge 排程來觸發
解析
用 SQS 當緩衝佇列可解耦生產者與消費者——突發請求先進佇列,後端依自身處理能力逐步消費(削峰填谷),避免被瞬間流量壓垮,也可搭配 ASG 依佇列長度擴展消費者。
13 / 24
一個 SNS 主題有多個訂閱者,但每個訂閱者只想收到「特定類型」的訊息(例如只要 orderType=VIP)。應?
A 設定 SNS 的 Filter Policy 來過濾訊息
B 為每一種訊息類型分別建立一個主題的具體做法
C 改在 SQS 消費端自行撰寫過濾邏輯的實務流程
D 全部接收後於程式碼中直接捨棄它,是常見做法
解析
SNS 訂閱可設定 Filter Policy,依訊息屬性只把符合條件的訊息送給該訂閱者,避免每個訂閱者都收到全部再自行過濾,比拆成很多主題更好維護。
14 / 24
關於 SQS 訊息保留,何者正確?
A 訊息會永久保留,直到被消費為止
B 訊息預設保留 4 天,最長可設為 14 天
C 訊息只保留 1 小時就會自動清除
D 保留期是固定數值,完全無法調整
解析
SQS 訊息預設保留 4 天,可設定 1 分鐘到 14 天,逾期未被消費會自動刪除。若消費者長時間離線需注意保留期,避免訊息過期遺失。
15 / 24
需要 SQS FIFO 保證「同一筆訊息不被重複處理」。它靠什麼達成去重?
A 靠 Message Deduplication ID 在視窗內辨識
B 靠調整 Visibility Timeout 數值來達成
C 靠啟用 Long Polling 長輪詢來達成
D 靠設定 Delay Queue 延遲佇列達成
解析
FIFO 佇列用 Message Deduplication ID(或內容雜湊)在 5 分鐘去重視窗內辨識並丟棄重複訊息,達成「精確一次」處理;並用 Message Group ID 維持群組內順序。Standard 佇列則可能重複。
16 / 24
想讓送入 SQS 的訊息「延遲一段時間後」才對消費者可見(例如下單後 15 分鐘才處理)。應設定?
A 設定 Delay Queue 或訊息的 Message Timer
B 改為調整 Visibility Timeout 可見性逾時
C 改為設定 Dead-Letter Queue 死信佇列
D 改為啟用 Long Polling 長輪詢機制
解析
Delay Queue(或個別訊息的 Message Timer)讓訊息在指定延遲(最長 15 分鐘)後才對消費者可見,適合需要延後處理的情境。Visibility Timeout 是「取出後」的隱藏時間,時機不同。
17 / 24
想依事件內容用「規則」把不同事件路由到不同目標(Lambda、SQS、Step Functions),並整合第三方 SaaS 事件。最適合?
A 採用 EventBridge 依規則路由
B 只採用 SQS 做為路由中樞
C 只採用 SNS 做為路由中樞
D 採用 Firehose 進行路由
解析
EventBridge 是事件匯流排,可用規則(event pattern)依內容把事件路由到多種目標,並內建與眾多 SaaS 及 AWS 服務的事件整合,適合事件驅動架構的路由中樞。SQS/SNS 路由能力較弱。
18 / 24
想每小時定時觸發一個 Lambda 做資料同步。最適合的排程機制是?
A 用 EventBridge 排程觸發
B 用 SQS 延遲佇列來觸發
C 用 SNS 主題定時發布
D 用 Kinesis 內建排程功能
解析
EventBridge(前身 CloudWatch Events)的排程規則支援 cron 或 rate 表達式,可定時觸發 Lambda、Step Functions 等,是 AWS 上的排程首選。SQS Delay 只是延遲單一訊息、非週期排程。
19 / 24
一個分析管線需要「多個消費者各自從頭讀取同一份串流、並能重播過去幾天的資料」。應選?
A 改用 Kinesis 供多消費者重播讀取
B 改用 SQS Standard 標準佇列處理
C 改用 SQS FIFO 順序佇列處理
D 改用 SNS 主題進行事件廣播
解析
Kinesis Data Streams 讓多個消費者各自維護讀取位置、讀相同資料,並可在保留期內重播歷史,適合分析/多訂閱者場景。SQS 訊息被消費後即刪除、不能重播也不能多消費者讀同一則。
20 / 24
為避免處理一直失敗的「毒藥訊息」無限重試阻塞 SQS 佇列,應設定?
A 設定 DLQ 並指定接收次數
B 增加消費者提升處理速度
C 縮短訊息的保留天數限制
D 直接關閉訊息自動重試
解析
設定 DLQ 並指定最大接收次數,超過次數仍失敗的訊息會被移到 DLQ 隔離,避免毒藥訊息無限重試阻塞正常處理,之後可單獨分析。這是佇列可靠性的重要實務。
21 / 24
一個影像處理系統要透過 SQS 傳遞工作,但每筆工作附帶的中繼資料有 2 MB,超過 SQS 單筆訊息上限。最常見的做法是?
A 用 Extended Client 存 S3
B 拆成多筆訊息再自行組回
C 改用 FIFO 佇列放大上限
D 改用 SNS 主題傳送
解析
SQS(以及 SNS)單筆訊息最大 256 KB。超過時用 SQS Extended Client:把實際內容存在 S3,SQS 訊息裡只放 S3 的位置,消費者再去 S3 取。FIFO 的上限一樣是 256 KB;自己拆訊息組回既麻煩又容易出錯。
22 / 24
工廠想把數百支監視攝影機的即時影像串流送到 AWS,交給機器學習模型分析。最適合的服務是?
A Kinesis Data Firehose
B Kinesis Video Streams
C SNS 主題推播
D SQS Standard 佇列
解析
Kinesis Video Streams 專門用來把攝影機等裝置的影片串流送進 AWS,供播放或機器學習分析。Firehose 是把一般資料串流載入 S3/Redshift 等目的地;SQS 與 SNS 單筆訊息上限 256 KB,本來就不是傳影片的工具。
23 / 24
電商平台已經把交易事件送進 Kinesis Data Streams,現在想用 SQL 即時計算「每分鐘各商品的銷售額」,在異常時馬上反應。最適合哪個服務?
A Amazon Athena
B Amazon EventBridge
C Kinesis Data Analytics
D SQS FIFO 佇列
解析
Kinesis Data Analytics 可以用 SQL 或 Apache Flink 對串流資料做即時分析,輸入可接 KDS 或 KDF,結果再送到 Lambda 等目標處理。Athena 查詢的是已經落地在 S3 的資料,不是即時串流;EventBridge 負責事件路由,不做聚合計算。
24 / 24
訂單服務修了一個 bug 之後,團隊想把「過去三天」送進 EventBridge 的訂單事件重新送一次給修好的 Lambda 處理。事先應該做好什麼設定?
A 替 Lambda 設定 DLQ
B 改用 SNS 訊息篩選
C 把排程改成 Rate 表達式
D 啟用 Event Archive
解析
EventBridge 的 Event Archive & Replay 可以先把事件封存起來,之後指定時間範圍重播,方便除錯與重新處理。這必須事先啟用封存才有東西可重播。DLQ 只收處理失敗的事件,不是完整紀錄;SNS 不保存訊息,無法重播。

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

QUESTION
SQS Standard vs FIFO 核心差異?
點擊翻面
ANSWER
Standard:無限吞吐、可能重複、可能亂序
FIFO:嚴格順序、Exactly-Once、每秒上限3000筆
→ 金融交易用 FIFO;高吞吐解耦用 Standard
點擊翻回
QUESTION
SNS Fan-out 架構是什麼?
點擊翻面
ANSWER
SNS Topic → 多個 SQS 佇列。一個事件同時廣播給多個訂閱系統,各系統獨立消費。確保訊息持久化(SQS)且系統完全解耦。
點擊翻回
QUESTION
Kinesis Data Streams vs Firehose 何時用哪個?
點擊翻面
ANSWER
KDS:需要儲存/重播資料、多消費者同時讀取、毫秒級即時
KDF:只需把資料自動送到S3/Redshift/OpenSearch,不用重播,更簡單
點擊翻回
QUESTION
SQS Dead Letter Queue(DLQ)的用途?
點擊翻面
ANSWER
訊息被消費者接收但處理失敗超過 maxReceiveCount 次後,自動移入 DLQ。用於:① 隔離問題訊息 ② 後續除錯分析 ③ 監控告警。
點擊翻回
QUESTION
EventBridge 與 SNS 如何選?
點擊翻面
ANSWER
EventBridge:複雜事件路由(基於內容過濾)、AWS服務事件、第三方整合、定期排程
SNS:簡單廣播、快速一對多推播
點擊翻回