Skip to content

Bản chất của Web Framework

🎯 Câu hỏi cốt lõi

Code đã viết xong, làm sao để cả thế giới truy cập được? Điều này giống như hỏi: bạn muốn mở một quán ăn vỉa hè, hay điều hành một chuỗi nhà hàng xuyên quốc gia? Lựa chọn kiến trúc backend quyết định "nhà hàng" của bạn có thể phục vụ bao nhiêu khách hàng.


1. Tại sao cần hiểu về sự tiến hóa kiến trúc?

Hãy tưởng tượng bạn đang lên kế hoạch cho một chuyến du lịch dài. Bạn có thể chọn đi xe đạp, lái ô tô riêng, đi tàu cao tốc hoặc đi máy bay. Mỗi phương thức đều có tình huống phù hợp: xe đạp phù hợp cho quãng đường ngắn và muốn rèn luyện sức khỏe, máy bay phù hợp cho chuyến đi xuyên lục địa.

Lựa chọn kiến trúc backend cũng như vậy.

Từ khi internet ra đời đến nay, kiến trúc backend đã trải qua nhiều lần thay đổi lớn. Mỗi lần thay đổi không phải để "chạy theo xu hướng", mà là để giải quyết những vấn đề cụ thể đương thời:

Thời kỳVấn đề cốt lõiTiến hóa kiến trúc
1990sLàm sao để website chạy đượcMáy chủ vật lý
2000sCode ngày càng lộn xộn, bảo trì thế nàoMonolithic + MVC
2010sHệ thống quá lớn, mở rộng và hợp tác saoMicroservices + Container
2020sLàm sao giảm chi phí vận hành và độ phức tạpServerless + Cloud Native

📊 Bạn thấy gì từ bảng trên?

Hãy cùng đọc từng dòng của bảng này:

1990s → 2000s: Từ "chạy được là được" đến "cần bảo trì". Website từ trang tĩnh trở thành ứng dụng động, lượng code tăng vọt, cần cách tổ chức tốt hơn.

2000s → 2010s: Từ "máy đơn" đến "phân tán". Lượng người dùng bùng nổ, một máy chủ không chịu nổi, cần chia nhỏ hệ thống, mở rộng theo chiều ngang.

2010s → 2020s: Từ "tự vận hành" đến "dịch vụ đám mây". Container và microservices tuy mạnh mẽ nhưng chi phí vận hành quá cao, Serverless giúp lập trình viên chỉ tập trung vào logic nghiệp vụ.

Bài học cốt lõi: Tiến hóa kiến trúc không phải trò chơi chọn công nghệ, mà là quá trình giải quyết vấn đề thực tế. Mỗi giai đoạn đều có tình huống phù hợp, không có "kiến trúc tốt nhất", chỉ có "kiến trúc phù hợp nhất".

Ý nghĩa của việc hiểu về tiến hóa kiến trúc:

  1. Tránh phát minh lại bánh xe: Nhiều khái niệm "mới" thực ra đã có từ hàng chục năm trước, hiểu lịch sử giúp bạn đứng trên vai người khổng lồ
  2. Đưa ra lựa chọn công nghệ hợp lý: Không có kiến trúc tốt nhất, chỉ có kiến trúc phù hợp nhất với giai đoạn hiện tại
  3. Hiểu được sự đánh đổi đằng sau công nghệ: Mỗi lần tiến hóa kiến trúc đều là sự cân bằng giữa hiệu quả phát triển, hiệu năng hệ thốngđộ phức tạp vận hành
  4. Dự đoán xu hướng công nghệ: Lịch sử luôn lặp lại, hiểu quy luật tiến hóa trong quá khứ giúp nắm bắt hướng đi tương lai
🏗️Backend Architecture EvolutionUnderstand 30 years of architecture evolution through a restaurant analogy
1990s
🏠
Small family workshop
Physical server
2000s
🏢
Large central kitchen
Monolith
2010s
🏭
Specialized division
Microservices
2020s+
🍽️
Delivery platform
Serverless
🏠

Home kitchen

🍽️ Restaurant scenario

One cook works in a small kitchen and personally buys ingredients, washes, cuts, cooks, and serves. When customers increase, everyone has to queue.

💻 Backend mapping

One physical server handles every request: receiving HTTP requests, reading files, executing CGI scripts, and returning responses. CPU and memory are limited, so extra requests queue up.

⚡ Core pain points
  • Single-machine bottleneck: too many customers overwhelm the cook
  • Vertical scaling is expensive: buying a bigger machine is like buying a bigger kitchen
  • Single point of failure: if the cook is unavailable, the restaurant closes
💡Core idea:Architecture evolves to solve the pain points of the previous era, while introducing new complexity. There is no best architecture, only the architecture that best fits the context.

2. Thời đại máy chủ vật lý (1990s)

2.1 Máy chủ vật lý là gì?

Khi internet mới bắt đầu, backend chỉ là một máy chủ vật lý (một chiếc máy tính thật) đặt trong phòng máy.

💡 Giải thích đơn giản

Máy chủ vật lý giống như máy tính để bàn ở nhà bạn, nhưng nó:

  • Hoạt động 24/7 không tắt
  • Đặt trong trung tâm dữ liệu chuyên dụng (có điều hòa, nguồn UPS, hệ thống chữa cháy)
  • Có băng thông mạng nhanh hơn (cáp quang doanh nghiệp)
  • Có địa chỉ IP công cộng cố định (cả thế giới đều truy cập được)

Điều này giống như nhà bạn vs nhà hàng: nhà bạn chỉ thỉnh thoảng nấu ăn, nhà hàng là bếp chuyên nghiệp, mở cửa cả ngày, thiết bị chuyên nghiệp hơn.

2.2 Đặc điểm cốt lõi

  • Triển khai máy đơn: Tất cả ứng dụng chạy trên một máy vật lý
  • Vận hành thủ công: Cần tự lắp đặt, đi dây, cài đặt hệ thống
  • Mở rộng theo chiều dọc: Khi hiệu năng không đủ, chỉ có thể mua máy mạnh hơn
🔧 Mở rộng theo chiều dọc vs Mở rộng theo chiều ngang

Mở rộng theo chiều dọc (Scale Up): Nâng cấp cấu hình một máy chủ (thêm CPU, thêm RAM, ổ cứng nhanh hơn).

Mở rộng theo chiều ngang (Scale Out): Thêm nhiều máy chủ hơn, để chúng cùng làm việc.

Ẩn dụ:

  • Mở rộng theo chiều dọc: Biến nhà hàng nhỏ thành nhà hàng lớn, trang trí sang trọng hơn, nhưng chỉ có một đầu bếp
  • Mở rộng theo chiều ngang: Mở chuỗi cửa hàng, mỗi cửa hàng quy mô không lớn, nhưng có 100 chi nhánh

Ưu nhược điểm:

  • Mở rộng theo chiều dọc đơn giản, nhưng có giới hạn trên (máy chủ cao cấp rất đắt và có giới hạn)
  • Mở rộng theo chiều ngang về lý thuyết là vô hạn, nhưng cần giải quyết vấn đề nhất quán dữ liệu

2.3 Điểm đau

  • Chậm: Mỗi lần sửa code đều phải upload thủ công, rồi khởi động lại máy chủ
  • Đắt: Mở rộng chỉ có thể mua máy lớn hơn (mở rộng theo chiều dọc)
  • Khó mở rộng: Một máy chịu tất cả request, CPU đầy tải là phải xếp hàng chờ
🖥️Physical Server Era DemoObserve the processing bottleneck of early CGI servers
👤 User browser
🖥️ CGI server
Waiting for requests
💡Core idea:Process-level isolation improves stability, but it also creates heavy performance overhead.

2.4 Ưu nhược điểm thời đại máy chủ vật lý

Khía cạnhĐánh giá
Ưu điểmKiểm soát hoàn toàn phần cứng, hiệu năng dự đoán được; không có chi phí ảo hóa; dữ liệu cách ly vật lý, bảo mật cao
Nhược điểmChu kỳ mua sắm dài (hàng tuần); đầu tư ban đầu lớn (CapEx); tỷ lệ sử dụng tài nguyên thấp; khó mở rộng
Tình huống phù hợpHệ thống tài chính cốt lõi, hệ thống mật của chính phủ, tình huống yêu cầu nghiêm ngặt về chủ quyền dữ liệu

💡 CapEx vs OpEx

CapEx (Capital Expenditure): Chi tiêu vốn, đầu tư một lần số tiền lớn để mua phần cứng.

OpEx (Operating Expenditure): Chi tiêu vận hành, trả tiền theo mức sử dụng (như máy chủ đám mây).

Ẩn dụ:

  • CapEx: Mua nhà, trả một lần vài tỷ, sau đó mỗi tháng chỉ cần đóng phí dịch vụ
  • OpEx: Thuê nhà, trả tiền thuê hàng tháng, không cần bỏ ra số tiền lớn một lần

Bài học thời đại đám mây: Serverless và dịch vụ đám mây giúp nhiều công ty chuyển từ CapEx sang OpEx, giảm rào cản khởi nghiệp.


3. Thời đại Monolithic (2000s)

3.1 Monolithic là gì?

Cùng với sự xuất hiện của các framework (Rails / Django / Spring), mọi người nhồi nhét tất cả chức năng vào một ứng dụng.

💡 Giải thích đơn giản

Monolithic (Monolith) giống như một trung tâm thương mại lớn:

  • Khu quần áo, khu thực phẩm, khu điện tử đều trong cùng một tòa nhà
  • Tất cả nhân viên làm việc trong một hệ thống quản lý
  • Nếu cả tòa nhà mất điện, tất cả các khu vực đều ngừng hoạt động

So sánh với Microservices giống như phố thương mại: mỗi cửa hàng hoạt động độc lập, một cửa hàng đóng cửa không ảnh hưởng đến các cửa hàng khác.

🏢Monolithic Architecture DemoObserve how a monolithic application handles requests
Monolithic application process
👤
User module
Healthy
📦
Order module
Healthy
💳
Payment module
Healthy
🏭
Inventory module
Healthy
🗄️
Shared database
💡Core idea:All modules run in the same process and share memory. If one module crashes, the entire process may go down.

3.2 Đặc điểm cốt lõi

  • Kho code duy nhất: Tất cả module chức năng trong cùng một dự án
  • Cơ sở dữ liệu dùng chung: Tất cả module dùng chung một cơ sở dữ liệu
  • Triển khai thống nhất: Toàn bộ ứng dụng được đóng gói và triển khai như một khối

3.3 Ưu điểm

  • Phát triển đơn giản: Một dự án xử lý tất cả chức năng
  • Triển khai tiện lợi: Ném một gói lớn lên máy chủ là xong
  • Debug dễ dàng: Khởi động local là có thể debug tất cả chức năng

3.4 Điểm đau: Hiệu ứng tuyết lở

Hãy tưởng tượng, nếu đầu bếp "thái rau" không may cắt vào tay (code có bug), toàn bộ nhà bếp phải dừng lại để xử lý vết thương, khiến tất cả khách hàng không có đồ ăn.

Đây chính là rủi ro lớn nhất của Monolithic: khả năng cách ly kém.

🚨 Case study tuyết lở thực tế

Một công ty thương mại điện tử trong đợt khuyến mãi 11/11:

  • Dịch vụ đơn hàng vì tính toán giá một sản phẩm bị lỗi, ném ra ngoại lệ
  • Ngoại lệ không được bắt đúng cách, dẫn đến cạn kiệt thread pool
  • Tất cả request sau đó (bao gồm xem sản phẩm, tìm kiếm, đăng nhập) đều bị chặn
  • Toàn bộ website tê liệt hoàn toàn, kéo dài 1 giờ

Nếu dùng Microservices:

  • Dịch vụ đơn hàng bị sập, nhưng xem sản phẩm, tìm kiếm, đăng nhập vẫn hoạt động
  • Người dùng ít nhất vẫn có thể tiếp tục duyệt sản phẩm, thiệt hại giảm tối thiểu

3.5 Ưu nhược điểm và tình huống phù hợp của Monolithic

Khía cạnhĐánh giá
Ưu điểmPhát triển đơn giản, không cần xét đến độ phức tạp phân tán; debug tiện lợi, khởi động local là debug được toàn bộ; triển khai đơn giản, một gói là chạy được; quản lý transaction dễ dàng, cơ sở dữ liệu máy đơn đảm bảo ACID
Nhược điểmCode coupling cao, code phình to theo sự phát triển nghiệp vụ; công nghệ đơn nhất, khó nâng cấp cục bộ; khó mở rộng, chỉ có thể mở rộng toàn bộ; cách ly lỗi kém, một module lỗi ảnh hưởng toàn cục; hiệu quả hợp tác nhóm thấp, nhiều người cùng sửa một bộ code
Tình huống phù hợpStartup xác thực MVP, nhóm nhỏ (<10 người), nghiệp vụ tương đối đơn giản, yêu cầu tốc độ giao hàng cao hơn khả năng mở rộng
Tình huống không phù hợpNhóm lớn phát triển song song, cần phát hành thường xuyên các module khác nhau, một số module cần mở rộng độc lập

🎯 Lời khuyên cho người mới bắt đầu

Nếu bạn đang học phát triển backend, rất khuyến khích bắt đầu từ Monolithic:

  1. Học đi trước đã: Hiểu HTTP, cơ sở dữ liệu, kiến trúc MVC cơ bản
  2. Rồi mới nghĩ đến chạy: Khi dự án thực sự gặp vấn đề về khả năng mở rộng, hãy cân nhắc Microservices
  3. Tránh thiết kế quá mức: "Microservices" của nhiều công ty thực ra là "Monolithic phân tán", còn khó bảo trì hơn

Lộ trình học tập:

  • Giai đoạn 1: Dùng Spring Boot / Django / Rails viết một ứng dụng Monolithic hoàn chỉnh
  • Giai đoạn 2: Khi gặp nút thắt hiệu năng, thử tách ra 1-2 dịch vụ
  • Giai đoạn 3: Khi quy mô nhóm >50 người, hệ thống thực sự phức tạp, hãy Microservices hóa toàn diện

3.6 Hệ sinh thái công nghệ Monolithic

Ngôn ngữ/FrameworkĐặc điểmDoanh nghiệp tiêu biểu
Java + SpringLựa chọn hàng đầu cho phát triển doanh nghiệp, hệ sinh thái hoàn thiệnAlibaba, JD.com
PHP + Laravel/ThinkPHPPhát triển nhanh, phù hợp dự án vừa và nhỏFacebook thời kỳ đầu, Weibo
Python + Django/FlaskHiệu quả phát triển cao, phù hợp tạo mẫu nhanhInstagram, Pinterest
Ruby on RailsQuy ước hơn cấu hình, startup yêu thíchGitHub, Twitter (thời kỳ đầu)
Node.js + ExpressThống nhất ngôn ngữ frontend-backend, phù hợp tình huống I/O-intensiveNetflix, Uber

4. Container hóa và Microservices (2010s)

4.1 Tại sao cần Microservices?

Những điểm đau của Monolithic bùng nổ tập trung vào thập niên 2010:

  • Code quá đồ sộ: Một dự án hàng triệu dòng code, nhân viên mới mất một tháng mới hiểu được
  • Triển khai quá chậm: Build một lần mất 30 phút, phát hành một lần phải cẩn thận từng ly
  • Hợp tác quá khó: 100 lập trình viên cùng sửa một dự án, xung đột code xảy ra hàng ngày
  • Mở rộng quá đắt: Chỉ cần mở rộng "dịch vụ chat", nhưng phải nhân bản toàn bộ ứng dụng

Tư tưởng cốt lõi của Microservices: Chia ứng dụng lớn thành nhiều dịch vụ nhỏ, mỗi dịch vụ:

  • Phát triển độc lập, triển khai độc lập
  • Có cơ sở dữ liệu riêng
  • Giao tiếp qua API
🐳Docker Containerization DemoSee how containers let applications be packaged once and run anywhere
Traditional deployment
App A
Dependency library v1.0
Operating system
Physical server
VS
Docker containers
App A
Dependency v1.0
App B
Dependency v2.0
Docker Engine
Host operating system
Physical server
📦
Environment consistency
Development, testing, and production environments stay consistent.
🚀
Fast deployment
Second-level startup, image distribution, and rolling updates without downtime.
📊
Resource isolation
CPU and memory limits keep multiple applications from interfering with each other.
🔄
Version management
Versioned images support rollback and gradual rollout.
💡Core idea:Containerization lets applications be built once and run anywhere, solving environment consistency and fast deployment problems.

💡 Docker là gì?

Docker giống như "container vận chuyển":

  • Mỗi container có hàng hóa riêng (code + thư viện phụ thuộc + môi trường chạy)
  • Dù vận chuyển đến đâu (máy chủ nào), mở container ra là có thể bắt tay vào làm ngay
  • Không cần lo "máy này không có Python 3.9", "máy kia thiếu thư viện nào đó"

Ẩn dụ:

  • Không có Docker: Mỗi lần chuyển nhà, phải chuyển đồ đạc, đồ điện, quần áo từng món lên xe tải, đến nhà mới lại sắp xếp từng món
  • Có Docker: Tất cả đồ đạc đóng vào container, xe tải chở thẳng đi, đến nhà mới đặt xuống là dùng được

Giá trị cốt lõi: "Build một lần, chạy mọi nơi".

4.2 Dòng thời gian hệ sinh thái công nghệ

📚Technology Stack Evolution TimelineMainstream technology stacks in each era
🖥️Physical server era1990s
Web servers
ApacheNginxIIS
Backend languages
PerlPHPASP
Databases
MySQLPostgreSQLOracle
Deployment
FTPSSHManual
🏢Monolith2000s
Backend frameworks
SpringDjangoRailsLaravel
Frontend tech
jQueryBootstrapJSP
Databases
MySQLRedisMongoDB
Build tools
MavenGradleAnt
🏭Microservices2010s
Containers
DockerKubernetesHelm
Service frameworks
Spring CloudgRPCDubbo
Data stores
RedisMongoDBKafkaES
Observability
PrometheusGrafanaJaeger
☁️Serverless2020s+
Function compute
LambdaVercelCloudflare
BaaS
SupabaseFirebaseAuth0
Frontend frameworks
Next.jsNuxtSvelteKit
Databases
PlanetScaleNeonTurso

4.3 Kiến trúc Microservices

Để giải quyết vấn đề của Monolithic, chúng ta chia nhà bếp lớn thành nhiều nhà bếp nhỏ (dịch vụ):

  • Dịch vụ chuyên trách người dùng
  • Dịch vụ chuyên trách đơn hàng
  • Dịch vụ chuyên trách thanh toán

🏭 Microservices Architecture Demo

Observe how independent services collaborate and communicate

👤User serviceHealthy
Port:8081
Database:MySQL
Dependencies:None
📦Order serviceHealthy
Port:8082
Database:PostgreSQL
Dependencies:User service
💳Payment serviceHealthy
Port:8083
Database:MongoDB
Dependencies:User service, Order service
🏭Inventory serviceHealthy
Port:8084
Database:Redis
Dependencies:Order service
Service-to-service communication flow
1
User service
Verify user identity
2
Order service
Create order record
3
Inventory service
Check stock quantity
4
Payment service
Process payment request
5
Order service
Update order status

4.4 Kubernetes - Điều phối

Khi số lượng container lên đến hàng trăm hàng nghìn, cần một "hệ thống điều phối cảng":

  • Kubernetes (K8s): Chịu trách nhiệm sắp xếp container vào máy phù hợp (lập lịch, mở rộng/thu hẹp, cập nhật luân phiên)
  • Service Mesh: Chịu trách nhiệm quy tắc giao thông giữa các dịch vụ (ngắt mạch, giới hạn tốc độ, thử lại, khả năng quan sát)

☸️ Kubernetes Orchestration Demo

Observe how K8s schedules containers, balances load, and recovers from failures

Control Plane
🌐
API Server
Unified cluster entry point
🗄️
etcd
Distributed key-value store
📋
Scheduler
Pod scheduler
🎮
Controller
Controller manager
Worker Nodes
🖥️Node-1Running
CPU:
45%
Memory:
60%
Running Pods: 5
🖥️Node-2Running
CPU:
30%
Memory:
40%
Running Pods: 3
🖥️Node-3Pending
CPU:
0%
Memory:
0%
Running Pods: 0
💡 Kubernetes core concepts
  • Pod: The smallest deployment unit. A Pod can contain one or more containers.
  • Deployment: Manages Pod replica count and rolling updates.
  • Service: Provides stable network access and load balancing.
  • Scheduler: Automatically schedules Pods to suitable nodes based on resource needs and policies.

💡 "Điều phối" là gì?

Điều phối (Orchestration) là hệ thống tự động quản lý số lượng lớn container.

Ẩn dụ:

  • Không có K8s: Bạn quản lý thủ công 100 container, cái nào chết phải khởi động lại thủ công, cái nào nhiều traffic phải thêm máy thủ công
  • Có K8s: Bạn chỉ cần nói "tôi muốn dịch vụ này luôn có 10 instance chạy", nó sẽ tự động hoàn thành:
    • Máy chủ nào còn tài nguyên, thì lập lịch container đến đó
    • Container chết, tự động khởi động lại
    • Traffic tăng, tự động mở rộng lên 20 instance
    • Khi cập nhật code, cập nhật luân phiên (dừng 1 instance cũ, khởi động 1 instance mới, thay thế từng cái một)

Điểm mấu chốt: Microservices không phải "tách ra là xong", khó khăn thực sự nằm ở quản trị và vận hành.

4.5 Ưu nhược điểm của Microservices và Container hóa

Khía cạnhĐánh giá
Ưu điểmDịch vụ triển khai độc lập, công nghệ có thể không đồng nhất; cách ly lỗi, một dịch vụ sập không ảnh hưởng toàn cục; mở rộng theo nhu cầu, dịch vụ nóng mở rộng riêng; hợp tác nhóm thân thiện, nhóm khác nhau phụ trách dịch vụ khác nhau; kho code nhỏ hơn, dễ hiểu và bảo trì
Nhược điểmĐộ phức tạp phân tán cao (độ trễ mạng, transaction phân tán, service discovery); chi phí vận hành cao, cần đội DevOps chuyên nghiệp; debug khó khăn, vấn đề có thể cần truy vết qua nhiều dịch vụ; khó đảm bảo nhất quán dữ liệu; yêu cầu hạ tầng triển khai và giám sát phức tạp
Tình huống phù hợpNhóm lớn (>50 người), nghiệp vụ phức tạp cần các module tiến hóa độc lập, một số module cần mở rộng độc lập, cần đa dạng ngôn ngữ công nghệ, hệ thống yêu cầu tính sẵn sàng cao
Tình huống không phù hợpNhóm nhỏ, nghiệp vụ đơn giản, traffic nhỏ và ổn định, không có đội vận hành chuyên nghiệp
⚠️ Cạm bẫy của Microservices

Cạm bẫy 1: Monolithic phân tán

Tách ra 10 microservices, nhưng chúng liên kết chặt chẽ với nhau:

  • Dịch vụ A gọi dịch vụ B, dịch vụ B gọi dịch vụ C, dịch vụ C lại gọi dịch vụ A
  • Sửa một chức năng, phải sửa đồng thời 5 dịch vụ
  • Khi triển khai, phải triển khai theo thứ tự, nếu không hệ thống báo lỗi

Điều này còn tệ hơn Monolithic: Bạn vừa có độ phức tạp của Monolithic, lại không được hưởng lợi ích triển khai độc lập của Microservices.

Cạm bẫy 2: Chia tách quá mức

Chức năng chỉ có 100 dòng code cũng tách thành một dịch vụ độc lập:

  • 10 dịch vụ, mỗi dịch vụ chỉ có 100 dòng code
  • Chi phí giao tiếp giữa các dịch vụ (tuần tự hóa/giải tuần tự hóa mạng) còn nặng hơn logic nghiệp vụ thực tế
  • Chi phí vận hành bùng nổ: phải triển khai, giám sát, thu thập log cho 10 dịch vụ

Cách làm đúng: Chia tách từ góc độ gắn kết chức năng, một microservice nên là một năng lực nghiệp vụ hoàn chỉnh (như "dịch vụ đơn hàng", không phải "dịch vụ tạo đơn hàng", "dịch vụ truy vấn đơn hàng").

4.6 Hệ sinh thái công nghệ Microservices

Phân loạiCông nghệ/Công cụVai trò
Container hóaDocker, containerdĐóng gói và cách ly ứng dụng
Điều phốiKubernetes, Docker SwarmQuản lý container và tự động mở rộng/thu hẹp
Service DiscoveryConsul, etcd, ZooKeeperĐăng ký và khám phá dịch vụ
API GatewayKong, Zuul, EnvoyCổng vào thống nhất, định tuyến, giới hạn tốc độ
Configuration CenterApollo, Nacos, Spring Cloud ConfigQuản lý cấu hình tập trung
Giám sát & Cảnh báoPrometheus, Grafana, ELKGiám sát chỉ số và phân tích log
TracingJaeger, Zipkin, SkyWalkingTruy vết request phân tán
Service MeshIstio, LinkerdQuản trị traffic và bảo mật

5. Thời đại Serverless và Cloud Native (2020s+)

5.1 Tại sao cần Serverless?

Microservices tuy tốt, nhưng duy trì hàng chục nhà bếp nhỏ vẫn rất mệt mỏi. Bạn cần lo lắng:

  • Nhà bếp có đủ rộng không? (mở rộng máy chủ)
  • Mất điện thì làm sao? (tính sẵn sàng cao)
  • Quá nhiều container quản lý thế nào? (chi phí vận hành)

⚡ Serverless Architecture Demo

Observe on-demand function execution and automatic scaling

🔐
User login
Cold
📦
Order processing
Cold
🖼️
Image processing
Cold
💾
Data backup
Cold
Auto-scaling status
Concurrent requests:0
Running instances:0
Cold starts:0
Traffic simulator
💡 Serverless core traits
  • On-demand execution: Functions run only when invoked, so idle functions do not create runtime cost.
  • Automatic scaling: Scale automatically from zero to thousands of instances without manual intervention.
  • Cold start: The first call after a long idle period may have extra latency and may need warm-up strategies.
  • Event driven: Respond to HTTP requests, message queues, scheduled tasks, and other event sources.

💡 Serverless không có nghĩa là "không có máy chủ"

Serverless có nghĩa là "bạn không cần quản lý máy chủ", chứ không phải thực sự không có máy chủ.

Ẩn dụ:

  • Thời đại máy chủ vật lý: Bạn mua đất, xây nhà, trang trí, thuê đầu bếp, mua nguyên liệu... tất cả tự làm
  • Thời đại máy chủ đám mây: Bạn thuê một nhà hàng đã được trang trí sẵn, nhưng tự thuê đầu bếp, tự quản lý vận hành
  • Thời đại Serverless: Bạn chỉ cần thiết kế thực đơn, trên mây có bếp dùng chung, có đầu bếp chuyên nghiệp, bạn đặt món họ làm, trả tiền theo lần

Thay đổi cốt lõi:

  • Trước đây: Mua máy chủ → Cấu hình môi trường → Triển khai code → Giám sát → Mở rộng → Bảo trì
  • Bây giờ: Viết code → Upload → Trả tiền theo mức sử dụng

Giống như gọi đồ ăn: Bạn không cần nhà bếp, chỉ cần thiết kế thực đơn, có người nấu cho bạn.

5.2 Serverless là gì?

Serverless = FaaS + BaaS

FaaS (Function as a Service, Hàm như một dịch vụ):

  • Bạn chỉ viết hàm (như "gửi email chào mừng khi người dùng đăng ký")
  • Nhà cung cấp đám mây chịu trách nhiệm chạy hàm này, tự động mở rộng/thu hẹp
  • Đại diện tiêu biểu: AWS Lambda, Alibaba Cloud Function Compute

BaaS (Backend as a Service, Backend như một dịch vụ):

  • Đăng nhập → Auth0 / Supabase Auth
  • Thanh toán → Stripe
  • Cơ sở dữ liệu → Supabase / Firebase / DynamoDB
  • Message → Kafka / SQS

🎯 Tình huống phù hợp cho Serverless

Tình huống tốt nhất:

  1. Traffic thủy triều: Ứng dụng gọi đồ ăn, buổi trưa traffic cao, nửa đêm không có ai. Serverless sẽ tự động phân bổ 1000 máy vào buổi trưa, co về 0 máy vào nửa đêm
  2. Hướng sự kiện: "Sau khi người dùng upload ảnh, tự động nén ảnh"
  3. Xác thực nhanh: Nhóm nhỏ, MVP, dự án hackathon

Tình huống không phù hợp:

  1. Tác vụ chạy lâu: Chuyển mã video (có thể chạy 1 giờ, thời gian thực thi tối đa của hàm thường chỉ 15 phút)
  2. Ứng dụng cần độ trễ thấp: Giao dịch tần suất cao (độ trễ khởi động lạnh có thể từ vài chục ms đến vài giây)
  3. Cần kiểm soát tinh chỉnh tầng thấp: Tinh chỉnh nhân hệ điều hành, truy cập trực tiếp GPU

5.3 Ưu nhược điểm của Serverless và Cloud Native

Khía cạnhĐánh giá
Ưu điểmChi phí vận hành bằng không, lập trình viên chỉ cần tập trung vào code nghiệp vụ; tự động mở rộng/thu hẹp, hoàn hảo đối phó với đỉnh traffic; trả tiền theo nhu cầu, khi không có traffic chi phí gần bằng 0; lên sóng nhanh, vài phút triển khai toàn cầu; tính sẵn sàng cao tích hợp sẵn, dịch vụ đám mây tự động xử lý chuyển đổi dự phòng
Nhược điểmĐộ trễ khởi động lạnh (vài trăm ms đến vài giây); giới hạn thời gian chạy (thường 5-15 phút); debug khó khăn, khó mô phỏng hoàn toàn môi trường đám mây local; rủi ro khóa nhà cung cấp; không phù hợp tác vụ chạy lâu hoặc tính toán nặng; chi phí có thể vượt giải pháp truyền thống trong tình huống traffic cao liên tục
Tình huống phù hợpXử lý hướng sự kiện (xử lý ảnh, thông báo tin nhắn); ứng dụng traffic thủy triều (trang sự kiện, khuyến mãi); tạo mẫu nhanh và MVP; API tần suất thấp hoặc tác vụ nền; nhóm nhỏ không có đội vận hành chuyên dụng
Tình huống không phù hợpỨng dụng cần độ trễ thấp liên tục; tác vụ tính toán dài; tình huống nhạy cảm với khởi động lạnh (giao dịch tần suất cao); tình huống cần kiểm soát tinh chỉnh hạ tầng tầng thấp
💰 So sánh chi phí: Khi nào Serverless đắt hơn?

Tình huống 1: Truy cập tần suất thấp

  • Máy chủ truyền thống: $20/tháng (bất kể có người truy cập hay không)
  • Serverless: 1 triệu request × $0.0002/lần = $20 (chỉ trả khi có traffic)
  • Kết luận: Tình huống tần suất thấp, Serverless tiết kiệm hơn

Tình huống 2: Truy cập tần suất cao liên tục

  • Máy chủ truyền thống: $20/tháng
  • Serverless: 100 triệu request × $0.0002/lần = $20,000
  • Kết luận: Tình huống tần suất cao liên tục, máy chủ truyền thống tiết kiệm hơn

Tình huống 3: Traffic thủy triều

  • Máy chủ truyền thống: Để đối phó với đỉnh, cần máy chủ $100/tháng (bình thường tỷ lệ sử dụng tài nguyên chỉ 10%)
  • Serverless: Lúc đỉnh $20, bình thường gần như $0
  • Kết luận: Tình huống traffic thủy triều, Serverless tiết kiệm chi phí

Bài học: Đừng mù quáng chọn Serverless, hãy tính toán chi phí dựa trên đặc điểm traffic thực tế.

5.4 Hệ sinh thái công nghệ và nền tảng Serverless

Phân loạiCông nghệ/Nền tảngĐặc điểm
Nền tảng FaaSAWS LambdaDịch vụ FaaS đầu tiên, hệ sinh thái hoàn thiện nhất
Azure FunctionsTích hợp cao với Microsoft Cloud, thân thiện .NET
Google Cloud FunctionsTích hợp sâu với dịch vụ GCP
Alibaba Cloud Function ComputeHệ sinh thái nội địa hoàn thiện, tối ưu khởi động lạnh tốt
Tencent Cloud Cloud FunctionsTích hợp với hệ sinh thái WeChat
Vercel/Netlify FunctionsThân thiện với frontend developer, triển khai biên
Dịch vụ BaaSFirebaseGiải pháp backend di động của Google
SupabaseGiải pháp thay thế Firebase mã nguồn mở với PostgreSQL
AWS AmplifyNền tảng phát triển ứng dụng di động và web của AWS
Công cụ triển khaiServerless FrameworkTriển khai đa đám mây, cộng đồng sôi nổi
TerraformCơ sở hạ tầng như code
PulumiĐịnh nghĩa cơ sở hạ tầng bằng ngôn ngữ lập trình

6. So sánh các giai đoạn kiến trúc và hướng dẫn lựa chọn

6.1 So sánh toàn cảnh tiến hóa kiến trúc

🏗️Architecture Evolution ComparisonCore architectural traits across four eras
🖥️
Physical server
1990s
Single node
🏢
Monolith
2000s
Centralized
🏭
Microservices
2010s
Distributed
☁️
Serverless
2020s+
No server ops
🏢
Monolith (2000s)
🏗️ Architecture traits
  • Single codebase and unified stack
  • Shared database and transactional consistency
  • Unified deployment and whole-system release
  • In-process communication without network overhead
✅ Advantages
  • Simple development and onboarding
  • Convenient local testing
  • Simple deployment as one package
❌ Pain points
  • Tight coupling makes small changes risky
  • Single stack makes new technology hard to introduce
  • Large teams become hard to coordinate
🔧 Typical technologies
Spring/Django/RailsTomcat/GunicornMySQL/PostgreSQLMaven/Gradle
💡Core idea:Architecture evolves to solve prior pain points, while also introducing new complexity.
Khía cạnhMáy chủ vật lýMonolithicMicroservices + ContainerServerless
Quy mô nhóm1-5 người5-50 người50-500 người1-20 người
Độ phức tạp triển khaiCực caoThấpCực caoCực thấp
Chi phí vận hànhCaoTrung bìnhRất caoThấp
Khả năng mở rộngKémMở rộng dọc hạn chếMở rộng ngang xuất sắcTự động mở rộng
Linh hoạt công nghệKhôngĐơn nhấtĐa dạngHạn chế
Khởi động lạnhKhôngKhôngThời gian khởi động containerCó độ trễ
Tình huống phù hợpHệ thống cũ, yêu cầu tuân thủ đặc biệtStartup, nghiệp vụ đơn giảnCông ty internet lớn, nghiệp vụ phức tạpXác thực nhanh, hướng sự kiện

6.2 Cây quyết định lựa chọn công nghệ

Bắt đầu lựa chọn

    ├─ Nhóm có nhân viên vận hành chuyên nghiệp?
    │   ├─ Có → Cân nhắc Microservices hoặc máy vật lý
    │   └─ Không → Tiếp tục đánh giá

    ├─ Cần nhanh chóng lên sóng để xác thực ý tưởng?
    │   ├─ Có → Serverless hoặc Monolithic
    │   └─ Không → Tiếp tục đánh giá

    ├─ Quy mô nhóm > 50 người?
    │   ├─ Có → Cân nhắc Microservices
    │   └─ Không → Tiếp tục đánh giá

    ├─ Traffic có đặc điểm đỉnh-thung lũng rõ rệt?
    │   ├─ Có → Serverless
    │   └─ Không → Monolithic (khuyến nghị cho startup)

    └─ Yêu cầu đặc biệt (tuân thủ, hệ thống cũ)?
        └─ Có → Máy chủ vật lý

🎯 Lời khuyên lựa chọn cho người mới bắt đầu

Nếu bạn là lập trình viên cá nhân hoặc nhóm nhỏ:

  1. Giai đoạn 0 (Học tập): Chạy ứng dụng Monolithic local, hiểu HTTP, cơ sở dữ liệu, kiến trúc cơ bản
  2. Giai đoạn 1 (MVP): Triển khai ứng dụng Monolithic lên máy chủ đám mây (như Alibaba Cloud ECS, AWS EC2)
  3. Giai đoạn 2 (Tăng trưởng): Khi nhóm >10 người, nghiệp vụ phức tạp hơn, cân nhắc tách ra 1-2 microservices
  4. Giai đoạn 3 (Trưởng thành): Khi nhóm >50 người, traffic hàng triệu, Microservices hóa toàn diện

Nguyên tắc then chốt: Đừng bắt đầu với Microservices, đó là "tối ưu hóa sớm". Hãy để kiến trúc tiến hóa cùng với sự phát triển của nghiệp vụ.

6.3 Kiến trúc khuyến nghị cho các tình huống khác nhau

Tình huống 1: Lập trình viên độc lập / Dự án bán thời gian

  • Kiến trúc khuyến nghị: Serverless (Vercel/Netlify) hoặc ứng dụng Monolithic
  • Lý do: Gần như không có chi phí vận hành, trả tiền theo nhu cầu, lên sóng nhanh
  • Hệ sinh thái công nghệ ví dụ: Next.js + Vercel + Supabase

Tình huống 2: Startup xác thực MVP

  • Kiến trúc khuyến nghị: Monolithic + Máy chủ đám mây
  • Lý do: Tốc độ phát triển nhanh, nhóm có thể tập trung vào logic nghiệp vụ thay vì hạ tầng
  • Hệ sinh thái công nghệ ví dụ: Spring Boot / Django / Rails + RDS + ECS

Tình huống 3: Công ty đang phát triển (nhóm 10-50 người)

  • Kiến trúc khuyến nghị: Monolithic module hóa hoặc Microservices nhẹ
  • Lý do: Bắt đầu đối mặt với vấn đề coupling code, nhưng chưa cần độ phức tạp đầy đủ của Microservices
  • Hệ sinh thái công nghệ ví dụ: Spring Cloud / Go Micro + Kubernetes

Tình huống 4: Công ty internet lớn

  • Kiến trúc khuyến nghị: Microservices + Service Mesh + Kiến trúc trung đài
  • Lý do: Quy mô nhóm lớn, nghiệp vụ phức tạp, cần nhịp độ phát hành và công nghệ độc lập
  • Hệ sinh thái công nghệ ví dụ: RPC framework tự phát triển + Istio + Nền tảng PaaS tự xây dựng

Tình huống 5: Ứng dụng hướng sự kiện / Traffic thủy triều

  • Kiến trúc khuyến nghị: Serverless + Event Bus
  • Lý do: Traffic biến động lớn, cần tối ưu chi phí tối đa và tự động mở rộng/thu hẹp
  • Hệ sinh thái công nghệ ví dụ: AWS Lambda + API Gateway + EventBridge

7. Tổng kết và lộ trình học tập

7.1 Điểm cốt lõi

Sự tiến hóa của kiến trúc backend, về bản chất là làm phép cộngphép trừ:

Thời đạiKiến trúcViệc lập trình viên phải làmViệc vận hành phải làm
Thời đại vật lýMáy đơnViết script, triển khai thủ côngBảo trì phòng máy và phần cứng
Thời đại MonolithicMột khốiViết tất cả logic nghiệp vụBảo trì vài máy chủ lớn
Thời đại MicroservicesChia táchTập trung vào nghiệp vụ đơn nhấtBảo trì cụm K8s (rất mệt!)
ServerlessHàmChỉ viết hàm cốt lõiUống trà (nhà cung cấp đám mây lo hết)

Hiểu biết then chốt:

  • Tiến hóa kiến trúc không phải "công nghệ mới thay thế công nghệ cũ", mà là sự thay đổi của tình huống phù hợp
  • Không có viên đạn bạc, mỗi kiến trúc đều có ranh giới phù hợp của nó
  • Chọn kiến trúc cần xem xét: quy mô nhóm, độ phức tạp nghiệp vụ, đặc điểm traffic, năng lực vận hành

7.2 Lời khuyên lộ trình học tập

Tùy theo giai đoạn sự nghiệp của bạn, đề xuất lộ trình học tập sau:

Giai đoạn 1: Xây nền tảng (0-1 năm)

Mục tiêu: Hiểu các khái niệm cốt lõi của backend, có thể độc lập phát triển ứng dụng Monolithic

  • Nắm vững một ngôn ngữ backend (Java/Python/Go chọn một)
  • Học giao thức HTTP và thiết kế RESTful API
  • Nắm vững cơ sở dữ liệu quan hệ (MySQL/PostgreSQL)
  • Hiểu cơ bản về cache (Redis)
  • Học Git và các lệnh Linux cơ bản
  • Dự án thực hành: Dùng Monolithic hoàn thành một ứng dụng CRUD (như hệ thống blog, todo list)

Giai đoạn 2: Mở rộng năng lực (1-3 năm)

Mục tiêu: Hiểu hệ thống phân tán, có thể tham gia phát triển Microservices

  • Học sâu về kiến trúc Microservices và chiến lược chia tách
  • Nắm vững Docker và Kubernetes cơ bản
  • Học Message Queue (Kafka/RabbitMQ)
  • Hiểu về transaction phân tán và tính nhất quán
  • Nắm vững giám sát và log (Prometheus/ELK)
  • Dự án thực hành: Chia tách ứng dụng Monolithic thành 3-5 microservices, triển khai bằng Docker

Giai đoạn 3: Chuyên sâu (3-5 năm)

Mục tiêu: Có thể thiết kế hệ thống lớn, có năng lực lựa chọn công nghệ

  • Hiểu sâu về kiến trúc Cloud Native (Service Mesh, Serverless)
  • Nắm vững quy hoạch dung lượng và tinh chỉnh hiệu năng
  • Hiểu về kiến trúc multi-active và thiết kế khắc phục thảm họa
  • Học DDD (Domain-Driven Design)
  • Rèn luyện khả năng đánh giá công nghệ và tư duy kiến trúc
  • Dự án thực hành: Thiết kế một kiến trúc hệ thống hỗ trợ hàng triệu người dùng, bao gồm các giải pháp tính sẵn sàng cao, co giãn đàn hồi

7.3 Tài nguyên học tập liên tục

Sách:

  • "Designing Data-Intensive Applications" (DDIA) - Sách phải đọc về hệ thống phân tán
  • "Cloud Native Patterns"
  • "Building Microservices"
  • "Domain-Driven Design"

Tài nguyên trực tuyến:

  • Tài liệu kiến trúc chính thức của AWS/Azure/Alibaba Cloud
  • Tài liệu dự án CNCF (Cloud Native Computing Foundation)
  • Blog công nghệ của các công ty lớn (Netflix Tech Blog, Alibaba Tech blog, v.v.)

8. Bảng tra cứu thuật ngữ (Glossary)

Thuật ngữTên đầy đủGiải thích
Backend-Hệ thống phía máy chủ, chịu trách nhiệm xử lý logic nghiệp vụ, lưu trữ dữ liệu và API đối ngoại
CGICommon Gateway InterfaceCông nghệ web động thời kỳ đầu, xử lý request qua script và trả về kết quả
Monolith-Kiến trúc Monolithic, đóng gói tất cả logic nghiệp vụ trong cùng một ứng dụng
Microservices-Kiến trúc Microservices, chia tách nghiệp vụ thành nhiều dịch vụ độc lập
Container-Công nghệ container hóa, đóng gói ứng dụng và phụ thuộc thành đơn vị di động
K8sKubernetesNền tảng điều phối container, dùng để lập lịch, mở rộng/thu hẹp và quản trị container
Service Mesh-Lưới dịch vụ, chịu trách nhiệm quản trị giao tiếp, quan sát và bảo mật giữa các microservices
Serverless-Điện toán không máy chủ, lập trình viên chỉ viết hàm, nền tảng tự động chạy và mở rộng/thu hẹp
BaaSBackend as a ServiceDịch vụ backend đám mây cắm-và-chạy (xác thực, cơ sở dữ liệu, thanh toán, v.v.)
CI/CDContinuous Integration / DeliveryTích hợp liên tục và phân phối liên tục, quy trình tự động hóa kiểm thử và triển khai
Observability-Khả năng quan sát, sử dụng log/chỉ số/tracing để hiểu trạng thái vận hành hệ thống