VECTIQ
← Tất cả bài viết
Ghi chép kỹ thuật · Computer Vision & Camera AI

Vì Sao Chúng Tôi Bỏ Hộp AI Khỏi Site Khách Hàng

Vectiq VMS khởi đầu là hệ thống edge-first với một hộp AI nhỏ tại từng site khách hàng. Chúng tôi đã bỏ nó. Đây là cái giá thật của xử lý tập trung, cái được lại, và cách bộ lập lịch cùng cơ chế failover hoạt động.

bởi Vectiq Engineering · 2026-09-17 · 9 phút đọc
Vì Sao Chúng Tôi Bỏ Hộp AI Khỏi Site Khách Hàng

Phiên bản đầu của Vectiq VMS là kiến trúc lai edge cộng cloud. Mỗi site khách hàng có một hộp nhỏ: nó giải mã luồng camera, chạy nhận diện, ghi hình và đồng bộ sự kiện lên trên. Nó chạy được. Chúng tôi vẫn bỏ nó đi.

Cái giá thật của hộp edge

Bản thân cái hộp chưa bao giờ là phần khó. Phần khó là những thứ vây quanh nó:

  • Cấp phát danh tính. Mỗi hộp phải có danh tính trước khi được tin. Kéo theo claim code, mutual TLS, một certificate authority, và một câu chuyện thu hồi chứng chỉ.
  • Cập nhật. Firmware trên phần cứng bạn không với tới được buộc phải có phân vùng A/B và đường lùi, vì một bản cập nhật hỏng ở kho cách hai tỉnh là một chuyến xe đi sửa.
  • Mã hóa đĩa. Video nằm trên một cái hộp trong phòng sau của khách là video có người bê đi được. Thế là kéo theo TPM và LUKS.
  • Giao diện tại chỗ. Khi mất đường truyền, người ở site vẫn muốn xem camera, nên cái hộp cần trình xem riêng — một frontend thứ hai phải xây và phải giữ đồng bộ.
  • Relay. Muốn xem camera từ ngoài site, luồng phải chui qua NAT, tức là cần một dịch vụ relay ở giữa.

Không thứ nào trong số đó phục vụ mục tiêu thật của khách: nhìn thấy camera của mình và được báo khi có chuyện. Tất cả chúng chỉ là bề mặt chúng tôi phải bảo trì. Đếm lại, bản triển khai edge có khoảng năm phân hệ mà lý do tồn tại duy nhất là có một cái máy tính đặt trong căn phòng chúng tôi không kiểm soát.

Thứ thay thế nó

Camera giờ đẩy luồng về các worker node do chúng tôi vận hành. Node giải mã, chạy suy luận và ghi hình. Site khách chỉ còn camera và đường mạng, không gì khác.

Camera (RTSP/ONVIF)
   -> MediaMTX / go2rtc      restream một lần, nhiều bên cùng dùng
   -> Worker node            giải mã, lọc chuyển động, suy luận theo lô, ghi hình
   -> NATS                   sự kiện và điều khiển, subject khóa theo node_id
   -> Lõi điều khiển (Go)    API, scheduler, Postgres có RLS
   -> Portal / cảnh báo      trình duyệt, PWA di động, webhook

Node không được tin hơn cái hộp cũ. Nó xác thực bằng token, và chỉ nhận cấu hình của những camera đã gán cho nó — GET /internal/v1/nodes/{id}/config. Node hỏi cấu hình của node khác nhận 404, không phải một câu trả lời nửa vời. Chúng tôi có bài test sẽ fail nếu có lúc nào đó node tự nhận camera.

Cách ly tenant nằm trong cơ sở dữ liệu

Một nền tảng mà một đại lý bán lại cho bốn mươi khách hàng là bốn mươi bán kính thiệt hại. Đặt kiểm tra tenant_id trong code ứng dụng nghĩa là mỗi endpoint mới là một cơ hội để quên.

Chúng tôi đặt nó vào row-level security của PostgreSQL. Ứng dụng kết nối bằng một role không thể nhìn xuyên tenant; policy nằm trên bảng, không nằm trong handler. Thiếu một WHERE tenant_id = ... khi đó là một truy vấn trả về rỗng, không phải một truy vấn trả về camera của người khác.

LƯU Ý
RLS không miễn phí

Row-level security kéo theo bài toán trứng-gà có thật: tenant và chủ tài khoản đầu tiên không thể được tạo bởi một role ứng dụng vốn đã bị giới hạn trong một tenant. Đó là lý do có công cụ vmsctl riêng với DSN quản trị, và lý do tài liệu dành hẳn một trang cho nó. Ai bảo chuyện này đơn giản thì chưa từng chạy thật.

Bộ lập lịch, và chuyện gì xảy ra khi một node chết

Camera phải nằm ở đâu đó. Bộ lập lịch gán chúng theo một mô hình chi phí tôn trọng hạn mức GPU và băng thông của từng node, và ưu tiên để camera nằm nguyên chỗ cũ — dời một luồng phải trả giá bằng một lần kết nối lại và một khoảng trống trong bản ghi, nên tính dính đáng giá hơn cân bằng hoàn hảo.

Vòng lặp chạy dưới một advisory lock của PostgreSQL, nên nhiều bản sao của lõi điều khiển có thể cùng chạy mà đúng một bản lập lịch tại một thời điểm. Không cần dịch vụ bầu leader, không thêm bộ phận chuyển động nào.

Failover chính là vòng lặp đó với một kích hoạt khác. Node báo cáo tình trạng; khi báo cáo ngừng, camera của nó trở về trạng thái chưa gán và lượt quét kế tiếp đặt chúng lên các node còn khỏe. Khoảng trống bản ghi là có thật và hiện rõ — dòng thời gian xem lại chỉ ra khoảng nào có và khoảng nào không, thay vì vẽ một thanh liền mạch rồi lỗi khi bạn bấm vào chỗ trống.

Những cái giá chúng tôi chấp nhận

Xử lý tập trung không miễn phí, và nói ngược lại là không trung thực:

  • Băng thông tải lên. Giờ luồng của mọi camera đều rời khỏi site. Một site hai mươi camera 2 MP cần băng thông lên thật sự, và điều đó phải nằm trong khảo sát trước khi bán.
  • Phụ thuộc đường truyền. Thời còn hộp edge, mất đường truyền nghĩa là "không xem được từ xa". Giờ nó nghĩa là "không ghi hình". Với site không chấp nhận được điều đó, câu trả lời là một đầu ghi tại chỗ, không phải hồi sinh cái hộp AI.
  • Độ trễ. Nhận diện giờ cộng thêm một vòng đi về qua mạng. Với chống xâm nhập và ANPR ở cổng, độ trễ này nằm thoải mái trong khoảng hữu ích; với thứ cần tác động dưới 100 ms thì không.

Chúng tôi chấp nhận những cái giá đó vì phương án còn lại là bảo trì vĩnh viễn năm phân hệ chỉ để một cái máy tính được đặt trong căn phòng chúng tôi không kiểm soát. Với một nền tảng bán qua đại lý — nơi người vận hành không phải là khách hàng và một chuyến xe đi sửa là chi phí thật — cán cân này không hề sát.

Thứ chúng tôi đã kiểm chứng, không phải thứ chúng tôi giả định

Topology tập trung được kiểm thử trên dịch vụ thật chứ không phải mock: PostgreSQL thật đã áp policy RLS, NATS thật, MediaMTX thật, một node agent thật kéo một luồng RTSP thật. Những bài test đáng giá là các bài test phủ định — một node lẽ ra không được thấy một camera, một token lẽ ra không mở được cấu hình của node khác, một tenant lẽ ra không xuất hiện trong nhật ký kiểm toán của tenant khác. Đó là những bài sẽ kêu to khi có người refactor làm mất lớp cách ly.

Vectiq VMSMulti-tenantNATSPostgreSQLArchitecture