-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
此 RFC 正处于修订阶段
概述
由于 AstrBot 插件数量的迅速增长,插件之间的依赖冲突导致重新下载依赖版本和报错的问题逐渐增多。此外,当前的插件系统存在一些安全隐患。为了解决这些问题并提升系统的可维护性、可扩展性和数据安全性,提出一种新的插件与本体隔离方案。该方案参考了 Model Context Protocol(MCP)的设计架构,将本体端与插件端运行在不同的进程中,通过数据传输协议(如 stdio / websockets)进行交互,利用 JSON-RPC 或 MessagePack 作为 RPC 协议,采用 msgspec 进行高效的序列化和反序列化,结合 pydantic 进行数据校验。
同时,我们计划将与插件开发相关的在 AstrBot 本体仓库的数据类和工具方法抽离为单独的 SDK,新的插件开发将依赖于这个 SDK,并逐步替换 AstrBot 本体仓库中的相关代码。
相关 Issue: #738
问题背景
目前,AstrBot 插件和本体紧密耦合,插件与本体共享相同的依赖库,这导致了以下问题:
- 依赖冲突:随着插件的增加,存在版本依赖冲突的情况,导致插件无法正确加载或运行。
- 数据安全性和隔离性问题:插件和本体共享运行环境,可能导致插件对本体数据的恶意或无意读取和篡改。
- 维护困难:插件与本体代码的高度耦合使得插件的开发、更新和调试变得复杂,增加了开发和维护成本。
为了克服这些问题,我们参考 MCP 的设计架构,设计了全新的插件隔离方案,确保插件和本体能在独立进程中运行,同时提高插件的可扩展性和可维护性。
方案设计
1. 插件与本体进程隔离
通过进程间隔离,本体端和插件端将运行在不同的进程中。这样可以确保插件与本体的相互独立,避免由于插件依赖冲突导致本体问题。
- 隔离机制:插件将作为独立的进程运行,通过标准输入输出(stdio)或 WebSocket 进行通信。每个插件都将作为单独的进程启动,确保插件的崩溃不会影响到 AstrBot 本体的运行。
- 数据传输:本体和插件间的通信将使用 stdio 或 WebSocket 协议,确保双向数据传输的稳定性和高效性。
2. RPC 协议:JSON-RPC 或 MessagePack
- JSON-RPC:在数据传输协议中,采用 JSON-RPC 协议作为标准的远程过程调用(RPC)协议,支持异步调用、批量请求等特性,简洁易懂且符合传统的 RPC 规范。
- MessagePack:为了提高性能,尤其是在大数据量传输的场景中,选用 MessagePack 作为二进制协议,提供更小的传输数据包和更高效的序列化与反序列化操作。MessagePack 相比 JSON 协议更高效,尤其是在微服务架构中,对带宽和响应时间有严格要求的系统中尤其重要。
3. 数据序列化与反序列化:msgspec
- msgspec:为了提高数据序列化与反序列化的性能,我们决定使用 msgspec。它不仅支持 JSON 和 MessagePack 两种格式,还能通过 pydantic 完成数据校验。
- 性能优势:相比传统的 json 序列化,msgspec 提供了更高效的性能,能够显著减少 CPU 开销和内存占用,特别是在高并发的场景下,表现尤为突出。
4. 数据校验:pydantic / msgspec
- pydantic:借助 pydantic,我们可以在数据序列化和反序列化时进行类型校验,确保数据的正确性。数据模型的定义将统一使用 pydantic 来确保数据的类型安全和一致性。
- msgspec:结合 msgspec,我们可以使用其内建的验证机制,在进行序列化时自动检查数据结构和字段类型。msgspec 和 pydantic 的结合,既能提高性能,又能确保数据的完整性。
5. SDK 设计与依赖管理
-
SDK 抽离:我们计划将所有与插件开发相关的数据类、工具方法抽离到单独的 SDK 中,并独立为一个仓库或 monorepo。新的插件开发将直接依赖这个 SDK,并使用 SDK 提供的功能与接口。
-
SDK 功能:
- 提供统一的数据模型(基于 pydantic)和序列化方法(基于 msgspec)。
- 提供插件与本体通信的 RPC 协议实现(支持 JSON-RPC 或 MessagePack)。
- 提供插件的错误处理和回调机制,确保插件在独立进程中运行时的稳定性。
-
逐步替换:本体仓库中的相关代码将在新 SDK 完成后逐步替换,减少代码冗余和耦合。
6. 版本管理与插件开发流程
- 版本管理:插件与 SDK 将采用独立的版本管理,确保每个插件能够明确指定所依赖的 SDK 版本,避免版本冲突。
- 开发流程:新的插件开发将依赖于 SDK,开发者将通过 SDK 提供的接口进行插件功能开发。插件的更新与 SDK 的版本控制将同步进行,以保证插件兼容性。
方案优势
-
增强的插件与本体隔离性:
- 通过进程隔离,插件与本体完全独立,避免了插件与本体间的依赖冲突。
- 插件的崩溃不会影响到本体的运行,提升系统的稳定性。
-
更好的数据安全性:
- 插件与本体通过隔离的进程进行通信,数据传输中采用了严格的数据校验和协议规范,确保数据的安全性。
-
可维护性和扩展性:
- 通过将 SDK 抽离出来,开发者可以独立开发和测试插件,减少了插件开发和本体代码之间的耦合。
- 新插件的开发将更具扩展性,开发者可以依赖 SDK 提供的统一接口和功能。
-
灵活的版本控制与依赖管理:
- SDK 和插件采用独立版本管理,避免了插件间的依赖冲突,确保了插件的兼容性和稳定性。
-
与现有插件系统兼容:
- 新的插件系统将和旧的插件系统同时存在于 AstrBot,不会造成兼容性问题,目前的所有插件将在此设计架构下仍然适用。
下一步计划
-
SDK 开发:
- 在新的仓库中设计和实现 SDK,确保其与现有的插件架构兼容,并提供必要的工具和接口。
-
插件迁移:
- 将现有插件逐步迁移到新的 SDK 架构中,确保插件的功能和性能不受影响。
-
性能优化:
- 对数据传输和序列化过程进行性能优化,确保在高负载情况下系统的稳定性和响应速度。
-
文档与开发者支持:
- 更新开发文档,提供详细的 SDK 使用指南和插件开发文档,确保开发者能够顺利迁移和开发插件。
结论
通过本次架构改进,AstrBot 插件与本体的隔离性、数据安全性、性能和扩展性将得到显著提升。我们将采用基于 MCP 的隔离方案,结合 msgspec 和 pydantic 进行高效的数据传输和校验,同时通过抽离 SDK 提供清晰的插件开发流程。这些改进将为 AstrBot 的长期发展和可维护性提供强有力的支持。
Participants: AstrBot Team