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

No one assigned

    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