
Cloudflare Durable Objects架构深潜Company Brain如何扛住高并发Slack事件流【免费下载链接】company-brainOpen-sourcing our company brain - A teammate in your Slack that remembers everything your team says, and can go do the work.项目地址: https://gitcode.com/gh_mirrors/co/company-brainCompany Brain 是一个驻留在 Slack 里的团队大脑它记住团队在频道里说过的每一件事能回答、能检索、还能直接动手干活开 Issue、读代码、跑脚本。而支撑这条 Slack 事件流高速运转的核心正是 Cloudflare Durable ObjectsDO——本文带你深潜这套架构看懂它是如何用按组织隔离的单实例 KV 幂等去重 Fiber 检查点恢复扛住高并发事件洪峰的。一、为什么 Slack 事件流是典型的高并发场景Slack 的事件订阅有几个天然高并发特性重试是常态Slack 收到非 2xx 响应就会重发同一事件event_id不变同一消息会以多种事件类型竞速到达mention、message、thread 回复几乎同时推来事件是长任务的触发器一条 消息背后可能是几十步的工具调用循环处理远超普通 HTTP 请求的毫秒级预算。如果直接把每条事件丢给无状态 Worker 处理轻则重复回答重则两个 Worker 同时改同一频道状态。Company Brain 的解法是三层防线路由层去重 → DO 单实例串行 → Fiber 幂等恢复。完整系统地图见 docs/architecture.md。二、DO 架构总览每个组织一个专属大脑实例在 wrangler.jsonc 中注册了两个 Durable Object 绑定durable_objects: { bindings: [ { name: COMPANY_BRAIN_AGENT, class_name: CompanyBrainAgent }, { name: Sandbox, class_name: Sandbox } ] }CompanyBrainAgent每个组织orgId一个实例通过getAgentByName(COMPANY_BRAIN_AGENT, orgId)路由。所有 Slack 回合、审批卡、定时任务、自动研究、试用提醒都收敛在这一个单例里——同组织的并发事件被天然串行化跨组织之间又完全隔离Sandbox代码沙箱的运行时实例。DO 类刻意保持薄壳src/brain/turn/agent.ts 只声明方法与生命周期重逻辑在首次调用时才import(./agent.impl)懒加载。这是为了控制 Worker 全局启动体积避开 Cloudflare 的校验预算限制。入口端点在 src/routes/slack/index.tsSlack 把带签名的 POST 打到这里Worker 先验 HMAC、再分类、立即回{ok:true}真正的重活交给c.executionCtx.waitUntil(...)在 DO 里异步执行——响应快、处理稳二者解耦。三、第一层防线KV 幂等去重与回合锁在事件进入 DO 之前src/routes/slack/index.ts 用BRAIN_KV做了两级去重事件级幂等键slack:evt:{event_id}——Slack 的重发事件在这里被直接吞掉TTL 一天回合锁slack:turn:{teamId}:{channel}:{ts}——同一用户消息无论以几种事件类型竞速到达只有一个能进入回合其余看到锁即返回成功。注意去重键只在任务到达终态后才写入如onSlackTeamJoin返回terminaltrue才落键这样瞬时失败时 Slack 的重试还能补投递——幂等与可重试之间的取舍非常讲究。四、第二层防线Fiber 检查点与崩溃恢复显式的 Slack 回合不是普通方法调用而是跑在一个Fiber上src/brain/turn/agent.ts 中的startFiber幂等键slack:{teamId}:{eventId}见 src/brain/turn/slack-turn-fiber.ts重复投递被startFiber直接拒绝快照检查点Fiber 运行中持续fiber.stash(snapshot)写入阶段快照字段包括phaseaccepted → running → progress → answered → completed、threadKey、turnId、progressMessageTs、terminalProposal等崩溃恢复如果 DO 实例在部署、重启中被重置onFiberRecovered会读取最后一个快照——已回复则直接标记完成卡在有终稿待发送则补发否则带着recoveredTurn上下文再尝试一次MAX_SLACK_TURN_RECOVERY_ATTEMPTS 1超过上限则安全收尾并上报。这套机制让部署瞬间正好卡在长回合中间这种最尴尬的时序问题变得可自愈。五、第三层防线DO SQL 本地存储与重置容错DO 自带 SQLiteDO SQLCompany Brain 把回合记录、审批状态、chime 预算、rollout 游标、团队邀请进度等高频写、按组织隔离的状态全部放在 DO 本地表里约定brain_*前缀清单见 docs/agent.md避免每次回合都打远端数据库。平台级重置代码更新导致的 DO reset、内存超限 OOM在 src/brain/tools/mcp/errors.ts 被精细区分重置类型判定策略代码更新重置isDurableObjectCodeUpdateReset视为平台方原因原样重试存储内部错误重置正则匹配 reset 报错同上可重试内存超限 OOMisDurableObjectMemoryLimitReset禁止原样重试必然再 OOM提示缩小单次数据量把平台重置和程序写爆内存区分开再决定重试策略是高并发长任务运行时非常实用的一课。六、定时任务DO Alarm 让大脑睡了也醒DO 的 schedule/alarm 能力承担了大量延迟与定时工作自动研究的即时入队schedule(0, ...)让 HTTP 立即返回、审批卡片到期自动收起、团队邀请逐人 DM每个 tick 发一条天然限速、频道观察循环、turn 结束后的延迟反思等。所有回调都定义在 src/brain/turn/agent.ts 的薄壳上runAutoResearch甚至会主动拒绝已退役的 cron 型调度并取消它——防御性编程贯穿始终。七、新手上手本地开发与部署要点本地开发只需三步详见 README.md 的 Local development 一节bun install→ 复制.dev.vars填入两个 API Key →bun run dev免费计划即可跑通全部核心功能开启 Workers Paid 后wrangler.jsonc 里注释掉的 containers 块可以解锁内置容器沙箱shell、git、Python迁移由 scripts/bundle-migrations.ts 打包进 Worker首个请求自动应用无需独立数据库服务。八、小结三层防线各司其职层级机制解决的问题Worker 路由层HMAC 验签 BRAIN_KV幂等键 回合锁Slack 重发、多事件类型竞速DO 实例层每组织单例串行 waitUntil异步化同组织写冲突、响应超时Fiber 层幂等键 快照检查点 一次恢复尝试部署/崩溃打断长回合配合 DO SQL 本地状态与精细的重置分类Company Brain 用纯无服务器组件就构建出了一个事件不丢、回合不断、状态自愈的高并发 Slack Agent 运行时。想继续深挖推荐按 docs/architecture.md → docs/agent.md → docs/slack.md 的顺序阅读源码锚点均已标注。【免费下载链接】company-brainOpen-sourcing our company brain - A teammate in your Slack that remembers everything your team says, and can go do the work.项目地址: https://gitcode.com/gh_mirrors/co/company-brain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考