Những điều cốt lõi về kiến trúc hướng sự kiện

Ứng dụng Serverless với AWS Lambda

Claudio Canales

Senior DevOps Engineer

Ôn tập: mô hình tư duy một Lambda

  • Nguồn sự kiện: tác nhân kích hoạt Lambda.
  • Payload sự kiện: JSON mô tả điều xảy ra.
  • Handler: mã xử lý sự kiện.
  • Kết quả: phản hồi hoặc tác dụng phụ.
  • Log: nơi gỡ lỗi.

Luồng thực thi Lambda

Ứng dụng Serverless với AWS Lambda

Sự kiện là thông điệp

  • Sự kiện mô tả điều đã xảy ra.
  • Thường là thông điệp JSON kèm metadata.
  • Handler của bạn trích trường và thực thi hành động.

Ví von chuông cửa cho sự kiện

Ứng dụng Serverless với AWS Lambda

Nguồn sự kiện phổ biến trên AWS

  • Amazon S3 kích hoạt sự kiện khi tải lên.
  • Amazon SQS là hàng đợi quản lý, chuyển phát thông điệp.
  • DynamoDB Streams tạo nhật ký thay đổi.
  • Mỗi nguồn tạo payload JSON khác nhau.

Nguồn sự kiện: S3 vs SQS vs Streams

Ứng dụng Serverless với AWS Lambda

Gọi đồng bộ vs bất đồng bộ

  • Đồng bộ: bên gọi chờ kết quả.
  • Bất đồng bộ: bên gọi nhận xác nhận; sự kiện xử lý sau.

So sánh đồng bộ và bất đồng bộ

Ứng dụng Serverless với AWS Lambda

Những điều cốt lõi về kiến trúc hướng sự kiện

  • Sự kiện đến dưới dạng JSON từ dịch vụ AWS.
  • Chế độ gọi ảnh hưởng nơi lỗi xuất hiện.
  • Payload khác nhau, hãy phân tích và xác thực phòng thủ.
  • Giả định có thử lại và trùng lặp.

Tóm tắt chính

Ứng dụng Serverless với AWS Lambda

Payload là hợp đồng

  • Payload là hợp đồng: bên gửi quyết định cấu trúc.
  • Handler phải biết vị trí các trường.
  • Trích xuất, kiểm tra, xử lý và ghi log.

Hợp đồng payload và quy trình phân tích

Ứng dụng Serverless với AWS Lambda

Ví dụ payload: sự kiện thông điệp SQS

Payload sự kiện SQS có chú thích

  • Records là lô.
  • body là chuỗi.
  • messageId giúp truy vết và khử trùng lặp.
Ứng dụng Serverless với AWS Lambda

Minh họa: lặp qua Records

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Đọc Records với giá trị mặc định an toàn.
  • Lặp qua từng record và lấy body.
  • Ghi log phần quan trọng rồi trả về.

Lặp qua Records

Ứng dụng Serverless với AWS Lambda

Minh họa: phân tích JSON body an toàn

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 là chuỗi; phân tích với json.loads.
  • Đọc với mặc định an toàn như "{}".
  • Trích order_id và trả JSON bằng json.dumps.

Luồng phân tích body

Ứng dụng Serverless với AWS Lambda

Checklist phân tích phòng thủ

Checklist phân tích phòng thủ

  • Ghi log cấu trúc sự kiện khi làm quen nguồn mới.
  • Dùng .get() và mặc định cho trường tùy chọn.
  • Xác thực trường bắt buộc và trả lỗi rõ ràng.
  • Xử lý lô trống và khóa thiếu.
Ứng dụng Serverless với AWS Lambda

Thiết kế cho thử lại và trùng lặp

  • Nhiều nguồn sự kiện giao hàng ít nhất một lần.
  • Có thể xuất hiện bản trùng lặp.
  • Thiết kế handler idempotent để xử lý lặp vẫn đúng.

Thử lại và trùng lặp

Ứng dụng Serverless với AWS Lambda

Idempotency trong thực tế

  • Chọn khóa duy nhất, như messageId hoặc order_id.
  • Lưu mỗi khóa đã xử lý trong DynamoDB.
  • Nếu khóa đã tồn tại, bỏ qua xử lý.

Luồng quyết định idempotency

Ứng dụng Serverless với AWS Lambda

Điểm chính cần nhớ

  • Sự kiện đến dưới dạng JSON từ dịch vụ AWS.
  • Chế độ gọi ảnh hưởng nơi lỗi xuất hiện.
  • Payload khác nhau, hãy phân tích và xác thực phòng thủ.
  • Giả định có thử lại và trùng lặp.

Tóm tắt chính

Ứng dụng Serverless với AWS Lambda

Ayo berlatih!

Ứng dụng Serverless với AWS Lambda

Preparing Video For Download...