FastAPI 0.163.0, phát hành ngày 14/11/2026, bổ sung tham số max_concurrency cho Depends(), giới hạn số request được dùng một dependency cùng lúc. Request vượt giới hạn sẽ chờ đến lượt thay vì mở thêm tài nguyên, và trong lúc chờ nó không chiếm worker thread.
Database chỉ có số connection giới hạn, nhưng khi traffic tăng đột biến, hàng trăm request cùng mở session sẽ làm cạn pool, sinh timeout và lỗi 500. Từ bản 0.163.0, FastAPI đưa cơ chế giới hạn vào ngay tầng dependency — đúng nơi session được tạo ra, không cần middleware hay semaphore viết tay.
Cách dùng
Gắn giới hạn vào dependency tạo session, đúng như ví dụ trong tài liệu chính thức:
SessionDep = Annotated[Session, Depends(get_session, max_concurrency=5)]
Với khai báo trên, tối đa 5 request giữ session mở qua dependency này cùng lúc. Request thứ 6 sẽ chờ đến khi một session đóng lại. Giá trị phải là số nguyên dương; mặc định None là không giới hạn.
Chia sẻ giới hạn giữa các route
Muốn nhiều route dùng chung một giới hạn, hãy tái sử dụng đúng cùng một đối tượng Depends(), ví dụ qua alias SessionDep ở trên. Nếu mỗi route tự viết một Depends(get_session, max_concurrency=5) riêng, mỗi route sẽ có giới hạn 5 của riêng mình. Giới hạn cũng chia sẻ giữa các ứng dụng mount chung một event loop, nhưng mỗi worker process có giới hạn riêng — hai worker mở tới 10 session.
Session được tính vào giới hạn đến khi nào
Với dependency dùng yield, session vẫn tính vào giới hạn cho đến khi phần code sau yield chạy xong và đóng session. Với scope="request" (mặc định), việc đóng diễn ra sau khi response đã gửi đi; với scope="function", nó diễn ra ngay sau khi hàm xử lý kết thúc. Dependency không dùng yield chỉ tính đến khi hàm trả về.
Cẩn thận deadlock
Tài liệu cảnh báo một trường hợp kẹt: cùng một request dùng chung một Depends(get_session, max_concurrency=1, use_cache=False) hai lần, lần thứ hai chờ mãi vì session đầu tiên chỉ đóng khi request kết thúc. Quy tắc an toàn: luôn lấy các tài nguyên theo cùng một thứ tự, và đừng đặt giới hạn bằng 1 cho dependency mà một request có thể cần hai lần.
Điều này có ý nghĩa gì với bạn
Hãy đặt max_concurrency bằng đúng số connection pool dành cho dependency đó, trừ phần dự phòng cho các phần khác của ứng dụng. Đây là cách rẻ nhất để biến lỗi “hết connection” khó đoán thành hàng đợi có kiểm soát: request chậm lại thay vì sập. Nếu muốn giải phóng session sớm hơn, dùng scope="function" để session đóng ngay sau khi hàm xử lý xong. Và nhớ kiểm tra số worker, vì mỗi worker có giới hạn riêng.
Bài viết liên quan
- FastAPI 0.162.6 bỏ hỗ trợ Python 3.10: đã đến lúc nâng cấp
- FastAPI: quản lý DB session an toàn bằng dependency yield trong 5 phút
- FastAPI 0.142 ra mắt: OpenTelemetry tích hợp sẵn, trace – metric – log mà không cần viết thêm code
Câu hỏi thường gặp
max_concurrency khác gì rate limiting?
Rate limiting giới hạn số request trong một khoảng thời gian, request vượt quá bị từ chối. max_concurrency giới hạn số request đang giữ dependency cùng lúc, request vượt quá sẽ chờ đến lượt.
Nên đặt max_concurrency bằng bao nhiêu?
Bằng số connection pool dành riêng cho dependency đó, trừ phần dự phòng cho các phần khác của ứng dụng. FastAPI không biết kích thước pool của bạn nên không tự suy ra con số này.
Hai ứng dụng mount chung có chia sẻ giới hạn không?
Có, nếu chúng chạy trong cùng một event loop và dùng chung cùng một đối tượng Depends(). Ứng dụng ở event loop khác, hoặc worker process khác, sẽ có giới hạn riêng.
💬 Tin này ảnh hưởng tới dự án của bạn thế nào? Chia sẻ góc nhìn của bạn trong phần bình luận — mình đọc hết và sẽ tổng hợp những ý hay nhất.
Nguồn tham khảo
- FastAPI Release Notes — 0.163.0: https://fastapi.tiangolo.com/release-notes/
- Pull Request #16746 — Add dependency concurrency limits with
Depends(max_concurrency=...): https://github.com/fastapi/fastapi/pull/16746 - FastAPI Docs — Advanced Dependencies, mục “Limit dependency concurrency”: https://fastapi.tiangolo.com/advanced/advanced-dependencies/
