Blog
Thoughts on engineering, design, and building great products.
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ế.
API Gateway: HTTP API hay REST API, và Dựng Route Đầu Tiên
API Gateway có hai loại API với hai bộ tính năng và hai mức giá. So sánh HTTP API và REST API để chọn đúng cho URL shortener, rồi dựng hai route thật: POST /links tạo link và GET /{code} chuyển hướng 301. Xử lý validate, path parameter, và CORS preflight để bài dashboard sau này không vỡ.
Lambda Chạy Code Của Bạn Ra Sao Bên Trong
Mổ vòng đời môi trường thực thi của Lambda: ba pha Init, Invoke, Shutdown, vì sao có cold start, và code static chạy một lần ra sao. Đo cold start thật (Init Duration), rồi đo quan hệ memory–CPU bằng cùng một việc CPU ở 128 MB và 1769 MB. Hiểu phần này để các quyết định về hiệu năng và chi phí sau này có cơ sở.
Dựng Môi Trường: AWS SAM và Hàm Lambda Đầu Tiên
Cài AWS SAM CLI, dựng khung project cho URL shortener (TypeScript + esbuild), rồi deploy một hàm Lambda thật ra AWS qua Function URL, gọi nó bằng curl, chạy thử local trong Docker, và xóa sạch bằng một lệnh. Kèm bài học về việc SAM CLI phải đủ mới để hỗ trợ runtime nodejs22.x.
Serverless Là Gì và Khi Nào Nên Dùng
Bài mở đầu series: serverless thực ra nghĩa là gì (không phải 'không có server'), nó đánh đổi cái gì để lấy cái gì, khi nào KHÔNG nên dùng, và sản phẩm ta sẽ dựng xuyên suốt — một dịch vụ rút gọn URL có analytics realtime. Kèm sơ đồ kiến trúc tổng thể và lộ trình từng phần.