Từ 'Background' Đến 'Real-time': Hành Trình Kịch Tính Xây Dựng AI Agents Siêu Mượt Cùng Trigger.dev và PostgreSQL
Lê Lân
0
Xây Dựng Hệ Thống AI Agents Sản Xuất Với Độ Ổn Định Và Cập Nhật Thời Gian Thực
Mở Đầu
Xây dựng các AI agents đạt chuẩn sản xuất không chỉ đơn thuần là gọi API từ OpenAI. Để có một hệ thống bền bỉ, xử lý các tác vụ chạy nền dài hạn, cần có hàng đợi và quan trọng không kém: khả năng hiển thị cho người dùng tiến trình công việc ngay lập tức. Đây chính là thách thức khiến Trigger.dev quyết tâm phát triển dịch vụ Realtime, một nền tảng có thể xử lý hơn 20,000 cập nhật trạng thái mỗi giây và ingest hơn 500GB dữ liệu mỗi ngày từ Postgres.
Bài viết này sẽ trình bày quá trình xây dựng, những lựa chọn kỹ thuật bất ngờ, những thành công và thất bại, cùng lý do Trigger.dev chọn Postgres replication thay vì sử dụng WebSockets cho hệ thống thời gian thực của họ.
Vấn Đề: Biến Công Việc Nền Thành Công Việc Tiền Cảnh
Trigger.dev hỗ trợ phát triển các tác vụ nền đáng tin cậy — từ AI agents, tạo video, pipelines dữ liệu đến các workflow tự động hóa. Tuy nhiên, "chạy nền" không đồng nghĩa với "vô hình". Người dùng muốn thấy thanh tiến trình, nhận cập nhật thời gian thực và chắc chắn rằng hệ thống đang hoạt động.
Chẳng hạn khi xử lý file CSV 10,000 dòng, hệ thống sẽ tạo ra nhiều tác vụ xử lý song song trên hàng loạt máy. Nếu không có cập nhật thời gian thực, người dùng chỉ nhìn thấy biểu tượng loading xoay vòng, không biết tiến trình đến đâu. Khi có Realtime, tiến trình được cập nhật rõ ràng qua thanh tiến trình, metadata được truyền về, tăng sự tin tưởng và trải nghiệm người dùng.
Việc hiển thị tiến trình công việc dưới dạng trực quan, cập nhật thời gian thực giúp người dùng trải nghiệm mượt mà, giảm sự bối rối và tăng độ tin cậy hệ thống.
Kiến Trúc: Tại Sao Chọn Postgres Replication Slots
Ban đầu, WebSockets có vẻ là giải pháp hiển nhiên cho cập nhật thời gian thực, nhưng lại gặp phải nhiều vấn đề lớn:
Historical subscriptions: Người dùng cần theo dõi các tác vụ đã bắt đầu trước khi mở trang.
Tải truy vấn DB cao: Mỗi kết nối WebSocket yêu cầu truy vấn trạng thái ban đầu rồi duy trì kết nối riêng để nhận cập nhật.
Phức tạp trong thông báo: Cần thêm hệ thống bên ngoài như triggers, queues hoặc polling để phát hiện thay đổi dữ liệu.
Sau đó, Trigger.dev phát hiện ra ElectricSQL sử dụng cơ chế Postgres replication slots. Phương pháp này giữ nguyên nguồn dữ liệu duy nhất, giảm tải lên database, đồng thời giải quyết toàn bộ các vấn đề trên.
Cách thức hoạt động hệ thống Realtime
Khi một tác vụ gọi metadata.set("foo", "bar"), nó cập nhật bảng runs trong Postgres.
Postgres ghi lại thay đổi vào Write-Ahead Log (WAL).
Khách truy cập mở trang web, sử dụng Trigger.dev Realtime và gửi yêu cầu HTTP xác thực (JWT).
ElectricSQL tạo một "shape" và thực hiện truy vấn lần đầu để lấy trạng thái hiện tại kèm transaction ID.
Từ transaction ID này, client gửi các yêu cầu long-poll để nhận các cập nhật tiếp theo.
Long-poll kết thúc khi có cập nhật hoặc timeout sau 20 giây, sau đó client tự động mở yêu cầu mới cho đến khi tác vụ hoàn thành.
Nguyên Lý Hoạt Động Của Postgres Replication Slots
Một truy vấn SQL thay đổi dữ liệu được thực thi trên Postgres.
Postgres cập nhật cache và ghi thay đổi vào WAL.
Replication slot giữ một "bookmark" vị trí WAL xử lý cuối cùng.
ElectricSQL kết nối và stream dữ liệu thay đổi theo thứ tự, cập nhật con trỏ WAL.
Kết hợp truy vấn ban đầu và long-poll theo replication slot tạo ra chế độ xem trực tiếp, liên tục trên dữ liệu.
Việc sử dụng WAL và replication slots giúp hệ thống có được một chuỗi sự kiện có thứ tự, ổn định và mạnh mẽ để cập nhật thời gian thực mà không cần hệ thống thông báo phức tạp bên ngoài.
Bảo Mật: Sử Dụng JSON Web Tokens (JWT)
Để xác thực, Trigger.dev sử dụng JWT được ký bằng API Key thay vì mỗi lần truy vấn đều phải xác minh cơ sở dữ liệu. Cách này vừa giảm tải, vừa tăng tốc đáng kể hiệu suất hệ thống thời gian thực.
read: { runs: ["run_1234", "run_5678"] }, // Token chỉ được phép đọc các run cụ thể
},
});
JWT này chứa các phạm vi quyền truy cập, cho phép hệ thống xác thực nhanh và kiểm soát mức truy cập theo từng token.
Giới Hạn Tốc Độ Kết Nối: Redis Lua Scripts
Để giới hạn số lượng kết nối realtime theo từng gói dịch vụ (ví dụ Pro được 500 kết nối đồng thời), hệ thống dùng thuật toán cửa sổ trượt (sliding window) cài dưới dạng Lua script trong Redis giúp:
Đếm số kết nối đang hoạt động trong khoảng thời gian nhất định (ví dụ 5 phút).
Tự động loại bỏ các kết nối hết hạn.
Ngăn chặn quá tải bằng cách từ chối các kết nối mới khi vượt giới hạn.
Mã Lua ngắn gọn đảm bảo tính nguyên tử và tránh điều kiện tranh chấp (race conditions).
Thách Thức Với Time Filtering Và Caching
Người phát triển muốn đăng ký theo dõi các runs trong khoảng thời gian động như "tất cả các runs tạo trong vòng 1 giờ qua" hoặc "runs có tag 'org_1234' hôm nay". Tuy nhiên ElectricSQL yêu cầu các Shapes phải có điều kiện WHERE cố định.
Giải pháp là cache các bộ lọc thời gian dựa trên shape ID để tránh tạo shape vô hạn gây ra hiện tượng rò rỉ bộ nhớ và suy giảm hiệu suất.
Trigger.dev sử dụng gói
unkey/cache
hỗ trợ caching đồng thời ở bộ nhớ trong và Redis, đảm bảo tính nhất quán và khả năng mở rộng trên nhiều server.
Hiệu Năng: Những Con Số Ấn Tượng
Sau nhiều tháng tối ưu, hệ thống đạt được:
Thông số
Giá trị
Cập nhật mỗi giây
20,000+
Dữ liệu Postgres nhập hàng ngày
> 500GB
Độ trễ cập nhật đến trình duyệt
< 100ms
Sự phối hợp giữa Postgres giữ tải ghi dữ liệu và ElectricSQL xử lý phân phối dữ liệu giúp kiến trúc này mở rộng tốt, bền vững.
Tại Sao Chọn ElectricSQL Thay Vì Các Giải Pháp Khác?
Những lợi ích nổi bật:
Sử dụng luôn Postgres làm nguồn dữ liệu chính giữ trạng thái.
Người dùng có thể subscribe với dữ liệu theo thời gian ngay cả khi tác vụ đã hoàn thành từ trước.
Đảm bảo tính nhất quán mạnh mẽ (strong consistency).
Giảm thiểu độ phức tạp vận hành.
Hạn chế tải lớn lên database chính.
Trigger.dev Realtime cung cấp tài liệu chi tiết và React hooks để tích hợp mượt mà.
Việc xây dựng hệ thống AI agents có khả năng xử lý tác vụ nền với quy mô lớn và cập nhật thời gian thực đến người dùng không phải là chuyện đơn giản. Giải pháp của Trigger.dev thông qua việc tận dụng Postgres replication slots và ElectricSQL đã tạo ra một nền tảng vững chắc, giảm tải cho cơ sở dữ liệu và cung cấp trải nghiệm người dùng tuyệt vời với dữ liệu luôn được cập nhật nhanh chóng.
Bằng cách áp dụng kiến trúc tinh gọn này, các nhà phát triển có thể xây dựng và vận hành các ứng dụng AI phức tạp mà vẫn giữ được hiệu suất và độ ổn định cao.
Nếu bạn đang tìm kiếm một giải pháp realtime tin cậy cho các tác vụ nền trong ứng dụng, Trigger.dev là một lựa chọn đáng cân nhắc.