主要讨论一下各部分组件之间通讯和数据交换的方式
议题1:各部分组件之间通讯和数据交换的方式
目的:
系统各个组件之间和高效、稳定的通讯
所有数据发送到Genapsed并由Genapsed路由
要考虑稳定性、速度、安全性(权限管理)、数据多样性
要能够传输文本(控制指令、事件等)、图像(监控抓图、识别结果等)、视频(录像片段等)、二进制文件(用户上传的文件、更新包、压缩包等)
eg:下图红色部分都需要互相通讯


方案选择
1. 方案
- MQTT
- Python 内部传参
- HTTP / RESTful API (配合 WebSocket/SSE)
- 描述:最通用的 Web 标准。插件作为 Server 或 Client。
- 适用:获取配置、上传大文件、视频流拉取、WebSocket 做实时推送。
- gRPC (Google Remote Procedure Call)
- 描述:基于 HTTP/2 和 Protobuf 的高性能 RPC 框架。
- 适用:内部微服务之间的高频、结构化数据调用(如 LLM 频繁调用工具)。
- ZeroMQ (ØMQ)
- 描述:高性能消息队列库,无需中间 Broker,直接点对点或发布订阅。
- 适用:极高吞吐量的本地进程间通讯,比 MQTT 更快,资源占用更低。
- 共享内存 / 本地文件系统 (Shared Memory / Local FS)
- 描述:不通过网络,直接读写内存块或磁盘文件。
- 适用:超大文件(视频片段) 的交换。
2. 方案优缺点对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MQTT | 1. 标准 IoT 协议,解耦(发布/订阅) 2. 极轻量,带宽占用低 3. 支持 QoS(消息质量保证) | 1.不适合传大文件(阻塞 Broker) 2. 实时性略低于 ZeroMQ | 控制指令、事件通知、小文本、传感器数据。 |
| HTTP / REST | 1. 通用,调试方便 2. 支持大文件(流式) 3. 防火墙友好 | 1. 主要是“请求-响应”模式,实时推送需配合 WebSocket 2. 头部开销比 MQTT 大 | 配置管理、文件上传下载、视频流回放、LLM 交互。 |
| Python 传参 | 1. 速度最快(内存访问,无额外开销) | 1.耦合度极高 2. 一个插件崩溃可能导致主程序崩溃 3. 难以实现热插拔/独立重启 | 仅限核心库内部调用,严禁用于插件间通讯。 |
| gRPC | 1. 性能极高(二进制 Protobuf) 2. 强类型约束,接口定义清晰 | 1. 开发门槛稍高(需写 .proto 文件) 2. 不如 JSON/HTTP 直观 | 高频、低延迟的内部服务调用(如 LVM 推理结果回传)。 |
| 本地文件/共享内存 | 1. 便于传输大文件 2. 无额外开销 | 1. 仅限单机 2. 需要管理文件生命周期(清理旧文件) | 视频录像片段、大图片、模型文件。 |
3. 最终推荐方案:混合架构 (Hybrid Architecture)
鉴于你的需求是“所有数据发送到 Genapsed 并路由”,且数据包含视频,绝对不能让视频二进制流直接穿过 Genapsed 的消息总线,否则 Genapsed 会瞬间成为性能瓶颈甚至内存溢出。
推荐采用“控制面与数据面分离”的策略:
A. 控制面 (Control Plane) -> 使用 MQTT 或 ZeroMQ
- 用途:传输指令、事件描述(JSON)、小图片(Base64)、状态心跳。
- 流程:
- 插件 A 检测到事件,发送 JSON 消息到 MQTT Topic (
everpast/genapsed/event/high)。 Genapsed订阅该 Topic,收到消息。Genapsed根据规则,将消息路由(Publish)到插件 B 的 Topic。
- 插件 A 检测到事件,发送 JSON 消息到 MQTT Topic (
- 优点:解耦、快速、
Genapsed负载低。
B. 数据面 (Data Plane) -> 使用“引用传递” + 本地存储/HTTP
-
用途:传输视频片段、大图片、二进制包。
-
核心机制:Pass-by-Reference (传引用,不传值)
- 写入:插件 A 将视频片段写入本地磁盘(如
/data/recordings/20260303_1200.mp4)或 内置 HTTP Server。 - 发送:插件 A 通过 MQTT 发送一条轻量级消息给
Genapsed:
{"event": "motion_detected","video_path": "/data/recordings/20260303_1200.mp4",// 或者 "video_url": "http://localhost:8080/stream/123""timestamp": 1741000000}- 路由:
chronosd收到这条文本消息,路由给插件 B。 - 读取:插件 B 收到消息,解析出
video_path,自己去读取文件或请求 HTTP 下载。
- 写入:插件 A 将视频片段写入本地磁盘(如
总结方案架构图示:
为什么选这个?
- 稳定性:
Genapsed只处理文本 JSON,永远不会因为传输 500MB 的视频而卡死。 - 速度:MQTT 处理文本极快;本地文件读取速度远快于网络传输。
- 多样性:文本走 MQTT,文件走磁盘/HTTP,各取所长。
- 符合需求:确实实现了“所有数据(的元数据/索引)都经过 Genapsed路由”。
议题二:术语解释中组件命名
参考:
https://chat.qwen.ai/c/ec510ba9-ed02-4dbc-a9ff-4ee174d93c54
结论
最终由 @Archeroy 提出,共同统一使用Genapsed /dʒɛˈnæps-d/
Genesis (创世/首发启动) + Synapse (突触:神经元之间传递通讯信号的底层结构)
https://applink.feishu.cn/client/message/link/open?token=AmlGRyrUk4vNaamOooFATNo%3D