把即时通讯搬上全球边缘:深度拆解 Edgechat —— 基于 Cloudflare Workers + WebSocket 的边缘聊天室(多模态/Telegram 双向网桥/零服务器实战)
自建一个轻量级、无广告、端到端可控的即时聊天室,是无数开发者和极客社群的共同需求。
然而,传统的即时通讯方案(如 Matrix / Synapse、Rocket.Chat 或 Mattermost)普遍重度依赖笨重的后端架构:常驻数个容器、占用数 GB 内存、需要专门运维 PostgreSQL 或 Redis,且面对全球各地的跨国访客时,单一中心节点的网络延迟往往令人抓狂。
近期在开源社区备受关注的 Edgechat(GitHub: aozorae/Edgechat),带来了一个极其轻巧优雅的边缘计算范式:整个聊天室系统 100% 跑在 Cloudflare Workers 全球边缘网络上,无需购买任何服务器。它不仅支持实时文本、语音和多媒体图片收发,更原生打通了 Telegram 双向实时消息网桥(Two-Way Telegram Bridge) —— 聊天室群组的消息与 Telegram 群组无缝双向互通!
本文将为你深度剖析 Edgechat 的 Durable Objects 广播机制、Telegram Webhook 双向流转拓扑以及一键部署落地全景。
1. 为什么 Edgechat 让人耳目一新?
我们先看 Edgechat 与传统自建 IM 系统的架构比对:
| 维度 | 传统自建 IM (Rocket.Chat / Matrix) | 传统基于 Node.js/Socket.io 的 VPS 应用 | Edgechat (Cloudflare Edge 原生) |
|---|---|---|---|
| 服务器常驻开销 | 极高(需 2G~4G 内存 VPS,长期耗费月租) | 中等(需 512MB~1G VPS 常驻运行) | 零成本(Serverless 纯按需执行,无需机器) |
| 全球接入延迟 | 取决于单一主机机房地理位置 | 取决于单一主机机房地理位置 | 全球 Anycast 骨干网,就近边缘毫秒级握手 |
| 高并发广播机制 | 依赖 Redis Pub/Sub 与消息队列 | 依赖单进程内存或单机轮询 | 基于 Cloudflare Durable Objects 分布式单例 |
| 外部生态联动 | 需额外编写复杂的 Bot 插件 | 需自行写 Telegram API 胶水代码 | 开箱即用原生 Telegram 双向网桥 |
| 数据持久化 | 复杂的大型 SQL 集群与文件存储 | 本地文件或 MySQL | 基于 Cloudflare D1 (SQLite) + R2 对象存储 |
2. 核心架构拆解:DO 广播中心与 Telegram 双向网桥
Edgechat 能够实现全双工长连接与外部社交平台联通的关键,在于其对 Durable Objects(DO)有状态长连接 与 Telegram Bot API 的巧妙融合。
flowchart TD
subgraph Web_Clients ["Web 网页端访客 (全球各地浏览器)"]
UserA["用户 A (香港 POP)"]
UserB["用户 B (法兰克福 POP)"]
UserC["用户 C (旧金山 POP)"]
end
subgraph CF_Workers_Edge ["Cloudflare 全球边缘网络"]
EdgeRouter["Worker 入口路由器 (index.ts)"]
ChatDO["Durable Object (RoomSession 房间单例广播器)"]
D1DB[("Cloudflare D1 数据库\n存储用户身份/房间设置/消息归档")]
R2Storage[("Cloudflare R2 存储\n语音音频 / 聊天图片附件")]
end
subgraph Telegram_Ecosystem ["Telegram 官方云端生态"]
TGBot["Telegram Bot Gateway"]
TGGroup["Telegram 社群群组 (群成员实时互动)"]
end
UserA -->|"WebSocket 握手"| EdgeRouter
UserB -->|"WebSocket 握手"| EdgeRouter
UserC -->|"WebSocket 握手"| EdgeRouter
EdgeRouter --> ChatDO
ChatDO --> D1DB
ChatDO --> R2Storage
ChatDO -->|"发送外部 HTTP Post (Bot API)"| TGBot
TGBot --> TGGroup
TGGroup -->|"成员回复发言"| TGBot
TGBot -->|"Webhook 回调"| EdgeRouter
EdgeRouter -->|"转入房间广播"| ChatDO
ChatDO -->|"WebSocket 实时推送"| UserA
ChatDO -->|"WebSocket 实时推送"| UserB
ChatDO -->|"WebSocket 实时推送"| UserC
2.1 Durable Objects:告别传统 Redis Pub/Sub
在常规无状态云函数中,长连接很难处理房间广播。Edgechat 为每个聊天房间分配一个唯一的 Durable Object ID:
- 所有进入该房间的 Web 用户,其 WebSocket 连接均被汇聚托管至同一个 DO 单例中;
- 某个用户发送一条消息后,DO 在内存中执行
webSocket.send()毫秒级扇出推送到该房间所有在线连接,广播延迟仅在 10~30 毫秒 之间; - 历史消息以轻量批处理形式异步写入 Cloudflare D1(SQLite),实现快速的历史漫游加载。
2.2 Telegram 双向实时网桥(Bidirectional Bridge)
这是 Edgechat 最具杀伤力的特性:
- Web 端到 Telegram:网页端访客发送文本或上传图片时,Durable Object 异步触发 Telegram Bot API(
sendMessage/sendPhoto),将网页消息实时同步推送到绑定的 Telegram 频道或群组; - Telegram 到 Web 端:在 Telegram 群内的成员回复或讨论时,Telegram 服务器通过 Webhook 实时回调 Cloudflare Worker 入口,Worker 立即定位到对应房间的 Durable Object 并向所有网页在线访客广播,真正实现了“跨平台、跨客户端的一体化无缝交流”。
3. 极速实操部署指南
3.1 一键部署到 Cloudflare
Edgechat 完美契合 Wrangler 工具链,仅需简单几步即可完成全站上线:
# 1. 克隆项目仓库
git clone https://github.com/aozorae/Edgechat.git
cd Edgechat
npm install
# 2. 创建关联的 D1 数据库与 R2 存储桶
npx wrangler d1 create edgechat-db
npx wrangler r2 bucket create edgechat-assets
# 3. 配置 wrangler.jsonc 并填入 Telegram Bot Token 与 Chat ID
npx wrangler secret put TELEGRAM_BOT_TOKEN
npx wrangler secret put TELEGRAM_CHAT_ID
# 4. 执行数据库迁移并部署
npm run db:migrate
npm run deploy
部署完成后,将终端输出的 Worker 域名填入 Telegram Webhook:
curl -F "url=https://your-chat.yourdomain.workers.dev/api/tg/webhook" \
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/setWebhook
至此,一个全球分布式的现代化多模态聊天室便彻底搭建完成。
4. 生产避坑与安全加固
[!WARNING]
1. 防止匿名刷屏与恶意上传
开放公网的匿名聊天室极易遭遇网络机器人狂刷垃圾广告。避坑建议:在后台开启 Cloudflare Turnstile 人机验证,同时在 R2 上传接口限制文件大小(例如单张图片不超过 5MB),并配置 IP 维度的速率限制(Rate Limiting)。
[!TIP]
2. WebSocket 心跳保活
移动端浏览器切入后台后极易被系统休眠网络。Edgechat 客户端内置了自动心跳探针(每 25 秒发送一次 Ping 包),并在网络唤醒瞬间触发指数退避重连,确保用户在切屏后不会丢失历史讨论上下文。
5. 总结
aozorae/Edgechat 充分展现了现代 Serverless 架构在长连接即时通讯领域的强大潜力。它免除了服务器配置与运维的心智包袱,以几乎零成本的方式为个人博主、技术社群和出海产品提供了一个高度可定制的交流阵地。
- GitHub 仓库:aozorae/Edgechat