Blog
Thoughts on engineering, design, and building great products.
Step Functions: Điều Phối Quy Trình Nhiều Bước và Mẫu Saga
Khi một quy trình có nhiều bước, rẽ nhánh và xử lý lỗi, nhồi hết vào một hàm Lambda sẽ rối và khó nhìn. Step Functions tách logic điều phối ra thành một state machine khai báo. Dựng một workflow kiểm duyệt link (quét an toàn rồi kích hoạt hoặc từ chối), với Retry, Catch, và gọi thẳng DynamoDB không qua Lambda. Bàn tới Standard so với Express, và mẫu saga để hoàn tác khi một bước giữa chừng thất bại.
EventBridge: Tách Việc Ghi Nhận Click Khỏi Đường Chuyển Hướng
Mở đầu phần event-driven. Thay vì đếm click ngay trong handler chuyển hướng, mỗi lượt mở link sẽ phát một sự kiện lên một custom event bus của EventBridge, và một consumer riêng xử lý nó. Dựng bus, cho resolve phát sự kiện, gắn một consumer qua event pattern, rồi mở link thật để thấy sự kiện chảy qua bus tới consumer.
Multi-Tenant: Mỗi Người Một Vùng Dữ Liệu, và Chặn IDOR
Biến URL shortener thành multi-tenant đúng nghĩa. Thêm route liệt kê link giới hạn theo danh tính trong token, và route xóa link kiểm quyền sở hữu ngay trong thao tác ghi để một người không xóa được link của người khác kể cả khi đoán đúng mã. Test với hai người dùng thật để thấy ranh giới giữ vững.
Cognito và JWT Authorizer: Chỉ Người Đăng Nhập Mới Tạo Được Link
Thêm người dùng thật bằng Amazon Cognito. Dựng user pool phát JWT, gắn JWT authorizer của HTTP API để bảo vệ route tạo link trong khi route mở link vẫn công khai, và cho handler đọc danh tính người dùng từ claim trong token thay vì gán cứng. Tạo user thật, lấy token thật, gọi API có và không có token để thấy ranh giới.
Nối DynamoDB Vào Code: Ghi An Toàn và Atomic Counter
Gắn hai handler vào DynamoDB thật: tạo link ghi item với conditional write để không đè trùng mã, mở link tra cứu rồi đếm click bằng atomic counter. Bắn nhiều lượt mở song song để thấy atomic counter đếm chính xác, và bắt gặp một giới hạn thật của tài khoản — concurrency Lambda — khi 40 trong 50 request trả về 503.
Global Secondary Index và Sparse Index: Mở Đường Truy Vấn Mới
Bảng single-table ở bài trước trả lời nhanh câu 'mở link theo code', nhưng bất lực với 'liệt kê link của một người dùng'. Bài này thêm một global secondary index để đảo khóa và mở đúng đường truy vấn đó, rồi dùng sparse index để index chỉ chứa link mà loại bỏ các bản ghi thống kê một cách tự nhiên. Tạo GSI thật, query thật để thấy cơ chế.
DynamoDB Single-Table Design: Bắt Đầu Từ Câu Hỏi, Không Phải Từ Bảng
Thiết kế DynamoDB đi ngược với cơ sở dữ liệu quan hệ: bắt đầu từ các câu hỏi truy vấn, không từ bảng. Bài này liệt kê access pattern của URL shortener, giải thích partition key và sort key, rồi dựng một single-table với item collection — link và thống kê click của nó nằm chung một phân vùng, lấy về trong một query. Tạo bảng thật, put và query item thật để thấy cơ chế.