🇬🇧 Read the English version of this article on tanhdev.com
Khi trào lưu Multi-Agent bùng nổ, phản xạ tự nhiên của hầu hết các Backend Engineer là: “Hãy đóng gói mỗi Agent thành một Microservice!”. Tư duy này cực kỳ hợp lý với các hệ thống Web/App truyền thống. Tuy nhiên, đối với hệ sinh thái AI Agents, kế thừa từ bài toán Agentic System Architecture, đây lại là khởi nguồn của thảm họa hiệu năng.
1. Nút thắt “Translation Tax” của Microservices
Answer-first: Giao tiếp qua mạng gRPC/HTTP giữa các Microservices tạo ra độ trễ 1-5ms mỗi chặng (hop), cộng thêm “Translation Tax” khổng lồ khi phải liên tục chuyển đổi giữa JSON của LLM và Protobuf. Modular Monolith giải quyết việc này bằng tốc độ in-memory (nanoseconds).
LLM bản chất giao tiếp bằng chuỗi văn bản (JSON cho Function Calling). Khi bạn chia tách hệ thống thành các Microservices:
- Độ trễ mạng (Network Tax): Khi một Agent gọi 1,000 lần vào các Tools nhỏ (ví dụ: cào dữ liệu, chunking văn bản), nó tốn 1,000 đến 5,000 ms chỉ riêng cho việc bắt tay TCP/TLS (handshake) và truyền dẫn qua lại mạng nội bộ.
- Chi phí biên dịch (Translation Tax): Lượng CPU bị đốt cháy cho quá trình tuần tự hóa vô nghĩa:
LLM sinh ra JSON -> Backend parse JSON -> Đóng gói thành Protobuf -> Truyền qua gRPC -> Giải mã Protobuf bên Tool -> Trả kết quả ngược lại. - Modular Monolith: Kế thừa tư tưởng từ Kiến trúc Modular Monolith, bằng cách gộp các Agents và Tools vào chung một process nhưng chia tách ranh giới logic (Modules), việc giao tiếp chỉ là truyền các pointers bộ nhớ (Objects). Độ trễ giảm xuống mức vài nanoseconds, triệt tiêu hoàn toàn chi phí network và serialization.
2. Quản lý State với Dapr Actor Model
Answer-first: Dapr Virtual Actors cung cấp cơ chế “Turn-based Concurrency” (Đồng thời theo lượt), giúp mỗi Agent sở hữu một vùng nhớ State độc lập mà không bao giờ lo xung đột (race conditions).
Một AI Agent cần duy trì bộ nhớ (Memory), lịch sử hội thoại (Context) và lập kế hoạch (Reasoning).
- Nếu dùng Stateless REST APIs thông thường, bạn phải liên tục kéo và đẩy dữ liệu Context khổng lồ (hàng chục ngàn tokens) ra vào Database, gây tốn kém IOPS kinh khủng.
- Bằng cách mô hình hóa mỗi Agent thành một Dapr Virtual Actor, state của Agent đó được giữ nguyên trong bộ nhớ (In-memory). Cơ chế Turn-based Concurrency của Dapr bảo đảm rằng tại bất kỳ thời điểm nào, chỉ có duy nhất một luồng (thread) được phép cập nhật state của Actor đó. Bạn không cần phải viết code khóa lock, mutex, hay lo sợ mất đồng bộ dữ liệu.
3. Tích hợp MCP “In-Process” (Local stdio)
Answer-first: Thay vì chạy Model Context Protocol (MCP) như những dịch vụ độc lập qua REST/SSE, việc nhúng MCP Server chạy cục bộ (stdio) bên trong Modular Monolith giúp loại bỏ hoàn toàn Gateway và Service Mesh dư thừa.
Model Context Protocol (MCP) là “cổng USB-C” để kết nối các Tools bên ngoài vào LLM. Tuy nhiên:
- Vấn đề của Standalone MCP: Nếu mỗi team phát triển một MCP Server riêng, bạn sẽ nhanh chóng có hàng tá Microservices phải quản lý mTLS, Authentication và Rate-limiting nội bộ (như đã cảnh báo trong Tech Radar 14/07: Zero-Trust Security).
- Local
stdioIntegration: Trong kiến trúc Modular Monolith, host process (AI Agent) sẽ gọi trực tiếp các MCP Tools thông qua các kênh luồng chuẩnstdin/stdoutcủa hệ điều hành. Giao tiếp JSON-RPC diễn ra cực kỳ tốc độ trên hệ thống pipe cục bộ, đảm bảo tính đóng gói (Encapsulation) khép kín tuyệt đối mà không cần phơi bày API ra port mạng.
Tài liệu tham khảo:
- Dapr Concepts: Virtual Actors & Turn-based Concurrency.
- Model Context Protocol (MCP) Transports Documentation.
- Vercel & Daily.dev: Microservices Network Tax Benchmarks.