Ba thế hệ Autoscaling — Và vì sao lưu lượng từ AI Agent phá vỡ tất cả

17 tháng 8, 2026·8 phút đọc

Lưu lượng truy cập từ các tác nhân AI (agent) không còn tuân theo các mô hình dự đoán truyền thống, phá vỡ cả hai phương pháp scaling chính là on-demand và serverless. Bài viết phân tích ba thế hệ autoscaling, chỉ ra những hạn chế của chúng trước các luồng yêu cầu bùng nổ bất thường từ agent, đồng thời đề xuất bốn lớp kiến trúc mới để xử lý hiệu quả: scaling dựa trên hành vi, kiến trúc queue, kiểm soát lưu lượng theo token và cơ chế retry thông minh.

Ba thế hệ Autoscaling — Và vì sao lưu lượng từ AI Agent phá vỡ tất cả

Ba thế hệ Autoscaling — Và vì sao lưu lượng từ AI Agent phá vỡ tất cả

Lưu lượng truy cập từ các tác nhân AI (agent) đang thay đổi cách chúng ta thiết kế hệ thống backend. Khác với lưu lượng do con người tạo ra — có thể dự đoán và tự giới hạn — lưu lượng từ agent đến theo các đợt bùng nổ không thể lường trước, lặp lại không ngừng và tiêu tốn chi phí rất lớn. Bài viết này phân tích ba thế hệ autoscaling, giải thích vì sao cả hai mô hình thống trị hiện nay đều thất bại trước xu hướng mới, và đề xuất bốn lớp kiến trúc thực tế cần áp dụng từ ngay hôm nay.

Giả định nền tảng đang bị phá vỡ

Mọi khung scaling chúng ta từng xây dựng đều giả định rằng lưu lượng truy cập trông giống cách con người tạo ra nó. Tuy nhiên, so sánh giữa hai loại lưu lượng cho thấy sự khác biệt hoàn toàn:

Tiêu chíLưu lượng từ con ngườiLưu lượng từ AI Agent
Hình dạngĐường cong theo ngày, có thể dự đoán. Ngày mai giống hôm nay.Không có lịch trình. Bùng nổ theo sự kiện điều phối, không theo đồng hồ.
Tốc độ tăngTăng dần từ giây đến phút.Gần như tức thời. Đạt tốc độ tối đa trong mili giây.
Độ tương tranhNgười dùng độc lập, tự động làm mượt theo quy luật số lớn.Fan-out tương quan từ một trigger duy nhất — không có sự làm mượt thống kê nào.
RetryCó giới hạn. Người dùng bỏ cuộc hoặc backoff vì bực bội.Không ngừng nghỉ. Không có ngân sách retry, một lỗi nhỏ biến thành retry storm.
Độ trễDưới giây hoặc người dùng rời đi.Chấp nhận từ giây đến phút — có thể khai thác độ trễ này.
Chi phíSố request tỷ lệ thuận với chi phí.Request và chi phí tách rời. Một chuỗi suy luận nặng có thể tốn hơn hàng nghìn request nhẹ.
Chế độ lỗiSuy thoái mượt mà — người dùng tự rời đi.Tự khuếch đại. Vòng lặp rút cạn tài nguyên và trên serverless, tính tiền cho mọi cuộc gọi thừa.

Lưu lượng từ agent vi phạm tất cả bảy giả định này cùng một lúc. Vì vậy, câu trả lời không nằm ở việc tối ưu hóa mô hình hiện có, mà là đặt trí thông minh ở một nơi hoàn toàn khác.

Thế hệ 1: Dự đoán trước (On-demand instances)

Hồi làm việc với hệ thống video streaming phục vụ hàng triệu người xem, việc lập kế hoạch dung lượng hoàn toàn là bài toán của con người. Khi một sự kiện trực tiếp lớn sắp diễn ra, chúng tôi biết chính xác thời điểm đỉnh điểm, độ dốc tăng trưởng và khi nào nó hạ nhiệt. Toàn bộ công việc xoay quanh sự dự đoán: pre-warm các EC2 fleet nhiều ngày trước, thiết lập min/max autoscale bounds, và túc trực trong war room suốt sự kiện.

Thế hệ 1 dựa trên giả định cốt lõi: đỉnh điểm có thể dự báo, do đó hãy cung cấp tài nguyên trước.

Thế hệ 2: Tin tưởng phản ứng (Serverless)

Serverless đã thay đổi cuộc chơi với API Gateway, Lambda, Step Functions — câu chuyện về việc cung cấp tài nguyên gần như biến mất. Bạn ngừng pre-warming và bắt đầu tin tưởng nền tảng tự phản ứng. Mô hình này hoạt động tốt vì lưu lượng vẫn chủ yếu do con người tạo ra: người dùng mở ứng dụng, điều hướng, tương tác và đóng lại. Tốc độ phản ứng của nền tảng đủ nhanh vì sự gia tăng diễn ra dần dần.

Thế hệ 2 dựa trên giả định: bạn không cần dự đoán, vì nền tảng phản ứng nhanh hơn tốc độ tăng trưởng của nhu cầu.

Vì sao máy móc điều phối phá vỡ cả hai mô hình

Việc điều phối phi xác định — các agent tự trị, chuỗi gọi tool đa bước, vòng lặp truy xuất — khiến cả hai mô hình thất bại đồng thời:

  • Phá vỡ Thế hệ 1: Không có lịch trình để dự đoán. Bạn không thể pre-warm cho một đỉnh điểm không thể biết trước.
  • Phá vỡ Thế hệ 2: Scaling phản ứng là tín hiệu lagging. Lưu lượng agent đạt tốc độ tối đa trong mili giây — khi CPU-based autoscaling kích hoạt, hệ thống đã suy thoái. Tệ hơn, serverless trung thành thực thi mọi cuộc gọi thừa trong một vòng lặp agent mất kiểm soát — và tính tiền bạn cho sự rối loạn đó.

Ba thế hệ autoscaling và những giới hạnBa thế hệ autoscaling và những giới hạn

Lớp 1: Scaling dựa trên hành vi

Ngừng scaling dựa trên CPU usage. Đó là tín hiệu lagging — khi nó vượt ngưỡng, một vòng lặp agent đã rút cạn tài nguyên. Tín hiệu bạn cần theo dõi là request velocity và hình dạng dữ liệu. Các request gần như giống hệt nhau từ một caller là dấu hiệu rõ ràng của một vòng lặp agent đang cần kiểm tra — trước khi nó xuất hiện trên chỉ số CPU tổng hợp.

Pattern kiểm tra velocity + diversity của payload để phát hiện caller đang lặp vô hạn và cô lập chúng:

import time
from collections import defaultdict, deque

class AgentLoopDetector:
    def __init__(self, window_s=10, rate_threshold=50, diversity_threshold=0.2):
        self.window_s = window_s
        self.rate_threshold = rate_threshold
        self.diversity_threshold = diversity_threshold
        self.events = defaultdict(deque)

    def is_looping(self, caller_id: str, payload_hash: str) -> bool:
        now = time.monotonic()
        q = self.events[caller_id]
        q.append((now, payload_hash))
        while q and now - q[0][0] > self.window_s:
            q.popleft()
        rate = len(q)
        if rate < self.rate_threshold:
            return False
        unique = len(set(h for _, h in q))
        return (unique / rate) < self.diversity_threshold

Lớp 2: Queue là vũ khí bí mật

Thay vì để client gửi yêu cầu đồng thời, hãy chuyển sang mô hình queue-based: client gửi request vào queue và quay lại poll kết quả. Kiến trúc này giải quyết bài toán bùng nổ tức thời bằng cách cho phép queue hấp thụ đột biến và giải phóng công việc theo tốc độ có kiểm soát. Backpressure 429 với header Retry-After sẽ thông báo cho caller biết cần chậm lại thay vì phải xếp hàng vô hạn.

Lớp 3: Kiểm soát lưu lượng theo token

Thay vì giới hạn số request mỗi phút, hãy chuyển đơn vị kiểm soát sang chi phí tài nguyên. Một token bucket gắn với từng phiên — trừ theo số token hoặc compute thực tế, không phải số lần gọi — cho phép một chuỗi suy luận nặng nề bị cắt ngay lập tức, trong khi các caller nhẹ nhàng vẫn đi qua bình thường:

import time

class SessionTokenBucket:
    def __init__(self, capacity_tokens=100_000, refill_per_s=1_000):
        self.capacity = capacity_tokens
        self.refill = refill_per_s
        self.state = {}

    def _tokens(self, session_id):
        now = time.monotonic()
        avail, last = self.state.get(session_id, (self.capacity, now))
        avail = min(self.capacity, avail + (now - last) * self.refill)
        self.state[session_id] = [avail, now]
        return avail

    def admit(self, session_id, est_tokens) -> bool:
        if self._tokens(session_id) < est_tokens:
            return False
        self.state[session_id][0] -= est_tokens
        return True

Lớp 4: Retry ngân sách và Circuit breaker

Một agent không có ngân sách retry sẽ biến một lỗi tạm thời thành một cơn bão. Cần xây dựng cơ chế circuit breaker phía client, bỏ cuộc sau một số lần thử có chủ đích, và tôn trọng header Retry-After từ máy chủ:

class CircuitBreaker:
    def __init__(self, failure_threshold=5, cooldown_s=30):
        self.failures = 0
        self.breaker_threshold = failure_threshold
        self.cooldown_s = cooldown_s
        self.open_until = 0

    def call(self, fn, retries=5):
        for attempt in range(retries):
            if time.monotonic() < self.open_until:
                raise CircuitOpen("breaker tripped")
            try:
                resp = fn()
            except Exception:
                self.failures += 1
                if self.failures >= self.breaker_threshold:
                    self.open_until = time.monotonic() + self.cooldown_s
                    raise CircuitOpen("breaker tripped")
                delay = 2 ** attempt + random.random()
                time.sleep(delay)
                continue
            self.failures = 0
            return resp
        raise RetryBudgetExhausted("stopped asking")

Bốn lớp kiến trúc cho lưu lượng agentBốn lớp kiến trúc cho lưu lượng agent

Điều này dẫn chúng ta đến đâu?

Chúng ta trải qua Thế hệ 1 với việc dự đoán tải. Thế hệ 2 tin tưởng nền tảng tự phản ứng. Thế hệ 3 đòi hỏi điều khó hơn: xây dựng client và hạ tầng đủ thông minh để không tạo ra tải ngay từ đầu. Ngay cả với Thế hệ 1 và 2 cho các tải xác định từ con người, tôi đã thấy những client hoạt động sai gây ra sự cố. Client cần đủ thông minh để hiểu yêu cầu và tôn trọng mọi tín hiệu backpressure.

Nếu bạn đang thiết kế kiến trúc agent hôm nay — điều phối các lời gọi LLM, chạy pipelines truy xuất, để language model lập kế hoạch và hành động — hãy xây dựng ngân sách retry, circuit breaker và cooperative backpressure ngay từ ngày đầu. Đừng để chúng trở thành suy nghĩ muộn màng khi chi phí bắt đầu đội lên.

Valve thông minh nhất không nằm ở cửa ống dẫn. Nó nằm ngay tại nguồn.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗