Khóa học "Lập trình Bất đồng bộ Thực chiến với Python: Từ Event Loop đến Web & WebSocket Hiệu năng cao" được thiết kế theo lộ trình thực hành cuốn chiếu từ bản chất cơ chế của hệ điều hành đến ứng dụng thực tế trong backend web hiện đại.
Khóa học chia làm 4 Module chính với thời lượng gợi ý: 12 buổi thực hành (khoảng 1.5 - 2 giờ/buổi), đi kèm mã nguồn mẫu và các thử thách nâng cấp.
Module 1: Bản chất Bất đồng bộ & Core Asyncio (Buổi 1 -> 3)
↓
Module 2: Đồng bộ hóa & Giao tiếp Đa tác vụ (Buổi 4 -> 6)
↓
Module 3: Kiến trúc Web Asynchronous với FastAPI/Starlette (Buổi 7 -> 9)
↓
Module 4: Real-time WebSocket, Phân tán & Đồ án Tốt nghiệp (Buổi 10 -> 12)
Bản chất phần cứng & HĐH: Phân biệt bài toán nghẽn tính toán (CPU-bound) vs bài toán nghẽn vào/ra (I/O-bound: đọc ổ cứng, truy vấn database, gọi mạng).
Cơ chế Event Loop (Vòng lặp sự kiện):
Mô hình phục vụ đơn luồng (Single-thread Concurrency): Người bồi bàn thông minh nhận order từ nhiều bàn thay vì đứng chờ nhà bếp nấu xong từng món.
Phép so sánh hiệu năng: Thực nghiệm gọi 50 HTTP requests giả lập bằng tuần tự (time.sleep) vs bất đồng bộ (asyncio.sleep).
Cú pháp cốt lõi: async def, await, Coroutine object là gì?
Task & GatherCoroutine vs Task: Chuyển một Coroutine thành một asyncio.Task để đưa vào hàng đợi chạy ngầm (asyncio.create_task()).
Chạy song song hàng loạt: Kỹ thuật gom nhóm asyncio.gather(*tasks) và asyncio.as_completed().
Xử lý ngoại lệ trong môi trường bất đồng bộ: Cơ chế return_exceptions=True để một tác vụ lỗi không làm sập toàn bộ hệ thống.
Thực hành: Viết công cụ Web Health-Checker kiểm tra đồng thời trạng thái của 20 website trong vòng chưa đầy 1 giây.
Hủy tác vụ an toàn: task.cancel() và bắt ngoại lệ asyncio.CancelledError để dọn dẹp tài nguyên (Graceful Cleanup).
Kiểm soát thời gian chờ: asyncio.wait_for(coro, timeout=...) chống treo tác vụ.
Cầu nối bất đồng bộ - đồng bộ: Cách chạy các hàm đồng bộ nặng hoặc thư viện bên thứ 3 không hỗ trợ async (như requests, tính toán số học, mã hóa RSA) vào ThreadPool bằng asyncio.to_thread() hoặc run_in_executor().
asyncio.Event & asyncio.Conditionasyncio.Event (Cờ tín hiệu trạng thái):
Cơ chế: wait(), set(), clear(), is_set().
Mô hình Producer - Consumer kích hoạt theo điều kiện (ví dụ: chờ hệ thống nạp xong cấu hình từ database thì toàn bộ các worker mới bắt đầu nhận việc).
Ứng dụng: Xây dựng hệ thống đèn giao thông và rào chắn mô phỏng bằng tín hiệu Event.
asyncio.Lock: Bảo vệ biến dùng chung (Shared State) trong môi trường nhiều tác vụ chuyển đổi qua lại.
asyncio.Semaphore (Bộ đếm giới hạn tải - Rate Limiter):
Khống chế chỉ cho phép tối đa $N$ tác vụ chạy đồng thời (tránh làm sập máy chủ bên thứ ba khi cào dữ liệu hoặc gọi API bên ngoài).
Thực hành: Viết bộ giới hạn tải (Throttling Client) gọi API bên ngoài không quá 5 request cùng một thời điểm.
asyncio.Queue) & Đường ống Xử lý (Pipeline)Cấu trúc dữ liệu asyncio.Queue: put(), get(), task_done(), join().
Mô hình Pipeline xử lý công việc:
Worker 1 (Producer): Đọc dữ liệu thô.
Worker 2 (Transformer): Chuyển hóa và kiểm tra dữ liệu.
Worker 3 (Consumer): Ghi dữ liệu vào kho lưu trữ.
Thực hành: Xây dựng hàng đợi xử lý tác vụ gửi email/thông báo nền có cơ chế backpressure (chống tràn RAM khi tác vụ vào quá nhanh).
Tại sao WSGI (Flask/Django truyền thống) không phù hợp cho kết nối duy trì lâu dài?
Tiêu chuẩn ASGI (Asynchronous Server Gateway Interface): Cách thức máy chủ ASGI (như Uvicorn) phân phối các sự kiện kết nối qua Event Loop.
Khởi tạo dịch vụ FastAPI thuần async: Viết các endpoint async xử lý I/O non-blocking, phân tích sự khác nhau giữa định nghĩa def và async def trong FastAPI.
Lifespan Context Manager: Quản lý kết nối khởi động (startup) và ngắt kết nối (shutdown) an toàn bằng asynccontextmanager.
Database Connection Pooling: Kết nối cơ sở dữ liệu phi đồng bộ (sử dụng asyncpg cho PostgreSQL hoặc aiosqlite) để đạt hàng nghìn truy vấn mỗi giây mà không cần tạo mới kết nối liên tục.
Thực hành: Xây dựng REST API tra cứu và cập nhật trạng thái thiết bị IoT với kết nối DB bất đồng bộ.
Từ HTTP Polling đến WebSocket Full-Duplex:
So sánh cơ chế Request-Response cổ điển với kết nối hai chiều liên tục (Handshake, Frame, Ping/Pong keep-alive).
Tích hợp Endpoint WebSocket trong FastAPI: Tiếp nhận kết nối, lắng nghe thông điệp và truyền phản hồi thời gian thực qua websocket.receive_text() và websocket.send_text().
Thiết kế kiến trúc Connection Manager theo chuẩn OOP:
Quản lý danh sách các client đang trực tuyến (active_connections).
Cơ chế kết nối, ngắt kết nối an toàn khi mạng chập chờn.
Hỗ trợ gửi tin nhắn cá nhân (Unicast) và phát sóng toàn hệ thống (Broadcast).
Kỹ thuật chia phòng (Rooms / Channels): Cho phép client tham gia theo từng chủ đề hoặc từng phòng riêng biệt.
Vấn đề của bộ nhớ cục bộ: Khi hệ thống web chạy trên nhiều tiến trình (đa worker Uvicorn) hoặc phân cụm trên nhiều server, client ở Server A sẽ không nhận được tin nhắn từ client ở Server B.
Giải pháp Message Broker (Redis): Dùng thư viện redis-py async để phát và lắng nghe bản tin (Publish/Subscribe), đồng bộ thông điệp giữa các WebSocket server không phụ thuộc vào hạ tầng vật lý.
Tùy chọn A (Dashboard Giám sát Phân tán): Hệ thống nhận luồng thông số (CPU, RAM, sự kiện hệ thống) từ nhiều client gửi về qua WebSocket và cập nhật biểu đồ trực tiếp trên giao diện web.
Tùy chọn B (Phòng Họp & Trò chuyện Trực tuyến Real-time): Ứng dụng chat đa kênh có xác thực, hiển thị trạng thái đang nhập (typing status), gửi thông báo hệ thống và lưu trữ lịch sử tin nhắn bất đồng bộ.
Ngôn ngữ: Python 3.10+ (tận dụng tối đa các cải tiến của asyncio và cú pháp TaskGroup).
Thư viện Backend Core: asyncio, uvicorn, fastapi, websockets.
Thư viện Hỗ trợ & Lưu trữ: httpx (HTTP client async), aiosqlite hoặc asyncpg, redis-py (asyncio support).
Công cụ Kiểm thử: Terminal/cURL, Postman (hỗ trợ WebSocket request), hoặc trang giao diện HTML/JavaScript tối giản kèm theo mỗi bài học để kiểm tra trực tiếp trên trình duyệt.