Serverless Computing và AWS Lambda: Tương lai của backend
Serverless đang thay đổi cách xây backend: thay vì một ứng dụng chạy liên tục trên máy chủ, backend trở thành tập hợp các hàm nhỏ như AWS Lambda kết nối với dịch vụ được quản lý qua sự kiện. Đây có phải là tương lai của backend? Câu trả lời thực tế là serverless sẽ là lựa chọn mặc định cho ngày càng nhiều loại khối lượng công việc, nhưng không thay thế hoàn toàn container hay máy chủ. Bài này đi sâu vào cách thiết kế một backend serverless hoàn chỉnh, những mẫu kiến trúc thường dùng và các bài toán bạn phải giải.
Nếu bạn chưa quen với khái niệm cơ bản như hàm, sự kiện kích hoạt hay cold start, hãy đọc trước bài serverless là gì và vì sao chọn AWS Lambda.
Tư duy mới: backend hướng sự kiện
Backend truyền thống tổ chức quanh một tiến trình lớn nhận yêu cầu, gọi cơ sở dữ liệu và trả kết quả. Backend serverless tổ chức quanh sự kiện: một yêu cầu HTTP, một file được tải lên, một bản ghi thay đổi, một tin nhắn trong hàng đợi. Mỗi sự kiện kích hoạt một hàm làm đúng một việc, và hàm đó có thể phát ra sự kiện mới cho bước tiếp theo.
Tư duy này có hai hệ quả lớn. Thứ nhất, phần lớn "keo dán" giữa các thành phần được giao cho dịch vụ quản lý như API Gateway, EventBridge, SQS, Step Functions, thay vì viết trong mã. Thứ hai, các thành phần liên kết lỏng, có thể thay đổi và mở rộng độc lập, giống tinh thần của microservices nhưng ở mức hạt mịn hơn.
Các khối xây dựng của một backend serverless trên AWS
| Nhu cầu | Dịch vụ thường dùng |
|---|---|
| Điểm vào HTTP/REST/WebSocket | Amazon API Gateway, Lambda Function URL |
| GraphQL | AWS AppSync |
| Xử lý logic | AWS Lambda |
| Cơ sở dữ liệu | DynamoDB, Aurora Serverless |
| Lưu file | Amazon S3 |
| Hàng đợi và sự kiện | SQS, SNS, EventBridge |
| Điều phối quy trình nhiều bước | AWS Step Functions |
| Xác thực người dùng | Amazon Cognito |
Năm mẫu kiến trúc phổ biến
1. API đồng bộ
API Gateway nhận yêu cầu, chuyển cho Lambda, Lambda đọc ghi DynamoDB rồi trả kết quả. Đây là mẫu cơ bản nhất cho ứng dụng web và di động. Lưu ý giữ hàm gọn để thời gian phản hồi thấp, và tránh gọi chuỗi Lambda này sang Lambda khác một cách đồng bộ.
2. Đệm tải bằng hàng đợi
Khi yêu cầu không cần xử lý ngay, API ghi vào SQS và trả về ngay. Lambda đọc hàng đợi theo lô và xử lý với tốc độ kiểm soát được. Mẫu này bảo vệ hệ thống phía sau như cơ sở dữ liệu quan hệ khỏi bị quá tải khi lưu lượng tăng đột biến.
3. Fan-out qua pub/sub
Một sự kiện "đơn hàng đã tạo" được phát qua SNS hoặc EventBridge tới nhiều hàm cùng lúc: một hàm gửi email, một hàm cập nhật kho, một hàm ghi vào hệ thống phân tích. Thêm người nghe mới không cần sửa phía phát.
4. Quy trình nhiều bước với Step Functions
Với quy trình như xử lý đơn hàng gồm kiểm tra tồn kho, thanh toán, xác nhận, giao hàng, Step Functions định nghĩa máy trạng thái có rẽ nhánh, thử lại, xử lý lỗi và bước bù trừ. Đây là cách hiện thực mẫu saga mà không phải tự viết mã điều phối.
5. Xử lý dữ liệu theo luồng
Lambda đọc từ Kinesis hoặc DynamoDB Streams, biến đổi và ghi vào kho phân tích. Phù hợp với nhật ký, sự kiện người dùng, dữ liệu cảm biến.
Những bài toán khó của backend serverless
Quản lý trạng thái và kết nối cơ sở dữ liệu
Hàm không giữ trạng thái giữa các lần gọi một cách đáng tin cậy. Mọi trạng thái nằm ở dịch vụ bên ngoài. Với cơ sở dữ liệu quan hệ, hàng trăm môi trường Lambda đồng thời có thể mở quá nhiều kết nối; Amazon RDS Proxy được thiết kế để gộp kết nối cho trường hợp này. DynamoDB, vốn giao tiếp qua HTTP, không gặp vấn đề tương tự nhưng đòi hỏi thiết kế dữ liệu theo mẫu truy cập.
Idempotency
Nhiều nguồn sự kiện đảm bảo "ít nhất một lần", nghĩa là hàm có thể nhận cùng một sự kiện hai lần. Thao tác như trừ tiền hay gửi email cần kiểm tra trùng lặp, ví dụ lưu mã sự kiện đã xử lý. Bộ công cụ Powertools for AWS Lambda có tiện ích hỗ trợ việc này.
Quan sát hệ thống phân tán
Một yêu cầu có thể đi qua API Gateway, ba hàm Lambda, một hàng đợi và một máy trạng thái. Cần log có cấu trúc kèm mã tương quan, metrics tùy chỉnh và tracing với AWS X-Ray hoặc OpenTelemetry để biết chuyện gì xảy ra.
Kiểm thử
Phần lớn hành vi nằm ở tích hợp giữa các dịch vụ, nên unit test là chưa đủ. Nhiều đội chạy kiểm thử tích hợp trực tiếp trên môi trường cloud tạm thời cho mỗi nhánh, triển khai bằng hạ tầng dưới dạng mã. Đưa việc này vào quy trình CI/CD với nhiều tầng kiểm thử giúp phát hiện lỗi cấu hình quyền và sự kiện sớm.
Bảo mật
Mỗi hàm nên có IAM role riêng với quyền tối thiểu, thay vì một role dùng chung có mọi quyền. Bí mật đặt trong Secrets Manager hoặc Parameter Store. Bề mặt tấn công máy chủ giảm, nhưng lỗi ở tầng ứng dụng như kiểm tra đầu vào hay phân quyền vẫn là trách nhiệm của bạn.
Chi phí: cần mô hình hóa, đừng đoán
Serverless rẻ khi lưu lượng thấp hoặc biến động. Ở lưu lượng cao và đều, tổng chi phí Lambda, API Gateway và các dịch vụ đi kèm có thể vượt chi phí chạy container. Hãy ước tính bằng công cụ tính giá với số liệu lưu lượng thực, theo dõi chi phí theo từng hàm, và điều chỉnh bộ nhớ cấp phát: tăng bộ nhớ cũng tăng CPU, đôi khi giảm thời gian chạy đủ để tổng chi phí thấp hơn. Bài tối ưu chi phí dịch vụ đám mây có thêm phương pháp theo dõi chi phí.
Serverless có phải tương lai của backend?
Một số xu hướng cho thấy ranh giới giữa serverless và container đang mờ dần:
- Lambda hỗ trợ chạy image container, và các nền tảng như Google Cloud Run hay AWS Fargate mang trải nghiệm "không quản lý máy chủ" cho container.
- Cơ sở dữ liệu ngày càng có phiên bản serverless, tự co giãn theo tải.
- Edge function chạy mã ở các điểm hiện diện gần người dùng, mở rộng khái niệm serverless ra biên mạng.
- Công cụ hạ tầng dưới dạng mã và framework như AWS CDK, SST giúp định nghĩa backend serverless gọn gàng hơn.
Xu hướng chung là nhà phát triển ngày càng ít phải nghĩ về máy chủ. Nhưng những khối lượng công việc chạy dài, cần GPU chuyên dụng, cần độ trễ cực thấp ổn định hoặc có lưu lượng lớn đều đặn vẫn có lý do để chạy trên container hay máy ảo. Kiến trúc thực tế của nhiều công ty là lai: lõi chạy container, phần xử lý sự kiện và tác vụ phụ chạy serverless.
Khi nào nên chọn serverless cho backend mới
- Đội nhỏ, muốn tập trung vào sản phẩm thay vì vận hành.
- Lưu lượng khó dự đoán hoặc có đỉnh đột biến.
- Bài toán tự nhiên mang tính hướng sự kiện.
- Chấp nhận gắn bó với một nhà cung cấp cloud để đổi lấy tốc độ phát triển.
Câu hỏi thường gặp
Backend serverless có phù hợp với ứng dụng lớn không?
Có nhiều hệ thống lớn chạy phần đáng kể trên serverless, nhưng chúng thường được thiết kế cẩn thận với sự kiện, hàng đợi và quan sát tốt. Quy mô lớn đòi hỏi chú ý giới hạn đồng thời, chi phí và kiến trúc dữ liệu.
Nên dùng một hàm Lambda lớn hay nhiều hàm nhỏ?
Nhiều hàm nhỏ cho phép quyền và cấu hình riêng cho từng việc, nhưng tăng số thành phần cần quản lý. Một số đội gom các route liên quan vào một hàm để giảm cold start và đơn giản hóa triển khai. Không có quy tắc tuyệt đối, hãy chọn theo ranh giới quyền và mức độ thay đổi.
Làm sao tránh phụ thuộc chặt vào AWS khi dùng serverless?
Tách logic nghiệp vụ khỏi phần xử lý sự kiện đặc thù của AWS, dùng chuẩn mở như OpenTelemetry và CloudEvents khi có thể. Tuy vậy, mức độ phụ thuộc nhất định là cái giá đổi lấy sự tiện lợi của dịch vụ quản lý.
Step Functions khác gì so với gọi Lambda nối tiếp nhau?
Step Functions quản lý trạng thái quy trình, thử lại, xử lý lỗi và hiển thị trực quan từng bước. Gọi Lambda nối tiếp trong mã khiến bạn phải tự xử lý lỗi, trả phí cho thời gian chờ và khó theo dõi luồng.
Bài liên quan

Bảo mật đám mây: DevSecOps và những nguyên tắc cốt lõi
DevSecOps đưa bảo mật vào từng bước phát triển và vận hành trên cloud. Tìm hiểu các nguyên tắc cốt lõi, công cụ và cách bắt đầu cho đội nhỏ.

CI/CD Pipeline: Tự động hóa quy trình deploy với GitHub Actions
Hướng dẫn xây pipeline CI/CD bằng GitHub Actions: cấu trúc workflow, job test và build, deploy theo môi trường, bảo mật secrets và mẹo tăng tốc.

CI/CD Pipeline: Tự động hóa quy trình phát triển và kiểm thử phần mềm
CI/CD là gì, khác nhau giữa Continuous Delivery và Deployment, nên đặt unit test, integration test, E2E ở đâu trong pipeline và cách đo hiệu quả.

Docker và Kubernetes: Containerization cho người mới bắt đầu
Container là gì, Docker giải quyết vấn đề gì, khi nào cần đến Kubernetes. Giải thích dễ hiểu kèm lộ trình học Docker và K8s cho người mới bắt đầu.