Files
structrail-design/.trae/documents/system-architecture.md
skycurtain a9eaaa6023 docs: 新增项目文档并更新开发规则
- 新增品牌命名、商业化策略、SDK视觉噪音处理、可视化库设计和系统架构文档
- 更新开发规则,明确禁止主动修改项目源代码文件
- 所有文档均为中文编写,用于记录项目设计讨论和决策
2026-02-18 00:18:35 +08:00

6.6 KiB
Raw Blame History

Structrail 系统架构设计与技术选型

本文档总结了 Structrail 平台的技术架构决策,包括 Monorepo 策略、服务拆分原则以及前后端架构方案的对比分析。

1. 总体架构策略Monorepo (单体仓库)

考虑到 Structrail 项目涉及多语言 SDK、统一的协议定义、前端可视化组件以及后端执行服务我们决定采用 Monorepo 架构。

核心收益

  1. 单一事实来源 (Single Source of Truth):协议定义 (@structrail/protocol) 作为核心资产被前端、后端、SDK 共同引用。协议变更时,所有依赖方均可即时感知(类型检查报错),避免版本割裂。
  2. 原子化提交 (Atomic Commits):由于协议变更往往涉及多端修改(如 ArrayTracer 新增指令 -> 前端渲染逻辑更新 -> SDK 实现更新Monorepo 允许在一个 Commit 中完成所有相关修改,保证系统一致性。
  3. 统一版本管理:便于统一管理多语言 SDK 的版本发布节奏。
  4. 开发体验:利用 pnpm workspaceTurborepo 等工具,实现高效的依赖管理和增量构建。

2. 服务架构设计

Structrail 的业务特性决定了其架构必须采用 动静分离 的策略,将轻量级的业务逻辑与重量级的代码执行隔离。

2.1 核心服务拆分

服务模块 职责描述 技术特征
Web (业务层) 用户界面、题目管理、社区互动、鉴权 I/O 密集型,重交互,适合快速开发
API (接口层) 业务逻辑处理、数据转发、RPC 服务 高并发,低延迟,连接 Web 与 Runner
Runner (执行层) 代码编译、沙箱运行、Trace 数据生成 CPU 密集型,高风险,需独立部署与资源隔离
Protocol (共享层) 核心协议定义、类型声明、常量 纯代码库,无运行时依赖

2.2 架构方案对比

针对 Web 与 API 的实现,我们探讨了两种主流方案。两种方案均可行,且在 Monorepo 下都能实现 100% 的端到端类型安全

方案 ANext.js 全栈架构 (SSR 优先)

  • 架构描述Web 与 API 合二为一,直接在 Next.js 的 Server Actions / Route Handlers 中处理业务逻辑,并调用 Runner 服务。
  • 优势
    • 开发效率极致:无 API 胶水层,前后端代码在同一文件中,调用后端函数像调用本地函数一样自然。
    • SSR 支持:对 SEO 友好,首屏加载快(适合题目详情页、文档页)。
    • 生态丰富Vercel/Next.js 生态拥有大量现成组件。
  • 劣势
    • 部署绑定:较强依赖 Node.js Runtime 或 Vercel 平台。
    • 边界模糊Server Actions 可能导致前后端代码耦合,心智负担较重。

方案 BReact (SPA) + Hono (API) 前后端分离 (CSR + Edge 优先)

  • 架构描述
    • Web: 纯 React SPA通过 CDN 分发。
    • API: 独立 Hono 服务,提供 RPC 接口。
    • 通信: 通过 hono/client 实现类型安全的 RPC 调用。
  • 优势
    • 物理边界清晰:前端关注 UI 交互,后端关注数据处理,职责分明。
    • 部署极其灵活前端可部署至任何静态托管OSS/Netlify后端可部署至 EdgeCloudflare Workers/Deno或容器。
    • 高性能Hono 基于 Web Standards冷启动快资源占用极低。
    • 类型安全:通过 Monorepo 导出 API 类型 (AppType),前端直接引用,实现与 tRPC 类似的开发体验。
  • 劣势
    • SEO 略弱:纯 SPA 对 SEO 不如 SSR 友好(虽然可以通过预渲染解决)。
    • 初期搭建成本:需配置两个独立应用及通信链路。

2.3 结论与推荐

推荐采用 Monorepo 架构,并根据团队偏好选择方案 A 或 B。

  • 如果更看重 SEO快速验证原型,推荐 方案 A (Next.js)
  • 如果更看重 架构清晰度部署灵活性 (Edge)前后端解耦,推荐 方案 B (React + Hono)
    • 注:考虑到 Structrail 的编辑器交互极其复杂(重客户端逻辑),且 Runner 服务天然适合独立部署,方案 B 在长期维护和扩展性上可能更具优势。

3. 建议的项目目录结构

无论选择哪种方案Monorepo 的基础结构应保持一致:

structrail/
├── apps/                          # 应用程序(业务层)
│   ├── web/                       # [React/Next.js] 平台前端
│   │   └── ... (Visualizer 组件调用)
│   ├── api/                       # [Hono/Node] 业务后端 (如果是方案 B)
│   ├── runner/                    # [Go/Rust] 代码执行沙箱服务
│   └── docs/                      # [VitePress] 文档站点
│
├── packages/                      # 共享库(核心资产)
│   ├── protocol/                  # 核心协议定义 (JSON Schema, TS Interfaces)
│   │   ├── index.ts               # 导出 Tracer 类型、指令定义
│   │   └── schema.json            # 用于校验 Trace 数据的 Schema
│   ├── sdk-ts/                    # TypeScript SDK 实现
│   ├── ui/                        # 通用 UI 组件库 (可选)
│   └── eslint-config/             # 统一的代码规范配置
│
├── sdks/                          # 多语言 SDK (非 JS/TS 生态)
│   ├── c/                         # C 语言 SDK (Makefile)
│   ├── python/                    # Python SDK (Poetry)
│   ├── java/                      # Java SDK (Maven/Gradle)
│   └── ...
│
├── tools/                         # 工程化脚本
│   └── scripts/                   # 批量发布、协议生成脚本
│
├── package.json                   # Root package.json
├── pnpm-workspace.yaml            # pnpm workspace 配置
└── turbo.json                     # Turborepo 构建编排配置

4. 关键技术栈建议

  • 包管理器与运行时: Bun (All-in-One 工具链,提供极致的安装速度和高性能运行时)
    • 作为包管理器替代 npm/pnpm
    • 作为脚本执行器替代 ts-node
    • 作为测试运行器替代 Jest/Vitest
  • 构建系统: Turborepo (任务编排、远程缓存)
  • 前端框架: React (配合 Vite)
  • 后端框架: Hono (完美适配 Bun 运行时,性能卓越)
  • Runner 语言: GoRust (高性能、并发强、安全性好)
  • API 通信: Hono RPC (如果分离) 或 Server Actions (如果全栈)