XNSim/XNSimPortal/doc/仿真运行模块设计文档.md
2025-07-25 13:42:20 +08:00

9.0 KiB
Raw Blame History

仿真运行模块设计文档

1. 概述

仿真运行模块是 XNSimPortal 系统的核心功能之一,负责组织、调度和监控仿真任务的全流程。该模块支持模型组与服务的自动加载、仿真任务的启动/暂停/终止、实时日志输出、进程状态监控等。前端采用 Web Components 技术,后端提供 RESTful API 及 SSE 实时输出,支持与 DDS、XNEngine 等底层服务集成。

1.1 模块组成

  • 前端组件run-sim.js - 主组件

  • 后端路由

    • routes/run-simulation.js - 仿真运行与管理 API
    • routes/configurations.js - 构型与模型组、服务 API
    • routes/dds-monitor.js - DDS 监控 API
    • routes/system-control.js - 引擎控制 API
    • routes/stop-simulation.js - 仿真终止 API
    • routes/simulation-output.js - SSE 实时输出 API
    • routes/filesystem.js - 日志文件读取 API
  • 工具类

    • utils/xnengine-process-utils.js - 仿真进程管理工具
    • utils/db-utils.js - 数据库操作工具

1.2 技术架构

┌────────────────────┐    ┌────────────────────┐    ┌────────────────────┐
│   前端组件层        │    │   后端API层         │    │   底层服务/存储层   │
│ run-sim.js         │<--►│ run-simulation     │<--►│ XNEngine           │
│                    │    │ configurations     │    │ DDS                │
│                    │    │ dds-monitor        │    │ SQLite             │
│                    │    │ system-control     │    │ 日志文件           │
│                    │    │ simulation-output  │    │                    │
└────────────────────┘    └────────────────────┘    └────────────────────┘

2. 功能

2.1 核心功能

  1. 模型组与服务加载

    • 自动加载当前构型下的模型组及其模型
    • 自动加载当前构型下的服务及其版本
  2. 仿真任务管理

    • 启动仿真/测试
    • 暂停/继续仿真
    • 终止仿真
    • 进程状态检测与自动重连
  3. 实时输出与日志

    • SSE 实时输出仿真日志
    • 日志文件轮询与增量读取
    • ANSI 终端颜色转 HTML
  4. 状态监控与反馈

    • DDS 监控初始化与状态检测
    • 仿真进程状态轮询
    • UI 状态与按钮联动

2.2 辅助功能

  • 错误与成功提示
  • 自动重连机制
  • 资源清理与事件解绑

3. 性能

3.1 性能指标

  • 仿真启动响应< 2s
  • 日志输出延迟< 200ms
  • 并发仿真支持:支持多用户独立仿真
  • 内存占用:前端 < 50MB

3.2 性能优化策略

  • SSE 实时推送减少轮询压力
  • 日志文件增量读取
  • 按需加载模型组/服务
  • 进程状态本地缓存与重连

4. 输入

4.1 用户输入

  • 构型选择localStorage
  • 仿真操作(启动、暂停、终止按钮)
  • 运行参数(自动从构型获取)

4.2 系统输入

  • 当前构型 ID
  • 模型组与服务列表
  • 仿真进程状态
  • 日志文件路径

5. 输出

5.1 数据输出

  • 模型组与服务列表
    [
      {
        "name": "模型组名",
        "groupId": "组ID",
        "freq": 100,
        "priority": 1,
        "cpuAff": 0,
        "models": [
          { "className": "模型类名", "version": "1.0.0" }
        ]
      }
    ]
    
  • 服务列表
    [
      { "className": "服务类名", "version": "1.0.0" }
    ]
    
  • 仿真运行结果
    {
      "success": true,
      "simulationId": "进程ID",
      "logFile": "日志文件路径",
      "message": "仿真启动成功"
    }
    
  • 日志内容
    { "content": "日志文本" }
    

5.2 界面输出

  • 模型组/服务列表卡片
  • 仿真运行输出(带颜色)
  • 状态提示(成功/错误/信息)

6. 算法

6.1 日志文件增量读取算法

1. 记录上次读取的文件位置
2. 定时100ms请求后端读取新内容
3. 拼接到前端输出区
4. 若进程结束,读取剩余内容并停止轮询

6.2 SSE 实时输出处理算法

1. 建立 EventSource 连接
2. 监听 output/status/completed/error/terminated 事件
3. 解析数据并更新 UI
4. 断线自动重连最多3次

6.3 仿真进程状态检测算法

1. 定时请求 /api/check-process/:id
2. 若 running=false重置UI
3. 若 running=true保持连接

7. 流程

7.1 仿真运行主流程

graph TD
    A[用户点击运行仿真] --> B[获取构型参数]
    B --> C[初始化DDS监控]
    C --> D[初始化引擎控制]
    D --> E[启动仿真进程]
    E --> F[建立SSE连接]
    F --> G[实时输出日志]
    G --> H{仿真状态}
    H -->|运行中| G
    H -->|结束| I[重置UI]

7.2 日志输出流程

graph TD
    A[仿真进程启动] --> B[生成日志文件]
    B --> C[前端定时请求日志内容]
    C --> D[后端返回新内容]
    D --> E[前端拼接显示]
    E --> F{进程状态}
    F -->|运行| C
    F -->|结束| G[停止轮询]

8. 接口

所有接口均以/api 为前缀,数据格式为 JSON采用 HTTP/HTTPS 协议。具体接口有:

  1. GET /api/configurations/:confID/model-groups1功能获取指定构型下的模型组列表2输入confID路径参数3输出JSON 对象{ success: boolean, message: string, data: array }4说明返回所有模型组及其基本信息。
  2. GET /api/model-groups/:groupId/models1功能获取指定模型组下的模型列表2输入groupId路径参数3输出JSON 对象{ success: boolean, message: string, data: array }4说明返回指定模型组下的所有模型及其版本。
  3. GET /api/configurations/:confID/services1功能获取指定构型下的服务列表2输入confID路径参数3输出JSON 对象{ success: boolean, message: string, data: array }4说明返回所有服务及其版本信息。
  4. POST /api/run-simulation1功能启动仿真或测试任务2输入JSON 对象{ args: array, timeout?: number }3输出JSON 对象{ success: boolean, simulationId: string, logFile: string, message: string }4说明启动仿真进程返回进程ID和日志文件路径。
  5. GET /api/check-process/:id1功能检查仿真进程状态2输入id路径参数仿真进程ID3输出JSON 对象{ running: boolean, success: boolean, message: string }4说明返回指定进程是否仍在运行。
  6. GET /api/read-log-file1功能读取仿真日志文件内容2输入file查询参数日志文件路径position查询参数起始位置3输出JSON 对象{ content: string }4说明返回日志文件从指定位置开始的新内容。
  7. GET /api/check-xnengine1功能检测是否有正在运行的仿真进程2输入无参数3输出JSON 对象{ running: boolean, pid: string, message: string }4说明用于前端自动重连仿真。
  8. GET /api/configurations/:confID1功能获取指定构型的详细参数2输入confID路径参数3输出JSON 对象{ success: boolean, message: string, data: object }4说明返回构型的详细参数如DomainID等
  9. POST /api/dds-monitor/initialize1功能初始化 DDS 监控2输入JSON 对象{ domainId, confID, forceGen? }3输出JSON 对象{ success: boolean, message: string }4说明初始化 DDS 监控环境。
  10. POST /api/system-control/initialize1功能初始化仿真引擎控制2输入无参数3输出JSON 对象{ success: boolean, message: string }4说明初始化仿真引擎控制环境。
  11. POST /api/system-control/pause1功能暂停仿真2输入无参数3输出JSON 对象{ success: boolean, message: string }4说明暂停仿真进程。
  12. POST /api/system-control/resume1功能继续仿真2输入无参数3输出JSON 对象{ success: boolean, message: string }4说明恢复仿真进程。
  13. POST /api/system-control/stop1功能停止仿真2输入无参数3输出JSON 对象{ success: boolean, message: string }4说明停止仿真进程。
  14. POST /api/stop-simulation1功能终止仿真并清理资源2输入JSON 对象{ id: string }3输出JSON 对象{ success: boolean, message: string }4说明终止仿真进程并清理相关记录。
  15. GET /api/simulation-output/:simulationId 1功能获取仿真实时输出SSE 2输入simulationId路径参数 3输出SSE 事件流output/status/completed/error/terminated 4说明用于前端实时显示仿真输出。

如需补充参数字段或详细说明,请告知!