1375 lines
33 KiB
Markdown
1375 lines
33 KiB
Markdown
# Codex 多机协作系统详细技术选型
|
||
|
||
目标:
|
||
|
||
- 把整体技术方案从“架构概念”细化到“可以开工”的选型级别
|
||
- 明确每个核心模块建议用什么语言、数据库、中间件、向量库和部署方式
|
||
- 保持技术栈尽量少而稳,同时满足多机协作、跨设备运维、审计、多模态和硬件测试
|
||
|
||
---
|
||
|
||
## 1. 总体选型原则
|
||
|
||
1. 云端核心服务尽量少语言,优先统一到 `Python + TypeScript`。
|
||
2. 和 `Codex app-server / SDK`、硬件测试、审计链路耦合最深的服务,优先用 `Python 3.12`。
|
||
3. 手机端先做 `Web / PWA`,不要一开始就上双原生。
|
||
4. 默认先把数据平面统一到 `Postgres + pgvector`,把 `Redis / NATS / S3/MinIO` 作为后续按规模增加的能力。
|
||
5. 日志、指标、链路要从一开始就带上,不要后补。
|
||
|
||
---
|
||
|
||
## 2. 语言与框架建议
|
||
|
||
### 2.1 前端
|
||
|
||
- `TypeScript`
|
||
- `Next.js 15`
|
||
- `React 19`
|
||
- `Tailwind CSS 4`
|
||
- `shadcn/ui` 或自建轻量组件层
|
||
|
||
用途:
|
||
|
||
- 手机端 PWA
|
||
- Web 控制台
|
||
- 项目页、线程页、审批中心、节点状态页、运维中心
|
||
|
||
### 2.2 云端控制平面
|
||
|
||
- `Python 3.12`
|
||
- `FastAPI`
|
||
- `Pydantic 2`
|
||
- `SQLAlchemy 2`
|
||
- `LangGraph`
|
||
|
||
用途:
|
||
|
||
- Master Agent Runtime
|
||
- API Gateway / BFF
|
||
- 审计编排
|
||
- 运维编排
|
||
- Thread Registry / Broker 业务层
|
||
|
||
### 2.3 Worker / Gateway / Audit / Ops Agent
|
||
|
||
- `Python 3.12`
|
||
|
||
原因:
|
||
|
||
- 更适合直接对接 Codex SDK / app-server
|
||
- 更适合硬件库、串口、音视频、自动化测试工具
|
||
- 更适合复用审计与运维的同一套数据模型
|
||
|
||
推荐模块:
|
||
|
||
- `asyncio`
|
||
- `httpx`
|
||
- `websockets`
|
||
- `pydantic`
|
||
- `typer`
|
||
- `tenacity`
|
||
|
||
### 2.4 本地最小 Watchdog
|
||
|
||
优先方案:
|
||
|
||
- 先用 `Python` + 系统服务管理器实现
|
||
- macOS: `launchd`
|
||
- Linux / WSL2: `systemd`
|
||
- Windows: `Task Scheduler` 或 `nssm`
|
||
|
||
后续如果要更强的单二进制守护能力,再考虑:
|
||
|
||
- `Go`
|
||
|
||
---
|
||
|
||
## 3. 数据与中间件选型
|
||
|
||
### 3.1 主数据库
|
||
|
||
推荐:
|
||
|
||
- `PostgreSQL 16`
|
||
|
||
用途:
|
||
|
||
- 项目、任务、线程镜像
|
||
- 审计请求与结果
|
||
- Capability Registry
|
||
- 运维域、运维工单、Runbook
|
||
- 主控状态、节点心跳、账号状态
|
||
|
||
原因:
|
||
|
||
- 事务能力强
|
||
- JSONB 足够灵活
|
||
- 能直接挂 `pgvector`
|
||
- 备份、高可用、迁移都成熟
|
||
|
||
### 3.2 向量库
|
||
|
||
MVP 推荐:
|
||
|
||
- `pgvector`
|
||
|
||
原因:
|
||
|
||
- 与主库同一套备份与权限体系
|
||
- 项目记忆规模在前期不会大到必须拆独立向量库
|
||
- 开发效率最高
|
||
|
||
中后期可选:
|
||
|
||
- `Qdrant`
|
||
|
||
切换条件:
|
||
|
||
- 检索量明显增长
|
||
- 需要独立分片与更强 ANN 性能
|
||
- 项目记忆规模、日志检索、经验检索都上来后
|
||
|
||
### 3.3 缓存与短任务状态
|
||
|
||
极轻云默认:
|
||
|
||
- 先不用独立 `Redis`
|
||
- 通过 `PostgreSQL 行锁 + 应用内 TTL cache` 处理
|
||
|
||
后续放大再补:
|
||
|
||
- `Redis 7`
|
||
|
||
适用用途:
|
||
|
||
- 会话级缓存
|
||
- 去重 key
|
||
- 短期锁
|
||
- SSE / WebSocket 会话映射
|
||
- 限流与节流
|
||
|
||
### 3.4 事件总线 / 跨设备指令总线
|
||
|
||
极轻云默认:
|
||
|
||
- `PostgreSQL job table + LISTEN/NOTIFY`
|
||
|
||
后续放大再升级:
|
||
|
||
- `NATS JetStream`
|
||
|
||
用途:
|
||
|
||
- 跨设备运维动作
|
||
- Worker 事件汇聚
|
||
- 审计任务触发
|
||
- Ops remote action
|
||
- 心跳广播与告警事件
|
||
|
||
说明:
|
||
|
||
- MVP 极轻云阶段,`PostgreSQL job table + LISTEN/NOTIFY` 就足够
|
||
- 当并发、订阅者数量、跨节点事件量明显上来后,再切到 `NATS JetStream`
|
||
|
||
### 3.5 对象存储
|
||
|
||
极轻云默认:
|
||
|
||
- 云主机本地磁盘做短期证据缓存
|
||
- 每日异步备份到低成本对象存储
|
||
|
||
后续放大再升级:
|
||
|
||
- `S3 兼容对象存储`
|
||
- 自管可选 `MinIO`
|
||
|
||
用途:
|
||
|
||
- 视频片段
|
||
- 音频片段
|
||
- 截图与关键帧
|
||
- 串口长日志
|
||
- 报告导出
|
||
- Patch 快照
|
||
|
||
---
|
||
|
||
## 4. 日志、指标、链路追踪
|
||
|
||
### 4.1 应用日志
|
||
|
||
MVP 推荐:
|
||
|
||
- 结构化 JSON 日志直接写文件 + 上传对象存储
|
||
- 核心 fault index 写 `Postgres`
|
||
|
||
中期推荐:
|
||
|
||
- `ClickHouse`
|
||
|
||
用途:
|
||
|
||
- 高吞吐故障检索
|
||
- fault_key 聚类
|
||
- 低 token 摘要查询
|
||
|
||
### 4.2 指标
|
||
|
||
极轻云默认:
|
||
|
||
- 先做健康探针 + 结构化指标表 + 轻量节点看板
|
||
|
||
后续放大再升级:
|
||
|
||
- `Prometheus`
|
||
- `Grafana`
|
||
|
||
用途:
|
||
|
||
- CPU / 内存 / 磁盘 / GPU
|
||
- 进程在线率
|
||
- 队列积压
|
||
- 事件流延迟
|
||
- 能力租约占用
|
||
|
||
### 4.3 链路追踪
|
||
|
||
极轻云默认:
|
||
|
||
- 关键链路先记录 `trace_id` 到结构化日志和 Postgres
|
||
|
||
后续放大再升级:
|
||
|
||
- `OpenTelemetry`
|
||
- 存储可接 `Grafana Tempo` 或兼容后端
|
||
|
||
---
|
||
|
||
## 5. 认证与密钥管理
|
||
|
||
### 5.1 节点到云端认证
|
||
|
||
推荐:
|
||
|
||
- `mTLS` 或节点签名 token
|
||
|
||
### 5.2 服务内部认证
|
||
|
||
推荐:
|
||
|
||
- `JWT` + 细粒度 service claims
|
||
|
||
### 5.3 密钥存储
|
||
|
||
推荐:
|
||
|
||
- 云上:`1Password Secrets Automation`、`Vault` 或云 KMS
|
||
- 本地节点:只保存最小必要 token,敏感密钥由云端短期签发
|
||
|
||
---
|
||
|
||
## 6. 服务到技术栈映射
|
||
|
||
| 模块 | 推荐语言 / 框架 | 存储 / 中间件 | 说明 |
|
||
|---|---|---|---|
|
||
| 手机端 / Web 控制台 | TypeScript + Next.js | SSE + BFF | 统一入口,先做 PWA |
|
||
| API Gateway / BFF | Python + FastAPI | Postgres | 聚合项目态、额度态、运维态 |
|
||
| Master Agent Runtime | Python + LangGraph | Postgres、pgvector | 项目编排与记忆 |
|
||
| Worker Daemon | Python | Postgres | 接 Codex、回传事件 |
|
||
| Thread Gateway | Python | Postgres job queue + LISTEN/NOTIFY | 线程对话与跨节点消息 |
|
||
| Audit Orchestrator | Python | Postgres | 审计任务编排 |
|
||
| Specialist Audit Agents | Python | 本地证据目录 + Postgres | 软件 / 硬件 / 多模态 |
|
||
| Capability Registry | Python | Postgres | 能力注册、租约、抢占 |
|
||
| Test Rig Gateway | Python | 本地证据目录 + Postgres | 摄像头、机器人、串口等 |
|
||
| Ops Control Plane | Python | Postgres | 主运维层控制面 |
|
||
| Local Ops Agent | Python | 本地日志 + Postgres job queue | 本地巡检与修复 |
|
||
| Local Ops Audit Agent | Python | Postgres | 复验、紧急修复判定 |
|
||
| gptpluscontrol Backend | 保持现有实现 | Postgres / API | 直接复用现有项目 |
|
||
|
||
---
|
||
|
||
## 7. 跨设备运维的技术落地
|
||
|
||
### 7.1 执行模式
|
||
|
||
跨设备运维不做成“任意节点互相 SSH”,而做成:
|
||
|
||
`Ops Control Plane -> Postgres job queue + LISTEN/NOTIFY -> target Local Ops Agent -> result -> Ops Audit Agent -> Ops Ledger`
|
||
|
||
### 7.2 远程动作能力
|
||
|
||
至少支持:
|
||
|
||
- `remote_exec`
|
||
- `remote_restart_service`
|
||
- `remote_fetch_logs`
|
||
- `remote_collect_snapshot`
|
||
- `remote_push_config`
|
||
- `remote_switch_account`
|
||
- `remote_run_runbook`
|
||
|
||
### 7.3 适配器类型
|
||
|
||
建议首批支持:
|
||
|
||
- `ssh`
|
||
- `http_api`
|
||
- `windows_service`
|
||
- `docker`
|
||
- `lan_rpc`
|
||
|
||
第二批再支持:
|
||
|
||
- `k8s`
|
||
- `adb`
|
||
- `serial_bridge`
|
||
|
||
---
|
||
|
||
## 8. 向量记忆与检索策略
|
||
|
||
### 8.1 存什么
|
||
|
||
- 项目摘要
|
||
- 关键决策
|
||
- 约束条件
|
||
- 失败复盘
|
||
- 审计结论
|
||
- 运维修复经验
|
||
- 已知故障与 runbook 关联
|
||
|
||
### 8.2 不存什么
|
||
|
||
- 全量源码原文
|
||
- 全量长日志原文
|
||
- 大体积视频
|
||
|
||
这些留在对象存储,只在需要时做摘要与引用。
|
||
|
||
### 8.3 检索策略
|
||
|
||
- 项目级记忆按 `project_id`
|
||
- 运维经验按 `fault_key`
|
||
- 审计经验按 `audit_type`
|
||
- 硬件经验按 `device_type / lab_tag`
|
||
|
||
---
|
||
|
||
## 9. 向量库迁移策略
|
||
|
||
### 9.1 能不能迁移
|
||
|
||
可以,而且建议从第一天就按“可迁移”去设计。
|
||
|
||
可迁移目标包括:
|
||
|
||
- 自建 `Postgres + pgvector`
|
||
- 自建 `Qdrant / Milvus`
|
||
- 腾讯云 `Tencent Cloud VectorDB`
|
||
- 阿里云 `PolarDB PostgreSQL + PGVector`
|
||
- 阿里云 `Milvus 版`
|
||
- 其他自建服务器上的向量库
|
||
|
||
### 9.2 为什么可以迁移
|
||
|
||
因为真正的“系统真相”不应该只存在向量库里,而应该分成两层:
|
||
|
||
- `Canonical Source`
|
||
保存在主数据库和对象存储:
|
||
- chunk 原文
|
||
- chunk_id
|
||
- project_id
|
||
- metadata
|
||
- embedding_model
|
||
- embedding_dim
|
||
- content_hash
|
||
- `Serving Vector Store`
|
||
只是当前正在服务检索的向量后端
|
||
|
||
只要 `Canonical Source` 在,我们就可以:
|
||
|
||
- 直接导出已有向量并导入新向量库
|
||
- 或者在新向量库里重新生成 embedding 后重建索引
|
||
|
||
### 9.3 最推荐的可迁移设计
|
||
|
||
建议增加一层:
|
||
|
||
- `VectorStoreAdapter`
|
||
- `RetrievalService`
|
||
|
||
业务代码只调用 `RetrievalService`,不直接写死腾讯、阿里、pgvector、Qdrant 的 SDK。
|
||
|
||
### 9.4 迁移时怎么做
|
||
|
||
建议流程:
|
||
|
||
1. 新向量后端先建空库 / 空 collection
|
||
2. 从主数据库导出 chunk 与 metadata
|
||
3. 选择:
|
||
- 复用原 embedding 直接导入
|
||
- 或重新 embedding 后导入
|
||
4. 新后端做 shadow read
|
||
5. 对比召回结果与延迟
|
||
6. 通过后切主
|
||
7. 保留一段双写 / 回滚窗口
|
||
|
||
### 9.5 哪种迁移最平滑
|
||
|
||
- 从 `Postgres + pgvector` 迁到阿里云 `PolarDB PostgreSQL + PGVector`
|
||
这条路径最平滑,因为仍然是 PostgreSQL / pgvector 体系。
|
||
- 迁到腾讯云 `VectorDB`
|
||
也可行,但更像“后端替换”,需要通过适配层吸收查询、过滤、索引与导入方式差异。
|
||
- 迁到 `Milvus / Qdrant`
|
||
也可行,但更适合把向量层彻底独立出去,而不是继续走“单库一体化”模式。
|
||
|
||
### 9.6 不建议怎么做
|
||
|
||
- 不要把厂商私有特性直接写进核心业务逻辑
|
||
- 不要让向量库成为唯一知识真相
|
||
- 不要把 embedding 模型版本信息丢掉
|
||
|
||
---
|
||
|
||
## 10. 为什么主数据库选 PostgreSQL,而不是 MySQL
|
||
|
||
先说结论:
|
||
|
||
不是 `MySQL` 做不到,而是对你这套系统来说,`PostgreSQL` 更顺手、更稳,也更容易和向量层放在一起演进。
|
||
|
||
### 10.1 这套系统的数据形态更像 PostgreSQL 的强项
|
||
|
||
你的系统里不只是传统表结构,还有很多半结构化对象:
|
||
|
||
- thread mirror
|
||
- 审计请求与结果
|
||
- capability metadata
|
||
- runbook 定义
|
||
- fault context
|
||
- ops domain / connector 配置
|
||
|
||
这些用 `PostgreSQL + jsonb` 更自然。PostgreSQL 官方文档也明确说过,绝大多数应用一般应优先使用 `jsonb`。
|
||
来源:[PostgreSQL JSON Types](https://www.postgresql.org/docs/current/datatype-json.html)
|
||
|
||
### 10.2 PostgreSQL 和 pgvector 的一体化更成熟
|
||
|
||
`pgvector` 官方项目就是围绕 PostgreSQL 构建的,支持精确检索、HNSW、IVFFlat,并且能直接结合 Postgres 的 ACID、PITR、JOIN 等能力。
|
||
来源:[pgvector GitHub](https://github.com/pgvector/pgvector)
|
||
|
||
这对我们非常重要,因为我们希望:
|
||
|
||
- 项目元数据
|
||
- 记忆向量
|
||
- 审计结构化结果
|
||
- 运维修复记录
|
||
|
||
尽量先落在一套数据库体系里。
|
||
|
||
### 10.3 后续云迁移更顺
|
||
|
||
如果我们以后迁到阿里云 `PolarDB PostgreSQL + PGVector`,路径非常平滑,因为官方就是 PostgreSQL + PGVector 体系。
|
||
来源:[阿里云 PolarDB PGVector](https://help.aliyun.com/zh/polardb/polardb-for-postgresql/pgvector)
|
||
|
||
### 10.4 MySQL 什么时候也能选
|
||
|
||
如果你们满足这几个条件,`MySQL` 也可以:
|
||
|
||
- 团队强依赖 MySQL
|
||
- 向量层准备独立出去
|
||
- 复杂 JSON / 审计 / runbook / capability 元数据不想放主库
|
||
- 你愿意多维护一套检索后端和更多同步逻辑
|
||
|
||
但在当前这套产品里,我更建议默认 `PostgreSQL`。
|
||
|
||
---
|
||
|
||
## 11. 云服务器系统与最低配置建议
|
||
|
||
### 11.1 推荐系统
|
||
|
||
推荐主控云服务器使用:
|
||
|
||
- `Ubuntu Server 24.04 LTS`
|
||
|
||
备选:
|
||
|
||
- `Debian 12`
|
||
- `Rocky Linux 9`(如果你们团队偏 RPM 系)
|
||
|
||
不推荐:
|
||
|
||
- 用 Windows 作为主控制平面主机
|
||
|
||
### 11.2 为什么优先 Ubuntu / Debian
|
||
|
||
- `PostgreSQL + pgvector` 在 Debian / Ubuntu 体系安装最顺,官方 pgvector 也明确提供 Debian / Ubuntu 的 APT 包。
|
||
来源:[pgvector 安装说明](https://github.com/pgvector/pgvector)
|
||
- Python、NATS、Redis、Prometheus、Grafana、MinIO 的 Linux 运维生态更成熟
|
||
- systemd、Docker、observability 工具链都更稳
|
||
|
||
### 11.3 最低配置怎么分
|
||
|
||
这里分 3 档看:
|
||
|
||
#### A. 仅演示 / 极小规模 PoC
|
||
|
||
- `4 vCPU`
|
||
- `8 GB RAM`
|
||
- `100 GB SSD`
|
||
|
||
适用:
|
||
|
||
- 1 个主控
|
||
- 少量项目
|
||
- 2 到 3 个活跃 Worker
|
||
- 对象存储和监控可外置
|
||
|
||
#### B. 推荐 MVP 起步配置
|
||
|
||
- `8 vCPU`
|
||
- `16 GB RAM`
|
||
- `200 GB NVMe SSD`
|
||
|
||
适用:
|
||
|
||
- 控制平面
|
||
- Postgres
|
||
- Redis
|
||
- NATS
|
||
- 基础 WebSocket
|
||
- 小规模审计与运维编排
|
||
|
||
这是我最推荐的起步配置。
|
||
|
||
#### C. 更稳的生产起步
|
||
|
||
- 控制平面节点:`4 vCPU / 8-16 GB`
|
||
- 数据节点:`4-8 vCPU / 16-32 GB`
|
||
- 备用控制器:`2-4 vCPU / 4-8 GB`
|
||
|
||
也就是至少拆成 2 到 3 个角色,而不是一切都塞一台机。
|
||
|
||
### 11.4 磁盘建议
|
||
|
||
- 系统盘建议 `NVMe SSD`
|
||
- 不建议低于 `200 GB`
|
||
|
||
原因:
|
||
|
||
- 事件镜像
|
||
- 截图 / 视频 / 音频临时文件
|
||
- Postgres WAL
|
||
- 运维日志
|
||
- 审计证据缓存
|
||
|
||
都比较吃磁盘。
|
||
|
||
### 11.5 网络建议
|
||
|
||
- 优先选公网稳定、到你局域网延迟较低的地域
|
||
- 如果 Mac / Windows 都在同一局域网,云端主要扮演控制面和汇聚层,不需要极高带宽,但要稳定长连接
|
||
- 如果视频 / 音频证据频繁上传,建议至少保证稳定的上行和对象存储带宽
|
||
|
||
### 11.6 我的实际建议
|
||
|
||
如果你们现在就要启动:
|
||
|
||
- 主控云服务器先上 `Ubuntu 24.04 LTS`
|
||
- 起步配置直接用 `8 vCPU / 16 GB / 200 GB NVMe`
|
||
- 备用控制器先用 `2-4 vCPU / 4-8 GB`
|
||
|
||
这比从 `4c8g` 硬挤要稳得多。
|
||
|
||
---
|
||
|
||
## 12. 极限轻云方案(同时考虑容灾)
|
||
|
||
这部分不是“因为服务器小才降配”,而是一个更激进的原则:
|
||
|
||
无论云服务器多大,都主动把云端压缩到最轻,只保留不可替代的控制面真相;
|
||
同时保留双云容灾,但让备云只承担接管准备,不承担常态重负载。
|
||
|
||
### 12.1 极限轻云下,云端最终只保留什么
|
||
|
||
我建议云端最终只保留这 4 类东西:
|
||
|
||
1. `控制面单体服务`
|
||
包含:
|
||
- BFF / API
|
||
- Master Agent Runtime
|
||
- Scheduler
|
||
- Thread Registry / Broker 业务逻辑
|
||
- Audit Orchestrator
|
||
- Ops Control Plane
|
||
- Quota 聚合逻辑
|
||
|
||
2. `PostgreSQL 16 + pgvector`
|
||
同时承担:
|
||
- 主数据库
|
||
- 向量检索
|
||
- job queue
|
||
- repair ticket / audit request / thread mirror 持久化
|
||
|
||
3. `HTTP + SSE`
|
||
- 聊天发送走 HTTP
|
||
- 状态推送优先 SSE
|
||
- 不在云端维持更重的实时基础设施
|
||
|
||
4. `证据索引与短期缓存`
|
||
云端只保留证据索引、摘要和引用关系
|
||
原始大文件尽量不在云端长期常驻
|
||
|
||
一句话:
|
||
|
||
`主云一个 Python 单体 + 一个 PostgreSQL,备云一个极轻接管面`
|
||
|
||
### 12.2 云端明确不要保留的
|
||
|
||
- 不要独立 `Redis`
|
||
- 不要独立 `NATS`
|
||
- 不要独立 `Qdrant / Milvus`
|
||
- 不要 `ClickHouse`
|
||
- 不要自建 `MinIO`
|
||
- 不要全套 `Prometheus + Grafana + Loki`
|
||
- 不要常驻多模态媒体处理服务
|
||
- 不要常驻重型审计 worker 池
|
||
- 不要把跨设备运维动作直接在云端执行
|
||
|
||
### 12.3 必须下沉到设备端本地的
|
||
|
||
- 视频流解析
|
||
- 连续音频流处理
|
||
- 摄像头原始流上传
|
||
- OCR / 检测的原始大批量处理
|
||
- 串口长时间采集
|
||
- 大日志全文上传
|
||
- Test Rig 执行动作
|
||
- 跨设备运维修复动作本体
|
||
- 重型 Runbook 执行
|
||
|
||
改为:
|
||
|
||
- 设备端先做边缘预处理
|
||
- 只上传关键帧、短片段、摘要、异常片段、压缩日志、结果结论
|
||
|
||
### 12.4 业务上最值得做的减法
|
||
|
||
1. 把控制平面做成单体,而不是多服务
|
||
2. 把事件总线降级为 Postgres job queue
|
||
3. 把 Redis 去掉
|
||
4. 把独立向量库去掉,只保留 `pgvector`
|
||
5. 把媒体处理前移到终端设备
|
||
6. 把审计 Agent 改成按需启动,不常驻
|
||
7. 把运维层做成“轻控制面 + 重边缘执行”
|
||
8. 把原始证据留在边缘,只把摘要和索引上云
|
||
|
||
### 12.5 哪些能力不能砍
|
||
|
||
这些能力即使极限轻云也必须保留:
|
||
|
||
- 单主 Agent 入口
|
||
- 多机 Worker 调度
|
||
- 线程镜像与聊天记录查看
|
||
- 基础跨节点线程对话
|
||
- on-demand 审计
|
||
- 主运维层与运维审计层
|
||
- 跨设备运维
|
||
- 主控失联后的紧急修复链路
|
||
- 关键故障与修复结果上云可见
|
||
|
||
### 12.6 哪些能力只改实现位置,不改能力边界
|
||
|
||
- 多模态审计:保留,但模型前处理放边缘
|
||
- 硬件闭环:保留,但执行与采样放边缘
|
||
- 运维抢修:保留,但修复动作本体放目标节点
|
||
- 向量记忆:保留,但先和主库合并,不拆独立服务
|
||
- 实时查看:保留,但优先 SSE,不追求最重实时架构
|
||
|
||
### 12.7 双云容灾在极限轻云下怎么做
|
||
|
||
既然你接受两台云服务器做备份,我建议:
|
||
|
||
- `Cloud A`
|
||
平时主用
|
||
跑:
|
||
- 控制面单体
|
||
- PostgreSQL 主库
|
||
|
||
- `Cloud B`
|
||
平时热备 / 温备
|
||
跑:
|
||
- 备用控制面单体
|
||
- PostgreSQL 备库
|
||
- 关键快照和接管脚本
|
||
|
||
目标不是把两台云都跑满,而是:
|
||
|
||
- 平时只让一台主扛业务
|
||
- 另一台尽量轻,只负责接管准备
|
||
|
||
### 12.8 矛盾点与取舍矩阵
|
||
|
||
这里是最关键的一部分。
|
||
|
||
#### 矛盾 1:你要手机随时看项目进度,但云端又要极轻
|
||
|
||
取舍:
|
||
|
||
- 保留:线程文本、任务状态、摘要、故障、修复结果实时上云
|
||
- 下沉:原始媒体、大日志、长串口流、原始检测流
|
||
|
||
结论:
|
||
|
||
- “能看项目和聊天”必须保留在云端
|
||
- “能看所有原始大证据”改为按需回传
|
||
|
||
#### 矛盾 2:你要多机实时协作,但不想跑重消息系统
|
||
|
||
取舍:
|
||
|
||
- 保留:跨节点协作能力
|
||
- 替换:`NATS` 改 `Postgres job queue + LISTEN/NOTIFY`
|
||
|
||
结论:
|
||
|
||
- 功能不砍
|
||
- 吞吐上限降低
|
||
- 对 MVP 可接受
|
||
|
||
#### 矛盾 3:你要审计层、运维层、主控层都在,但云端还要极轻
|
||
|
||
取舍:
|
||
|
||
- 保留:逻辑角色
|
||
- 改实现:不做多个常驻服务,而做一个单体里的模块 + 按需执行器
|
||
|
||
结论:
|
||
|
||
- 角色不砍
|
||
- 物理进程数减少
|
||
|
||
#### 矛盾 4:你要跨设备运维,还要主运维层开放式扩展
|
||
|
||
取舍:
|
||
|
||
- 保留:开放式主运维层
|
||
- 下沉:具体修复动作在目标节点本地执行
|
||
|
||
结论:
|
||
|
||
- 云端只做决策与编排
|
||
- 边缘做执行
|
||
|
||
#### 矛盾 5:你要多模态、硬件测试,但云带宽只有 10Mbps
|
||
|
||
取舍:
|
||
|
||
- 保留:多模态审计和硬件闭环
|
||
- 替换:边缘先做裁剪、摘要、关键帧、短片段
|
||
|
||
结论:
|
||
|
||
- 保留测试能力
|
||
- 放弃原始流持续上云
|
||
|
||
#### 矛盾 6:你要云端尽可能轻,但又要双云容灾
|
||
|
||
取舍:
|
||
|
||
- 保留:双云容灾
|
||
- 改实现:第二台云机尽量只做热备 / 温备,不承担常态重负载
|
||
|
||
结论:
|
||
|
||
- 双云可以保留
|
||
- 但只有主云承载主流量,备云尽量只承担接管准备
|
||
|
||
### 12.9 最终取舍原则
|
||
|
||
在你的约束下,最应该坚持的不是“所有东西都放云上”,而是:
|
||
|
||
- 功能边界不砍
|
||
- 云端只保留系统真相和调度真相
|
||
- 执行、重媒体、重测试、重运维动作全部边缘化
|
||
- 双云只保留“主用 + 备用”,不做“双主都很重”
|
||
|
||
换句话说:
|
||
|
||
- `业务能力保留`
|
||
- `物理部署下沉`
|
||
- `实时性分层`
|
||
- `证据上传按冷热分级`
|
||
|
||
---
|
||
|
||
## 13. 推荐部署方式
|
||
|
||
### 13.1 云端
|
||
|
||
- `Cloud A`
|
||
- 控制面单体
|
||
- PostgreSQL 主库
|
||
- `Cloud B`
|
||
- 备用控制面单体
|
||
- PostgreSQL 备库
|
||
- 接管脚本与关键快照
|
||
|
||
默认不常驻:
|
||
|
||
- Redis
|
||
- NATS
|
||
- 独立对象存储服务
|
||
- 全套观测平台
|
||
|
||
### 13.2 终端节点
|
||
|
||
每台 Mac / Windows / Cloud Worker / Test Rig 至少部署:
|
||
|
||
- Worker Daemon
|
||
- Thread Gateway
|
||
- Local Ops Agent
|
||
- Local Ops Audit Agent
|
||
- gptpluscontrol Agent
|
||
|
||
---
|
||
|
||
## 14. 极轻云双云最低配置要求
|
||
|
||
这里给两档:
|
||
|
||
- `硬最低可跑`
|
||
能跑起来,但更适合 PoC 或很低并发试运行
|
||
- `不明显降低稳定性和业务保障能力的最低要求`
|
||
这是我真正建议你按它采购和部署的下限
|
||
|
||
### 14.1 硬最低可跑
|
||
|
||
`Cloud A(主用)`
|
||
|
||
- `2 vCPU`
|
||
- `4 GB RAM`
|
||
- `80 GB SSD`
|
||
|
||
`Cloud B(备用)`
|
||
|
||
- `2 vCPU`
|
||
- `4 GB RAM`
|
||
- `80 GB SSD`
|
||
|
||
前提:
|
||
|
||
- 云端只跑控制面单体 + PostgreSQL
|
||
- 不上 Redis / NATS / ClickHouse / MinIO / Prometheus
|
||
- 终端承担全部重媒体和重测试
|
||
- 审计全部按需执行
|
||
- 并发项目数低
|
||
|
||
这档能跑,但我不把它定义成“业务保障最低”。
|
||
|
||
### 14.2 不明显降低稳定性和业务保障能力的最低要求
|
||
|
||
`Cloud A(主用)`
|
||
|
||
- `2 vCPU`
|
||
- `8 GB RAM`
|
||
- `100 GB SSD`
|
||
|
||
`Cloud B(备用)`
|
||
|
||
- `2 vCPU`
|
||
- `8 GB RAM`
|
||
- `100 GB SSD`
|
||
|
||
原因:
|
||
|
||
- PostgreSQL 主库 / 备库都要稳定吃下项目、线程、审计、运维修复账本
|
||
- 主控切换时,不希望备云明显掉性能
|
||
- 你要求“不放弃原来的业务和保障能力”,那备用云就不能太瘦
|
||
|
||
### 14.3 为什么我不建议把备云做得更小
|
||
|
||
如果 `Cloud B` 只有 `1C2G` 或 `1C4G`,在正常热备时也许没问题;
|
||
但一旦切主,它就会同时承担:
|
||
|
||
- 控制面单体
|
||
- PostgreSQL 读写
|
||
- SSE / API
|
||
- 审计触发
|
||
- 运维接管记录
|
||
|
||
这时容易出现:
|
||
|
||
- failover 后延迟明显抬高
|
||
- PostgreSQL 内存压力过大
|
||
- 恢复期间 SSE / API 不稳定
|
||
|
||
所以如果你把“业务保障能力”也算进去,我建议两台云机至少对齐到 `2C8G`。
|
||
|
||
### 14.4 磁盘最低建议
|
||
|
||
最低不要低于:
|
||
|
||
- `80 GB`
|
||
|
||
更稳的起步:
|
||
|
||
- `100 GB`
|
||
|
||
如果你们会频繁保留:
|
||
|
||
- 审计截图
|
||
- 短视频片段
|
||
- 修复证据
|
||
- 数据库 WAL
|
||
|
||
那 `150 GB` 会更舒服。
|
||
|
||
### 14.5 带宽要求
|
||
|
||
极轻云下,云端不承载原始媒体流,所以带宽要求并不高。
|
||
|
||
最低建议:
|
||
|
||
- 稳定公网
|
||
- `5 Mbps` 以上可用上行 / 下行
|
||
|
||
更稳建议:
|
||
|
||
- `10 Mbps` 以上
|
||
|
||
重点不是峰值,而是:
|
||
|
||
- 长连接稳定
|
||
- 丢包低
|
||
- 抖动小
|
||
|
||
### 14.6 最终一句话
|
||
|
||
如果你要:
|
||
|
||
- 极限轻云
|
||
- 双云容灾
|
||
- 不明显降低稳定性和业务保障能力
|
||
|
||
那我建议把最低配置定成:
|
||
|
||
- `Cloud A = 2C8G / 100GB SSD`
|
||
- `Cloud B = 2C8G / 100GB SSD`
|
||
|
||
这已经是我认为比较保守、也比较负责任的下限了。
|
||
|
||
### 14.7 支持两种保活模式
|
||
|
||
这套系统建议正式支持两种保活方式,而不是只绑定双云:
|
||
|
||
#### 模式 A:单云 + 设备端备用池(首选单 Mac)
|
||
|
||
适用场景:
|
||
|
||
- 你想把云成本进一步压低
|
||
- 现场本来就有一台常开 Mac,或者多台可接入设备
|
||
- 你能接受“云机故障时,由设备端顶上最小控制面”
|
||
|
||
部署方式:
|
||
|
||
- `Cloud A`
|
||
- 控制面单体
|
||
- PostgreSQL 主库
|
||
- `Preferred Standby Device`
|
||
- 默认首选一台常开 `Mac`
|
||
- 也允许其他接入设备作为后备候选
|
||
- 备用控制面轻实例
|
||
- PostgreSQL 备库或周期快照恢复实例
|
||
- `Standby Controller`
|
||
- `Ops Rescue Gateway`
|
||
|
||
关键要求:
|
||
|
||
- 至少一台首选备用设备必须常开
|
||
- 其余接入设备可声明自己是否可作为后备容灾设备
|
||
- 需要一条不依赖主云的可达通路,例如:
|
||
- 同一局域网直接访问
|
||
- `Tailscale / WireGuard`
|
||
- 独立长期反向隧道
|
||
- 手机 App 要支持主 / 备 endpoint 列表切换
|
||
- 控制面要维护 `standby_device_pool`
|
||
- 每台候选设备都要同步最小 `takeover package`
|
||
|
||
优点:
|
||
|
||
- 比双云便宜
|
||
- 救援动作离本地设备更近
|
||
- 对局域网内设备接管更快
|
||
|
||
边界:
|
||
|
||
- 如果云机和全部候选设备所在现场一起断电、断网,这条链路也会失效
|
||
- 它适合作为“低成本保活方案”,但上限不如双云
|
||
|
||
`Preferred Standby Device` 最低建议:
|
||
|
||
- `Apple Silicon M1` 或同级 Intel 4 核
|
||
- `8 GB RAM`
|
||
- `50 GB` 可用 SSD
|
||
|
||
更稳建议:
|
||
|
||
- `16 GB RAM`
|
||
- `100 GB` 可用 SSD
|
||
|
||
#### 模式 B:双云热备 / 温备
|
||
|
||
适用场景:
|
||
|
||
- 你更在意远程可达性和持续在线
|
||
- 不希望把备援绑在某一台现场设备上
|
||
- 希望主云故障时,备用云独立接管
|
||
|
||
部署方式:
|
||
|
||
- `Cloud A`
|
||
- 控制面单体
|
||
- PostgreSQL 主库
|
||
- `Cloud B`
|
||
- 备用控制面单体
|
||
- PostgreSQL 备库
|
||
- 快照、恢复脚本、接管钩子
|
||
|
||
优点:
|
||
|
||
- 远程访问更稳
|
||
- 不依赖现场某一台设备
|
||
- 主控接管路径更标准化
|
||
|
||
边界:
|
||
|
||
- 成本高于“单云 + 单 Mac”
|
||
- 对本地硬件接管的最后一跳,仍然要依赖现场设备在线
|
||
|
||
#### 两种模式怎么选
|
||
|
||
如果你要:
|
||
|
||
- 最低云成本下仍然保留备援能力
|
||
|
||
优先选:
|
||
|
||
- `单云 + 单 Mac 备用控制器`
|
||
|
||
如果你要:
|
||
|
||
- 更强的远程持续在线
|
||
- 更稳定的公网接管能力
|
||
|
||
优先选:
|
||
|
||
- `双云热备 / 温备`
|
||
|
||
我的建议是:
|
||
|
||
- 系统从设计上同时支持两种模式
|
||
- 开发时统一抽象成 `standby_provider`
|
||
- 实际部署时可选:
|
||
- `cloud_b`
|
||
- `standby_mac`
|
||
- `both`
|
||
|
||
也就是说,这套产品以后可以跑成:
|
||
|
||
- `Cloud A + Standby Mac`
|
||
- `Cloud A + Cloud B`
|
||
- `Cloud A + Cloud B + Standby Mac`
|
||
|
||
其中最后一种是最强兜底,但不是 MVP 必需。
|
||
|
||
### 14.8 还能不能继续压缩云服务器
|
||
|
||
能,但要分清楚三条线:
|
||
|
||
- `双云 + 不明显降低稳定性和业务保障能力`
|
||
- 最低仍然建议:`Cloud A = 2C8G / 100GB`
|
||
- `Cloud B = 2C8G / 100GB`
|
||
- `单云 + 设备端备用池`
|
||
- 云端可以继续压到:`2C4G / 80GB`
|
||
- 前提是绝大多数重执行都下沉到设备端
|
||
- `实验性极限压缩`
|
||
- 理论上可以再试 `1C2G ~ 1C4G`
|
||
- 但我不建议把它写成正式最低配置,因为它已经开始侵蚀稳定性和恢复速度
|
||
|
||
一句话:
|
||
|
||
- `2C8G / 100GB` 不是“系统绝对最小”
|
||
- 它是“在双云容灾下,不明显降低稳定性和业务保障能力”的最低要求
|
||
- 如果切到单云,并且把更多动作下沉到本地设备,云端可以继续压到 `2C4G / 80GB`
|
||
|
||
### 14.9 哪些东西还能继续下沉到设备端
|
||
|
||
下面这些能力,建议尽可能下沉:
|
||
|
||
| 能力 | 现在建议放哪 | 还能继续怎么压云 | 不该牺牲什么 |
|
||
|---|---|---|---|
|
||
| Embedding 生成 | 设备端 | 由 worker / audit 节点本地生成 embedding,再把结果写回云库 | 云端仍保存向量和元数据真相 |
|
||
| 长日志处理 | 设备端 | 本地先裁剪、归类 fault_key、保留最后 N 行,再上传 | 云端仍保留 fault ledger |
|
||
| 视频 / 音频处理 | 设备端 | 本地抽关键帧、短片段、OCR、检测结果,只传证据摘要 | 云端仍保留证据索引和结论 |
|
||
| 审计执行 | 设备端 | 软件/硬件/多模态审计尽量在拥有能力的节点本地完成 | 云端仍保留审计工单和结论 |
|
||
| Test Rig 控制 | 设备端 | 摄像头、串口、机器人、麦克风、扬声器一律本地网关执行 | 云端仍保留租约和抢占真相 |
|
||
| 运维修复动作 | 设备端 | 重启、拉日志、切账号、跑 runbook 都在目标节点本地执行 | 云端仍保留审批、工单、复验记录 |
|
||
| 线程摘要压缩 | 设备端 | 每个 worker 本地先做任务摘要,再把结构化摘要写回云端 | 云端仍保留项目主记忆 |
|
||
| gptpluscontrol 额度轮询 | 设备端 | 每台机器本地采集额度,再定时上报精简状态 | 云端仍保留统一额度视图 |
|
||
|
||
### 14.10 哪些东西不能再往本地下沉
|
||
|
||
下面这些是系统真相,不能完全放到某一台设备本地:
|
||
|
||
- 项目 / 任务 / 线程账本
|
||
- 审计结论与修复结论
|
||
- `standby_provider` / `standby_device_pool` 状态
|
||
- 主备 endpoint 注册表
|
||
- 最小项目索引和恢复索引
|
||
- 审批结果与权限真相
|
||
|
||
也就是说,云端再怎么压,也至少要保留:
|
||
|
||
- 控制面单体
|
||
- PostgreSQL
|
||
- SSE / API
|
||
- 最小证据索引
|
||
|
||
### 14.11 单服务器 + 单设备端保活时,设备端掉线怎么办
|
||
|
||
这个场景不能只做“一个固定备用 Mac”,必须做成:
|
||
|
||
- `preferred standby device`
|
||
- `eligible standby devices`
|
||
- `automatic standby promotion`
|
||
|
||
实现方式:
|
||
|
||
1. 控制面维护一个 `standby_device_pool`
|
||
2. 每台设备声明:
|
||
- 是否可作为容灾设备
|
||
- 优先级
|
||
- 常开状态
|
||
- 可用内存 / 磁盘
|
||
- 网络连通性
|
||
3. 控制面为前 `N` 个候选设备同步最小 `takeover package`
|
||
4. 当前活动备用设备心跳丢失后,自动提升下一台候选设备
|
||
5. 手机 App 与 Worker 端都读取新的主 / 备 endpoint 清单
|
||
|
||
自动提升的评分建议:
|
||
|
||
- 是否常开
|
||
- 是否同局域网稳定在线
|
||
- 是否具备足够内存和磁盘
|
||
- 是否已具备最新 `takeover package`
|
||
- 是否最近未发生故障
|
||
|
||
一句话:
|
||
|
||
- 在单服务器模式下,设备端容灾必须是“备用池”,不能是“唯一备用机”
|
||
|
||
#### 14.11.1 你的判断是对的:如果是冷备,切换会很慢
|
||
|
||
如果备用设备只是“连接在系统里,但平时没有预部署控制面与运维组件”,那一旦当前设备崩掉,就会出现:
|
||
|
||
- 先发现故障
|
||
- 再选备用设备
|
||
- 再部署或拉起业务代码
|
||
- 再下发配置、密钥、隧道、endpoint
|
||
- 再恢复最小项目索引
|
||
|
||
这条链路会明显变长,而且中间很容易出问题。
|
||
|
||
所以真正的自动切换,不能建立在“临时重新部署一套设备端业务代码”上。
|
||
|
||
#### 14.11.2 必须区分冷备、温备、热备
|
||
|
||
- `冷备(cold standby)`
|
||
- 设备在线,但没有预部署接管组件
|
||
- 故障时才开始部署
|
||
- 结论:不适合自动切换,只适合人工应急
|
||
- `温备(warm standby)`
|
||
- 设备已预部署接管组件
|
||
- 已同步 `takeover_package`
|
||
- 平时不承载主流量,只保留轻实例和心跳
|
||
- 结论:这是单云 + 设备端备用池的最低可接受形态
|
||
- `热备(hot standby)`
|
||
- 设备已预部署并保持随时接管
|
||
- 关键状态同步更频繁
|
||
- 切换最快
|
||
- 结论:体验最好,但会多吃一点本地资源
|
||
|
||
#### 14.11.3 我建议你们至少做温备,不要做冷备
|
||
|
||
也就是说,每一个合格的备用候选设备上,都应该提前放好:
|
||
|
||
- `Standby Controller`
|
||
- `Local Ops Agent`
|
||
- `Local Ops Audit Agent`
|
||
- `Ops Rescue Gateway`
|
||
- 最小运行时依赖
|
||
- 最小配置模板
|
||
- endpoint 清单
|
||
- 最近的 `takeover_package`
|
||
|
||
这样切换时做的就不是“重新部署”,而是:
|
||
|
||
- 切换角色
|
||
- 拉起轻实例
|
||
- 刷新 endpoint
|
||
- 恢复最小控制面
|
||
|
||
#### 14.11.4 切换时间预期
|
||
|
||
如果做成:
|
||
|
||
- `冷备`
|
||
- 可能是 `3 ~ 10 分钟`,而且风险大
|
||
- `温备`
|
||
- 目标应控制在 `15 ~ 60 秒`
|
||
- `热备`
|
||
- 目标可进一步压到 `5 ~ 15 秒`
|
||
|
||
所以如果你要“自动启动另外一台连接设备作为容灾设备”,正确前提不是“自动部署”,而是“提前预热好备用池”。
|
||
|
||
### 14.12 API-first / Local-first 极限压缩模式
|
||
|
||
可以,而且这恰恰是你现在这套系统最适合走的方向。
|
||
|
||
因为你们的并发不高,只有 `2 ~ 3` 台电脑同时使用,所以没必要一开始就在云端常驻很多重服务。更合理的是:
|
||
|
||
- 云端只保留最小控制面和最小系统真相
|
||
- 能通过外部 API 调的,就不要自己在云端常驻算力
|
||
- 能在本地设备做的,就尽量放到设备端
|
||
|
||
#### 云端最终只保留什么
|
||
|
||
- `API Gateway / BFF`
|
||
- `Master Agent Runtime`
|
||
- `PostgreSQL`
|
||
- 最小 `pgvector`
|
||
- 主备 endpoint 注册表
|
||
- `standby_device_pool`
|
||
- 审批、审计、修复账本
|
||
|
||
#### 哪些业务可以直接 API 化
|
||
|
||
- 模型推理
|
||
- 直接调用 OpenAI / 其他模型 API
|
||
- 不在你的云端常驻推理服务
|
||
- OCR / 检测
|
||
- 优先本地执行
|
||
- 不够时再调用外部 API
|
||
- 文件 / 对象存储
|
||
- 优先本地或 NAS
|
||
- 云端只保存 manifest 和索引
|
||
|
||
#### 哪些业务更适合本地化
|
||
|
||
- embedding 生成
|
||
- 长日志裁剪
|
||
- 视频 / 音频预处理
|
||
- 审计执行
|
||
- Test Rig 控制
|
||
- 运维修复动作
|
||
- gptpluscontrol 本地额度采集
|
||
|
||
#### 这种模式下的最低云配置
|
||
|
||
如果采用:
|
||
|
||
- `单云`
|
||
- `standby_device_pool`
|
||
- `API-first`
|
||
- `local-first`
|
||
- 并发设备 `<= 3`
|
||
|
||
那我建议把起步云配置定成:
|
||
|
||
- `2C4G / 80GB SSD`
|
||
|
||
这是一个我认为可以认真尝试的“极限压缩起步线”。
|
||
|
||
如果想再压:
|
||
|
||
- `1C2G ~ 1C4G`
|
||
|
||
理论上能试,但只建议作为实验环境,不建议一开始就当生产起步线。
|
||
|
||
### 14.13 按设备数和任务数弹性升级
|
||
|
||
你说得对,不应该一上来就把最低配置拉很高。更合理的是按触发条件升级。
|
||
|
||
#### 起步档
|
||
|
||
- 场景:
|
||
- `1 个 Cloud A`
|
||
- `standby_device_pool`
|
||
- 并发设备 `<= 3`
|
||
- 同时活跃项目 `<= 3`
|
||
- 建议:
|
||
- `2C4G / 80GB SSD`
|
||
|
||
#### 升级到下一档的触发条件
|
||
|
||
满足任意一条就建议升级:
|
||
|
||
- 同时接入设备数 `> 3`
|
||
- 同时活跃线程数 `> 10`
|
||
- 同时运行专项审计 / 硬件测试 `> 2`
|
||
- `Postgres` 内存持续高于 `70%`
|
||
- API / SSE `p95` 延迟持续高于 `500ms`
|
||
- 待处理修复工单和审计工单出现积压
|
||
|
||
#### 第一步升级建议
|
||
|
||
- 先升到:
|
||
- `2C8G / 100GB`
|
||
- 或者补上:
|
||
- `Cloud B`
|
||
|
||
#### 第二步升级建议
|
||
|
||
- 增加 `Redis`
|
||
- 再考虑 `NATS JetStream`
|
||
- 再考虑独立对象存储
|
||
- 再考虑独立向量库
|
||
|
||
一句话:
|
||
|
||
- 先把系统做成“轻云 + 重本地 + 可弹性升级”
|
||
- 不要一开始就把所有重能力堆到云端
|
||
|
||
---
|
||
|
||
## 15. MVP 最小落地建议
|
||
|
||
### 第一阶段
|
||
|
||
- 前端:Next.js PWA
|
||
- 云端:FastAPI + LangGraph
|
||
- 数据:Postgres 16 + pgvector
|
||
- 队列:Postgres job table + LISTEN/NOTIFY
|
||
- 文件:本机磁盘短期缓存 + 异步备份
|
||
- 运维:结构化 JSON 日志 + 健康探针 + Ops Ledger
|
||
|
||
### 第二阶段
|
||
|
||
- 视规模增加 Redis
|
||
- 视并发增加 NATS JetStream
|
||
- 增加 ClickHouse 做 fault_key 检索
|
||
- 增加 Qdrant 作为独立向量库候选
|
||
- 增加更多 Ops Connector
|
||
|
||
---
|
||
|
||
## 16. 一句话结论
|
||
|
||
如果要兼顾多机 Codex、审计、多模态、硬件接管、开放式主运维层和跨设备运维,
|
||
最稳的主栈是:
|
||
|
||
`TypeScript + Next.js` 做前端,
|
||
`Python + FastAPI + LangGraph` 做控制平面与 Agent 体系,
|
||
`Postgres 16 + pgvector` 做最小数据底座,
|
||
把 `Redis / NATS / 独立对象存储 / 重媒体处理 / 重运维执行` 尽量后移或下沉到边缘节点。
|