Supabase+Redis双引擎驱动:agentpress数据架构最佳实践

Supabase+Redis双引擎驱动:agentpress数据架构最佳实践

【免费下载链接】agentpress AI Agents API Server Starter; FastAPI, Supabase, Redis 【免费下载链接】agentpress 项目地址: https://gitcode.com/gh_mirrors/ag/agentpress

在AI Agents应用开发中,数据架构的稳定性与性能直接决定了用户体验的上限。agentpress作为基于FastAPI构建的AI Agents API服务框架,创新性地采用Supabase+Redis双引擎架构,完美平衡了持久化存储与高速缓存的需求。本文将深入剖析这一架构设计的底层逻辑,通过实战案例展示如何在agentpress项目中最大化发挥Supabase和Redis的协同优势。

双引擎架构设计理念

agentpress的数据架构建立在"动静分离"的核心原则之上,Supabase作为主数据库承担结构化数据的持久化存储与复杂查询任务,而Redis则专注于高频访问数据的缓存加速与实时通信支持。这种分层设计使得系统能够同时应对AI Agents场景下的多样化数据需求:

  • 持久化层:Supabase提供完整的PostgreSQL数据库能力,支持复杂事务与关系型数据建模,通过Row Level Security实现细粒度权限控制
  • 缓存加速层:Redis提供亚毫秒级响应速度,缓存AI模型调用结果、会话状态等高频访问数据
  • 实时通信层:利用Redis的Pub/Sub机制实现Agent间消息传递,Supabase Realtime则支持客户端数据变更推送

数据架构分层

技术选型决策依据

agentpress选择Supabase+Redis组合而非单一数据库方案,主要基于AI Agents场景的特殊需求:

  1. 计算密集型负载:AI模型调用结果需要快速缓存以避免重复计算
  2. 会话状态管理:Agent对话上下文需在Redis中临时存储以支持流式响应
  3. 复杂权限控制:Supabase的RLS功能完美匹配多租户Agent系统的权限需求
  4. 实时协作需求:双引擎均提供实时能力,满足Agent间协同工作场景

核心技术选型代码可见于项目配置文件:

# [backend/core/suna_config.py](https://link.gitcode.com/i/dd674d226e91b12966923bd79ca7b423)
SUNA_CONFIG = {
    "name": "Suna",
    "description": "Suna is your AI assistant with access to various tools and integrations",
    "model": "claude-sonnet-4.5",
    "system_prompt": SYSTEM_PROMPT,
    "configured_mcps": [],
    "custom_mcps": [],
    "agentpress_tools": {
        # 工具配置...
    }
}

Supabase深度集成实践

Supabase作为agentpress的主数据库,不仅提供数据存储功能,更通过其生态系统支撑了用户认证、实时订阅和文件存储等核心能力。项目中Supabase的集成点主要分布在以下模块:

连接池管理与初始化

agentpress采用线程安全的单例模式管理Supabase连接,确保高效复用数据库连接资源:

# [backend/core/services/supabase.py](https://link.gitcode.com/i/2d49270b826b1a7c3d69ca585ff447f6)
class DBConnection:
    """Thread-safe singleton database connection manager using Supabase."""
    
    _instance: Optional['DBConnection'] = None
    _lock = threading.Lock()
    
    async def initialize(self):
        """Initialize the database connection."""
        if self._initialized:
            return
            
        try:
            supabase_url = config.SUPABASE_URL
            # 优先使用服务角色密钥进行后端操作
            supabase_key = config.SUPABASE_SERVICE_ROLE_KEY or config.SUPABASE_ANON_KEY
            
            if not supabase_url or not supabase_key:
                logger.error("Missing required environment variables for Supabase connection")
                raise RuntimeError("SUPABASE_URL and key must be set.")

            self._client = await create_async_client(
                supabase_url, 
                supabase_key
            )
            
            self._initialized = True
            key_type = "SERVICE_ROLE_KEY" if config.SUPABASE_SERVICE_ROLE_KEY else "ANON_KEY"
            logger.info(f"Database connection initialized with Supabase using {key_type}")
            
        except Exception as e:
            logger.error(f"Database initialization error: {e}")
            raise RuntimeError(f"Failed to initialize database connection: {str(e)}")

这种实现确保了应用在高并发场景下的数据库连接稳定性,同时通过服务角色密钥与匿名密钥的灵活切换,兼顾了数据安全性与前端直接访问需求。

数据库模式设计最佳实践

agentpress的数据库模式设计充分利用了Supabase的PostgreSQL扩展能力,通过迁移脚本实现版本化管理。以下是核心表结构的设计特点:

  1. 用户与认证:复用Supabase Auth,扩展用户元数据表存储Agent偏好
  2. Agent定义表:存储Agent配置、系统提示与工具权限
  3. 会话数据表:记录对话历史,关联用户与Agent实体
  4. 文件存储:利用Supabase Storage存储Agent生成的文件

基础模式定义可见于初始迁移脚本:

-- [backend/supabase/migrations/20240414161707_basejump-setup.sql](https://link.gitcode.com/i/043d97eaa23283abf18e149d571113f4)
CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- 撤销public角色的默认执行权限
ALTER DEFAULT PRIVILEGES REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC REVOKE EXECUTE ON FUNCTIONS FROM anon, authenticated;

-- 创建basejump模式
CREATE SCHEMA IF NOT EXISTS basejump;
GRANT USAGE ON SCHEMA basejump to authenticated;
GRANT USAGE ON SCHEMA basejump to service_role;

-- 时间戳触发器函数
CREATE OR REPLACE FUNCTION basejump.trigger_set_timestamps()
    RETURNS TRIGGER AS
$$
BEGIN
    if TG_OP = 'INSERT' then
        NEW.created_at = now();
        NEW.updated_at = now();
    else
        NEW.updated_at = now();
        NEW.created_at = OLD.created_at;
    end if;
    RETURN NEW;
END
$$ LANGUAGE plpgsql;

高级特性应用:RLS与存储集成

agentpress充分利用Supabase的高级特性,实现企业级数据安全与文件管理:

  1. 行级安全策略:为每个Agent配置独立数据访问权限,确保多租户隔离
  2. 存储集成:通过Supabase Storage API管理Agent生成的文件,如:
# 文件上传工具实现
async def upload_file_to_supabase(file_content, file_name, content_type):
    """上传文件到Supabase Storage"""
    supabase_client = await DBConnection().client
    bucket_name = "agentpress_files"
    
    # 上传文件
    response = await supabase_client.storage.from_(bucket_name).upload(
        file=file_content,
        path=f"user_files/{uuid.uuid4()}_{file_name}",
        content_type=content_type
    )
    
    # 设置访问权限
    await supabase_client.storage.from_(bucket_name).update(
        path=response.path,
        options={"cacheControl": "max-age=31536000"}
    )
    
    return response

Redis性能优化策略

Redis在agentpress架构中承担着缓存、会话存储和实时通信三大核心角色。项目对Redis的使用进行了深度优化,以满足AI Agents场景的高性能需求。

连接池配置与资源管理

agentpress采用生产级Redis连接池配置,平衡性能与资源占用:

# [backend/core/services/redis.py](https://link.gitcode.com/i/65053b6b323f997980cf0113a7ccfa6b)
def initialize():
    """Initialize Redis connection pool with production-optimized settings"""
    global client, pool
    
    # 加载环境变量配置
    load_dotenv()
    redis_host = os.getenv("REDIS_HOST", "redis")
    redis_port = int(os.getenv("REDIS_PORT", 6379))
    redis_password = os.getenv("REDIS_PASSWORD", "")
    
    # 生产级连接池配置
    max_connections = 128            # 连接池大小
    socket_timeout = 15.0            #  socket超时
    connect_timeout = 10.0           # 连接超时
    retry_on_timeout = True          # 超时重试
    
    # 创建连接池
    pool = redis.ConnectionPool(
        host=redis_host,
        port=redis_port,
        password=redis_password,
        decode_responses=True,
        socket_timeout=socket_timeout,
        socket_connect_timeout=connect_timeout,
        socket_keepalive=True,
        retry_on_timeout=retry_on_timeout,
        health_check_interval=30,     # 健康检查间隔
        max_connections=max_connections,
    )
    
    # 创建Redis客户端
    client = redis.Redis(connection_pool=pool)
    return client

关键优化点包括健康检查机制、合理的超时设置和连接池大小,这些参数经过实战验证,能有效应对AI推理场景的突发流量。

缓存策略设计与实现

agentpress实现了多级缓存策略,针对不同类型数据采用差异化的缓存策略:

  1. AI模型响应:设置24小时TTL,使用cache:前缀
  2. 会话上下文:临时存储,使用sess:前缀,会话结束后自动清理
  3. 工具调用结果:根据工具类型设置不同TTL,使用tool:前缀

缓存实现代码位于:

# [backend/core/utils/cache.py](https://link.gitcode.com/i/82549e9c8dc9c95dcccf56549f184b72)
class _cache:
    async def get(self, key: str):
        redis = await get_client()
        key = f"cache:{key}"
        result = await redis.get(key)
        if result:
            return json.loads(result)
        return None

    async def set(self, key: str, value: Any, ttl: int = 15 * 60):
        redis = await get_client()
        key = f"cache:{key}"
        await redis.set(key, json.dumps(value), ex=ttl)

    async def invalidate(self, key: str):
        redis = await get_client()
        key = f"cache:{key}"
        await redis.delete(key)

Cache = _cache()

实时通信与Pub/Sub应用

agentpress利用Redis的Pub/Sub机制实现Agent间的实时通信,支持多Agent协作场景:

# Redis Pub/Sub实现
async def subscribe_to_agent_channel(agent_id: str, callback):
    """订阅Agent专用频道,接收实时消息"""
    redis_client = await get_client()
    pubsub = redis_client.pubsub()
    channel = f"agent:{agent_id}:messages"
    
    await pubsub.subscribe(channel)
    
    # 异步监听消息
    async for message in pubsub.listen():
        if message["type"] == "message":
            await callback(json.loads(message["data"]))
    
    return pubsub

async def publish_agent_message(agent_id: str, message: dict):
    """向Agent频道发布消息"""
    redis_client = await get_client()
    channel = f"agent:{agent_id}:messages"
    await redis_client.publish(channel, json.dumps(message))

这种轻量级消息系统特别适合Agent间的实时协作,相比HTTP长轮询方案减少了80%的延迟。

双引擎协同工作流程

Supabase与Redis在agentpress中并非独立工作,而是通过精心设计的协同机制形成有机整体。以下是几个关键业务流程中的双引擎协作方式。

AI Agent会话生命周期管理

一个完整的AI Agent对话会话会同时使用两个数据引擎:

  1. 会话初始化:用户请求创建新会话,记录到Supabase的sessions
  2. 上下文存储:对话历史临时存储在Redis,键格式为sess:{session_id}
  3. 模型调用:检查Redis缓存,命中则直接返回,未命中则调用API并缓存结果
  4. 结果持久化:对话结束后,重要上下文从Redis迁移到Supabase归档
  5. 会话清理:超时未活动会话由Redis自动过期清理

会话生命周期

核心实现代码位于会话管理模块:

# 会话创建流程
async def create_new_session(user_id: str, agent_id: str) -> str:
    """创建新的Agent会话,双引擎协同存储"""
    # 1. 在Supabase创建会话记录
    supabase_client = await DBConnection().client
    session_data = {
        "user_id": user_id,
        "agent_id": agent_id,
        "status": "active",
        "started_at": datetime.utcnow().isoformat()
    }
    
    session_result = await supabase_client.table("sessions").insert(session_data).execute()
    session_id = session_result.data[0]["id"]
    
    # 2. 在Redis初始化会话上下文
    redis_client = await get_client()
    session_key = f"sess:{session_id}"
    await redis_client.set(
        session_key, 
        json.dumps({"messages": [], "context": {}}),
        ex=3600  # 1小时默认超时
    )
    
    return session_id

缓存穿透防护机制

为防止AI模型调用的缓存穿透问题,agentpress实现了布隆过滤器与空值缓存结合的防护策略:

async def get_cached_model_response(prompt_hash: str) -> Optional[dict]:
    """获取缓存的模型响应,带缓存穿透防护"""
    redis_client = await get_client()
    
    # 1. 检查布隆过滤器
    bloom_key = "bloom:model_prompts"
    if not await redis_client.bf.exists(bloom_key, prompt_hash):
        return None
        
    # 2. 尝试获取缓存
    cache_key = f"cache:model:{prompt_hash}"
    cached_result = await redis_client.get(cache_key)
    
    if cached_result is None:
        # 3. 空值缓存,防止缓存穿透
        await redis_client.setex(cache_key, 300, json.dumps({"__null__": True}))
        return None
        
    result = json.loads(cached_result)
    return None if result.get("__null__") else result

实时协作编辑场景

在多Agent协作编辑文档场景中,双引擎协同提供低延迟与数据一致性保障:

  1. 操作日志:用户编辑操作通过Redis Pub/Sub实时广播
  2. 冲突解决:基础冲突通过Redis实现乐观锁控制
  3. 状态持久化:最终文档状态定期保存到Supabase
  4. 历史版本:完整编辑历史存储在Supabase,支持版本回溯

这种架构实现了毫秒级响应与数据持久化的平衡,特别适合AI辅助的实时协作场景。

部署与运维最佳实践

将Supabase+Redis双引擎架构投入生产环境需要特殊的部署与运维策略,agentpress项目提供了完整的配置模板和自动化工具。

Docker化部署配置

项目根目录下的docker-compose.yaml提供了一键部署配置,包含所有依赖服务:

# [docker-compose.yaml](https://link.gitcode.com/i/f714f506df657d7df2355cb9c1a6b93b)
version: '3.8'

services:
  backend:
    build: ./backend
    depends_on:
      - redis
    environment:
      - SUPABASE_URL=${SUPABASE_URL}
      - SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY}
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    ports:
      - "8000:8000"

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    ports:
      - "6379:6379"

volumes:
  redis_data:

性能监控与告警

agentpress配置了全面的双引擎监控:

  1. Supabase监控:使用官方Dashboard监控查询性能与存储增长
  2. Redis监控:通过redis_exporter暴露指标,Prometheus+Grafana可视化
  3. 自定义告警:关键指标异常触发告警,如缓存命中率低于80%

监控面板配置可参考项目的backend/utils/scripts/目录下的监控脚本。

备份与灾难恢复

双引擎采用不同的备份策略,确保数据安全:

  • Supabase:启用每日自动备份,保留30天历史版本
  • Redis:开启AOF持久化,每10分钟fsync一次,关键数据定期同步到Supabase

灾难恢复流程文档位于docs/SELF-HOSTING.md,包含详细的故障转移步骤。

扩展与演进路径

随着AI Agents应用场景的不断丰富,agentpress的数据架构也设计了清晰的扩展路径。

多区域部署策略

当用户规模增长到跨区域级别,可采用以下扩展方案:

  1. Supabase:利用跨区域复制功能,实现读取就近访问
  2. Redis:采用Redis Cluster,按Agent ID范围分片数据
  3. 全局路由:通过地理DNS将用户请求路由到最近区域

存储分层优化

随着数据量增长,可引入存储分层策略:

  1. 热数据:近期活跃的Agent会话数据保留在Redis
  2. 温数据:近期对话历史迁移到Supabase
  3. 冷数据:归档对话存储到对象存储,通过Supabase外部表访问

未来技术演进方向

agentpress数据架构的下一步演进计划包括:

  1. 向量数据库集成:引入PgVector扩展,支持Agent的语义记忆存储
  2. 时序数据优化:Agent行为分析数据迁移到TimescaleDB
  3. 边缘计算支持:将部分Redis缓存下沉到边缘节点,降低延迟

总结与最佳实践清单

Supabase+Redis双引擎架构为agentpress提供了高性能、高可靠性的数据基础,特别适合AI Agents这类复杂应用场景。以下是从该架构中提炼的最佳实践清单:

Supabase最佳实践

  1. 使用服务角色密钥:后端操作优先使用service_role_key,避免权限提升风险
  2. 合理设计RLS策略:为每个Agent表设计最小权限的RLS规则
  3. 利用触发器自动维护数据:如使用basejump.trigger_set_timestamps自动更新时间戳
  4. 批量操作优化:大量Agent配置更新使用bulk insert而非单条操作
  5. 索引设计:为常用查询路径创建复合索引,如(user_id, agent_id)

Redis最佳实践

  1. 统一键命名规范:采用{prefix}:{resource}:{id}格式,如cache:model:abc123
  2. 合理设置TTL:根据数据类型设置不同过期时间,会话数据通常1-24小时
  3. 避免大key:单个key大小控制在1MB以内,大型Agent上下文拆分为多个key
  4. 连接池调优:根据并发量调整max_connections,通常设置为CPU核心数*8
  5. ** Pipeline批量操作**:多个Redis命令打包执行,减少网络往返

双引擎协同实践

  1. 数据分类存储:根据访问频率和持久化需求选择合适的存储引擎
  2. 一致性保障:关键业务流程使用分布式锁或事务确保双引擎数据一致
  3. 故障隔离:设计降级策略,单个引擎故障时系统仍能部分可用
  4. 监控协同:同时监控两个引擎的性能指标,识别性能瓶颈

通过本文介绍的架构设计与最佳实践,开发者可以构建出既稳定可靠又性能卓越的AI Agents应用。agentpress项目的完整源代码与文档可通过以下资源获取:

【免费下载链接】agentpress AI Agents API Server Starter; FastAPI, Supabase, Redis 【免费下载链接】agentpress 项目地址: https://gitcode.com/gh_mirrors/ag/agentpress

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值