Skip to content

[RFC] AstrBot Plugin and Core Isolation Architecture #3210

@Soulter

Description

@Soulter

此 RFC 正处于修订阶段

Image

概述

由于 AstrBot 插件数量的迅速增长,插件之间的依赖冲突导致重新下载依赖版本和报错的问题逐渐增多。此外,当前的插件系统存在一些安全隐患。为了解决这些问题并提升系统的可维护性、可扩展性和数据安全性,提出一种新的插件与本体隔离方案。该方案参考了 Model Context Protocol(MCP)的设计架构,将本体端与插件端运行在不同的进程中,通过数据传输协议(如 stdio / websockets)进行交互,利用 JSON-RPCMessagePack 作为 RPC 协议,采用 msgspec 进行高效的序列化和反序列化,结合 pydantic 进行数据校验。

同时,我们计划将与插件开发相关的在 AstrBot 本体仓库的数据类和工具方法抽离为单独的 SDK,新的插件开发将依赖于这个 SDK,并逐步替换 AstrBot 本体仓库中的相关代码。

相关 Issue: #738

问题背景

目前,AstrBot 插件和本体紧密耦合,插件与本体共享相同的依赖库,这导致了以下问题:

  1. 依赖冲突:随着插件的增加,存在版本依赖冲突的情况,导致插件无法正确加载或运行。
  2. 数据安全性和隔离性问题:插件和本体共享运行环境,可能导致插件对本体数据的恶意或无意读取和篡改。
  3. 维护困难:插件与本体代码的高度耦合使得插件的开发、更新和调试变得复杂,增加了开发和维护成本。

为了克服这些问题,我们参考 MCP 的设计架构,设计了全新的插件隔离方案,确保插件和本体能在独立进程中运行,同时提高插件的可扩展性和可维护性。

方案设计

1. 插件与本体进程隔离

通过进程间隔离,本体端和插件端将运行在不同的进程中。这样可以确保插件与本体的相互独立,避免由于插件依赖冲突导致本体问题。

  • 隔离机制:插件将作为独立的进程运行,通过标准输入输出(stdio)或 WebSocket 进行通信。每个插件都将作为单独的进程启动,确保插件的崩溃不会影响到 AstrBot 本体的运行。
  • 数据传输:本体和插件间的通信将使用 stdioWebSocket 协议,确保双向数据传输的稳定性和高效性。

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,我们可以使用其内建的验证机制,在进行序列化时自动检查数据结构和字段类型。msgspecpydantic 的结合,既能提高性能,又能确保数据的完整性。

5. SDK 设计与依赖管理

  • SDK 抽离:我们计划将所有与插件开发相关的数据类、工具方法抽离到单独的 SDK 中,并独立为一个仓库或 monorepo。新的插件开发将直接依赖这个 SDK,并使用 SDK 提供的功能与接口。

  • SDK 功能

    • 提供统一的数据模型(基于 pydantic)和序列化方法(基于 msgspec)。
    • 提供插件与本体通信的 RPC 协议实现(支持 JSON-RPCMessagePack)。
    • 提供插件的错误处理和回调机制,确保插件在独立进程中运行时的稳定性。
  • 逐步替换:本体仓库中的相关代码将在新 SDK 完成后逐步替换,减少代码冗余和耦合。

6. 版本管理与插件开发流程

  • 版本管理:插件与 SDK 将采用独立的版本管理,确保每个插件能够明确指定所依赖的 SDK 版本,避免版本冲突。
  • 开发流程:新的插件开发将依赖于 SDK,开发者将通过 SDK 提供的接口进行插件功能开发。插件的更新与 SDK 的版本控制将同步进行,以保证插件兼容性。

方案优势

  1. 增强的插件与本体隔离性

    • 通过进程隔离,插件与本体完全独立,避免了插件与本体间的依赖冲突。
    • 插件的崩溃不会影响到本体的运行,提升系统的稳定性。
  2. 更好的数据安全性

    • 插件与本体通过隔离的进程进行通信,数据传输中采用了严格的数据校验和协议规范,确保数据的安全性。
  3. 可维护性和扩展性

    • 通过将 SDK 抽离出来,开发者可以独立开发和测试插件,减少了插件开发和本体代码之间的耦合。
    • 新插件的开发将更具扩展性,开发者可以依赖 SDK 提供的统一接口和功能。
  4. 灵活的版本控制与依赖管理

    • SDK 和插件采用独立版本管理,避免了插件间的依赖冲突,确保了插件的兼容性和稳定性。
  5. 与现有插件系统兼容

    • 新的插件系统将和旧的插件系统同时存在于 AstrBot,不会造成兼容性问题,目前的所有插件将在此设计架构下仍然适用。

下一步计划

  1. SDK 开发

    • 在新的仓库中设计和实现 SDK,确保其与现有的插件架构兼容,并提供必要的工具和接口。
  2. 插件迁移

    • 将现有插件逐步迁移到新的 SDK 架构中,确保插件的功能和性能不受影响。
  3. 性能优化

    • 对数据传输和序列化过程进行性能优化,确保在高负载情况下系统的稳定性和响应速度。
  4. 文档与开发者支持

    • 更新开发文档,提供详细的 SDK 使用指南和插件开发文档,确保开发者能够顺利迁移和开发插件。

结论

通过本次架构改进,AstrBot 插件与本体的隔离性、数据安全性、性能和扩展性将得到显著提升。我们将采用基于 MCP 的隔离方案,结合 msgspecpydantic 进行高效的数据传输和校验,同时通过抽离 SDK 提供清晰的插件开发流程。这些改进将为 AstrBot 的长期发展和可维护性提供强有力的支持。

Participants: AstrBot Team

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions