Serverless function có trần thời gian chạy; một câu trả lời dài, một agent gọi nhiều tool hay một pipeline có bước truy xuất đều có thể vượt trần và bị cắt giữa chừng.
Trước tiên: nâng và bám sát giới hạn. Khai báo maxDuration cho route xử lý AI (nền tảng có trần riêng theo gói) và giữ streaming — streaming không kéo dài trần, nhưng giữ cho người dùng thấy chữ ngay thay vì chờ trắng rồi timeout.
// app/api/chat/route.ts
export const maxDuration = 300
export const runtime = 'nodejs'Khi vẫn không đủ, đổi mô hình xử lý: chuyển từ "một request giữ suốt" sang việc chạy nền có trạng thái.
1. POST tạo job, ghi vào DB với trạng thái pending, trả về job_id ngay.
2. Một worker (queue, cron, hoặc runtime chạy dài) xử lý job và ghi dần kết quả.
3. Client theo dõi qua SSE hoặc polling theo job_id.
Mô hình này còn giải quyết luôn hai vấn đề mà request đơn không xử lý được: người dùng đóng tab vẫn không mất kết quả, và tải lại trang vẫn xem tiếp được vì trạng thái nằm ở server chứ không nằm trong kết nối.
Những điểm cần chú ý:
- Ghi tăng dần. Lưu từng phần đầu ra khi nhận được, đừng đợi xong mới ghi — function bị cắt là mất trắng công việc đã trả tiền.
- Idempotency. Job có khoá duy nhất theo request để retry không tạo hai lần chạy song song trên cùng một việc.
- Cắt nhỏ pipeline. Bước truy xuất, bước sinh, bước hậu xử lý tách thành các bước riêng có checkpoint; lỗi ở bước cuối không phải chạy lại từ đầu.
Quy tắc chọn: hội thoại tương tác dưới ngưỡng trần thì giữ streaming trong một request cho đơn giản; tác vụ dài (báo cáo, xử lý tài liệu, agent nhiều bước) thì dùng job nền ngay từ đầu, đừng cố nhét vào một request.