事件驅動架構重點

使用 AWS Lambda 的無伺服器應用程式

Claudio Canales

Senior DevOps Engineer

回顧:一個 Lambda 心智模型

  • 事件來源:觸發 Lambda 的東西。
  • 事件酬載:描述發生什麼事的 JSON。
  • 處理器:負責處理的程式碼。
  • 結果:回應或副作用。
  • 記錄:你用來除錯的位置。

Lambda 執行流程

使用 AWS Lambda 的無伺服器應用程式

事件就是訊息

  • 事件描述已發生的事情。
  • 通常是帶有中繼資料的 JSON 訊息。
  • 你的處理器擷取欄位並採取動作。

門鈴比喻:事件

使用 AWS Lambda 的無伺服器應用程式

AWS 常見事件來源

  • Amazon S3 在上傳時觸發事件。
  • Amazon SQS 是代管佇列,負責傳遞訊息。
  • DynamoDB Streams 產生變更紀錄。
  • 各自產生不同的 JSON 酬載。

事件來源:S3、SQS、Streams

使用 AWS Lambda 的無伺服器應用程式

同步 vs 非同步呼叫

  • 同步:呼叫端等待結果。
  • 非同步:呼叫端只收到確認;事件稍後處理。

同步 vs 非同步比喻

使用 AWS Lambda 的無伺服器應用程式

事件驅動架構重點

  • 事件以 JSON 由 AWS 服務送達。
  • 呼叫模式會影響錯誤出現的位置。
  • 酬載多樣,所以要防禦式剖析與驗證。
  • 預期會有重試與重複。

重點回顧流程

使用 AWS Lambda 的無伺服器應用程式

酬載就是契約

  • 酬載是契約:傳送端決定格式。
  • 你的處理器必須知道欄位在哪裡。
  • 擷取所需、驗證、處理並記錄。

酬載契約與剖析流程

使用 AWS Lambda 的無伺服器應用程式

範例酬載:SQS 訊息事件

標註過的 SQS 事件酬載

  • Records 是批次。
  • body 是字串。
  • messageId 協助追蹤與去重。
使用 AWS Lambda 的無伺服器應用程式

示範:逐一走訪 Records

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • 以安全預設讀取 Records。
  • 迭代各筆記錄並擷取 body。
  • 記錄重點後再回傳。

迭代 Records

使用 AWS Lambda 的無伺服器應用程式

示範:安全剖析 JSON body

import json
def lambda_handler(event, context):
    records = event.get("Records") or [{}]
    body = records[0].get("body", "{}")
    payload = json.loads(body)
    oid = payload.get("order_id")
    return json.dumps({"order_id": oid})
  • body 是字串;用 json.loads 解析。
  • 使用 "{}" 等安全預設讀取。
  • 擷取 order_id,並用 json.dumps 回傳 JSON。

Body 剖析流程

使用 AWS Lambda 的無伺服器應用程式

防禦式剖析檢查表

防禦式剖析清單

  • 學新來源時,先記錄一次事件結構。
  • 對選填欄位用 .get() 與預設值。
  • 驗證必要欄位並回傳明確錯誤。
  • 處理空批次與遺漏鍵。
使用 AWS Lambda 的無伺服器應用程式

為重試與重複而設計

  • 多數事件來源採至少一次傳遞。
  • 可能出現重複。
  • 設計冪等處理器,重複處理也正確。

重試與重複

使用 AWS Lambda 的無伺服器應用程式

冪等性的實作

  • 選擇唯一鍵,如 messageIdorder_id
  • 將已處理的鍵存到 DynamoDB。
  • 檢查鍵是否存在;若存在就略過。

冪等性決策流程

使用 AWS Lambda 的無伺服器應用程式

重點回顧

  • 事件以 JSON 由 AWS 服務送達。
  • 呼叫模式會影響錯誤出現的位置。
  • 酬載多樣,所以要防禦式剖析與驗證。
  • 預期會有重試與重複。

重點回顧流程

使用 AWS Lambda 的無伺服器應用程式

一起來練習吧!

使用 AWS Lambda 的無伺服器應用程式

Preparing Video For Download...