Confer — 系统架构

本文是目标架构,不是实现现状。 当前实现是单进程、单实例的 gateway: WebSocket 连接表、A2A 重放防护 nonce、限流计数全部保存在 gateway 进程内存里 (ws/handler.tslib/nonce-cache.tsmiddleware/rate-limit.ts)。

因此 gateway 不能跑第二个副本。 加副本会静默破坏 A2A 重放防护——重放请求 落到另一个副本时 nonce 表是空的,直接放行;同时 WS 推送会漏掉连在另一副本上的 用户,限流阈值按副本数倍增。

下文提到的 NATS / Redis 是横向扩展时的目标方案,目前既未部署也未接线 (2026-08-07 已从 docker-compose*.ymlenv.ts 中移除,此前它们只是空转的 容器和一个从未被读取的环境变量)。真要横向扩展,先把上述三处进程内状态迁到共享 存储,nonce 优先——它是安全关键。

高层架构

┌────────────────────────────────────────────────────────────┐
│  Clients (Tauri 2.0)                                       │
│  iOS · Android · Windows · macOS · Linux                   │
└──────────────────────────┬─────────────────────────────────┘
                           │ WSS / HTTPS / SSE
                           ▼
┌────────────────────────────────────────────────────────────┐
│  Edge API Gateway  (Bun + Hono)                            │
│  Auth · Rate limit · Routing · WS fan-out                  │
└─────┬─────────────┬─────────────────┬────────────────┬─────┘
      │             │                 │                │
      ▼             ▼                 ▼                ▼
 ┌────────┐  ┌─────────────┐  ┌────────────┐  ┌──────────────┐
 │ Agent  │  │Conversation │  │ Identity & │  │ MCP / Tools  │
 │Runtime │  │     Hub     │  │A2A Gateway │  │  Connector   │
 └───┬────┘  └──────┬──────┘  └─────┬──────┘  └──────┬───────┘
     │              │               │                │
     ▼              ▼               ▼                ▼
┌──────────────────────────────────────────────────────────────┐
│  Data layer: PostgreSQL · Redis · NATS · Vector (Qdrant)·S3 │
└──────────────────────────────────────────────────────────────┘
       │                              │
       ▼                              ▼
 LLM providers              Other instances' Agents
 (Claude / GPT /            (federation via A2A
  DeepSeek / Qwen)           over HTTPS)

设计原则

服务边界

1. Edge API Gateway

参考 docs/05-api.md

2. Agent Runtime

每个用户对应一个常驻 Agent 实例。

3. Conversation Hub

4. Identity & A2A Gateway

详细协议设计参考 docs/03-protocol.md

5. MCP / Tools Connector

数据层

组件 用途 状态
PostgreSQL 用户、Agent、对话、消息、权限、peer 关系(主存储) ✅ 已用
Qdrant Agent 长期记忆 RAG、用户资料库索引 ✅ 已用
S3-compatible (MinIO) 知识库文件存储 ✅ 已用
Redis session、presence、限流计数、热数据缓存 ⬜ 未部署,横向扩展时才需要
NATS Streams 消息扇出(user.{uid}.events)+ Agent runtime 任务队列 ⬜ 未部署,横向扩展时才需要

客户端架构

跨平台覆盖

平台 通过
iOS Tauri 2.0 iOS support
Android Tauri 2.0 Android support
Windows Tauri 2.0
macOS Tauri 2.0
Linux Tauri 2.0

单一代码库,无原生 fallback。

Claude Code 插件

参考 docs/06-claude-code-plugin.md

部署架构

单实例(个人/小团队)

实际的 docker-compose.prod.yml(agent-runtime / identity 是 gateway 内的库,不是独立服务):

  - gateway   (Bun 服务,单副本 — 见文首)
  - client    (nginx 托管前端)
  - migrate   (一次性任务)
  - postgres
  - qdrant
  - minio

部署方式:docker compose -f docker-compose.prod.yml up -d 起来就能用。

企业实例

云端(Confer 自家云)

前置条件:gateway 目前是单副本(进程内状态)。多副本前必须先把 WS 连接表、 A2A nonce、限流计数迁到共享存储,否则重放防护会静默失效。

联邦化(跨实例)

任何一个 Confer 实例(自建或云端)都可以通过 A2A 协议和其他实例互通。

[acme.com]              [vendor-x.com]            [confer.cloud]
 Agent A    <─── A2A ───> Agent B    <─── A2A ───> Agent C

身份和发现:

可观测性

安全边界

关键技术决策

决策 选择 备选 理由
后端语言 Bun + TypeScript Go MCP/A2A SDK 是 TS-first;全栈类型共享
Web 框架 Hono Elysia, Fastify 轻、快、生态稳
客户端 Tauri 2.0 Flutter, Electron 单代码库 5 平台,Rust 安全,体积小
主存储 PostgreSQL 18 MySQL JSON 支持好,扩展性强,pgvector 可选
消息总线 NATS Kafka, Redis Pub/Sub 轻、持久化、精确订阅
向量库 Qdrant Pinecone, pgvector 自托管成熟、Rust 写的性能稳
身份 DID:web DID:key, OAuth-only 与 web 基建兼容,NANDA 推荐
协议 A2A + MCP + AgentFacts 自有协议 押注开放协议生态
← 返回 Confer A2A · DID:web · RFC 9421 · NANDA