[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81750":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":10,"openIssues":11,"contributorsCount":11,"subscribersCount":11,"size":11,"stars1d":11,"stars7d":11,"stars30d":11,"stars90d":11,"forks30d":11,"starsTrendScore":11,"compositeScore":11,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":12,"fork":12,"defaultBranch":13,"hasWiki":14,"hasPages":12,"topics":15,"createdAt":8,"pushedAt":8,"updatedAt":16,"readmeContent":17,"aiSummary":18,"trendingCount":11,"starSnapshotCount":11,"syncStatus":19,"lastSyncTime":20,"discoverSource":21},81750,"relay-flow","LingoodBoy\u002Frelay-flow","LingoodBoy",null,"Go",27,0,false,"main",true,[],"2026-06-12 02:04:19","# RelayFlow\n\n[中文](README.md) | [English](README_EN.md)\n\nRelayFlow 是一个面向长耗时 Agent 任务的可靠异步中继层，用来把低并发、长耗时、稳定性不可控的 Agent 服务包装成可排队、可重试、可查询、可观测的异步任务流。\n\n它的核心目标是把前端高并发连接压力和后端 Agent 执行压力解耦：Relay API 负责接收 HTTP\u002FSSE 请求并快速入队，Worker 按配置的并发度消费任务并调用 Agent，从而让不可控的突发流量变成可控的后台执行。\n\n## Features\n\n- 异步任务提交：`POST \u002Fv1\u002Fruns` 快速返回 `run_id`\n- SSE 进度推送：`GET \u002Fv1\u002Fruns\u002F{run_id}\u002Fevents` 订阅任务阶段事件\n- RabbitMQ 削峰：任务入队后由 Worker 按并发度消费\n- Worker 并发控制：保护低吞吐 Agent 服务不被突发流量打爆\n- Redis 状态存储：保存任务状态、结果和事件历史\n- EventProcessor：独立消费事件持久化队列，推进 Run 状态并写入 Redis\n- 多实例 SSE 推送：每个 Relay API 通过独占广播队列接收 RunEvent，支持入口服务横向扩展\n- 失败重试与 DLQ：支持 timeout、可重试错误、死信队列\n- Agent 事件标准化：将不同 Agent 的阶段事件统一成 RelayFlow RunEvent\n- Prometheus \u002F OpenTelemetry：支持指标采集和异步链路追踪\n\n## Architecture\n\n\u003Cimg src=\"pics\u002Farchitecture.png\" alt=\"RelayFlow architecture\" width=\"820\">\n\nWorker 会将标准化后的 RunEvent 发布到 RabbitMQ event exchange。EventProcessor 独占持久化队列，负责写入 Redis 和更新任务状态；每个 Relay API 实例会创建自己的临时广播队列，只负责把匹配事件推送到本机 SSEHub。这样 Relay API 可以多实例部署，SSE 实时推送不依赖负载均衡粘性会话。\n\n## Tech Stack\n\n- Go, Gin\n- RabbitMQ\n- Redis\n- Prometheus\n- OpenTelemetry, Jaeger\n- FastAPI demo Agent\n- Docker Compose\n\n## Quick Start\n\n启动基础依赖：\n\n```bash\ndocker compose -f docker-compose.infra.yml up -d\n```\n\n启动示例 Agent：\n\n```bash\ndocker compose -f docker-compose.agent.yml up -d --build\n```\n\n启动 Relay API、Worker 和 EventProcessor：\n\n```bash\ndocker compose -f docker-compose.relay.yml up -d --build\n```\n\n## API Usage\n\n创建异步任务：\n\n```bash\ncurl -X POST http:\u002F\u002F127.0.0.1:8080\u002Fv1\u002Fruns \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\n    \"agent_id\": \"langgraph\",\n    \"input\": {\n      \"prompt\": \"帮我查一下北京今天的天气\"\n    }\n  }'\n```\n\n响应示例：\n\n```json\n{\n  \"run_id\": \"run_xxx\",\n  \"status\": \"queued\"\n}\n```\n\n查询任务状态：\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8080\u002Fv1\u002Fruns\u002F{run_id}\n```\n\n订阅任务事件：\n\n```bash\ncurl -N http:\u002F\u002F127.0.0.1:8080\u002Fv1\u002Fruns\u002F{run_id}\u002Fevents\n```\n\nSSE 事件示例：\n\n```text\nevent: running\ndata: {\"run_id\":\"run_xxx\",\"seq\":1,\"type\":\"running\",\"message\":\"任务开始执行\"}\n\nevent: succeeded\ndata: {\"run_id\":\"run_xxx\",\"seq\":5,\"type\":\"succeeded\",\"message\":\"任务执行成功\"}\n```\n\n## Load Testing\n\n在 `2C2G` 资源限制下，使用 Go SSE 压测器模拟 `15,500` 个用户同时提交任务并订阅 SSE 进度事件。Worker 并发度设置为 `1000`，用于模拟后端 Agent 最大执行并发。整轮压测在约 `13` 分钟内完成，期间请求无异常，SSE 连接正常释放，未观察到协程或连接泄漏。\n\n### Runtime Memory\n\nGo 内存整体保持稳定，压测过程中没有出现持续上涨或异常 GC 压力。\n\n\u003Cimg src=\"pics\u002Fmemory.png\" alt=\"Go memory\" width=\"760\">\n\n### Queue Backlog\n\nRabbitMQ 队列在 Worker 按并发度消费时形成可控堆积，并随着任务执行逐步回落。\n\n\u003Cimg src=\"pics\u002Fmq.png\" alt=\"RabbitMQ queue\" width=\"760\">\n\n### SSE Connections and Completed Runs\n\nSSE 连接数随用户启动逐步上升，任务完成后连接正常释放；完成数稳定增长。\n\n\u003Cimg src=\"pics\u002Frun_total.png\" alt=\"SSE connections and completed runs\" width=\"760\">\n\n### Worker Concurrency\n\nWorker 当前执行任务数稳定维持在设定的 `1000` 并发附近，说明后端 Agent 执行压力被控制在预期范围内。\n\n\u003Cimg src=\"pics\u002Fworkers.png\" alt=\"Worker concurrency\" width=\"760\">\n\n## Notes\n\n- RelayFlow 不接管 Agent 的业务逻辑、对话上下文或工具调用，只负责异步任务可靠性层。\n- RabbitMQ 用于任务消息和低频阶段事件，不用于 token 级高频流式传输。\n- Relay API 负责 HTTP\u002FSSE 接入，EventProcessor 负责事件持久化，两者可以独立扩缩容。\n","RelayFlow 是一个面向长耗时 Agent 任务的可靠异步中继层，旨在将低并发、长耗时且稳定性不可控的 Agent 服务包装成可排队、可重试、可查询和可观测的异步任务流。其核心功能包括通过 HTTP\u002FSSE 请求快速提交任务并返回 run_id，利用 RabbitMQ 进行削峰处理及任务队列管理，以及使用 Redis 存储任务状态和结果。此外，项目还支持失败重试机制与死信队列，并集成了 Prometheus 和 OpenTelemetry 以实现指标采集和链路追踪。适用于需要解耦前端高并发请求压力与后端不稳定 Agent 执行环境的场景，如大规模分布式计算任务调度或长时间运行的服务调用优化。",2,"2026-06-11 04:06:14","CREATED_QUERY"]