Coordinate IM 系统 - 企业即时通讯解决方案
⚡ 高性能 · 安全可靠 · 完全自主可控
🚀 产品简介
Coordinate 是一款从零自主研发的企业级即时通讯系统,采用 Rust 语言构建,具备高性能、高可靠、低资源占用的特性。系统包含服务端、桌面客户端和管理后台三大核心组件,为企业提供一站式通讯解决方案。
核心理念
- 安全优先:服务端统一管控订阅权限,客户端仅保留基础连接权限
- 性能至上:自研 MQTT 广播引擎,毫秒级消息延迟,支持万级并发
- 统一技术栈:前后端均采用 Rust,消除技术栈碎片化
📦 核心组件
| 组件 | 技术栈 | 说明 |
|---|
| coordinate-server | Rust + Axum + PostgreSQL | HTTP API 服务,处理用户/团队/频道/帖子/文件等核心业务逻辑 |
| coordinate-broadcast | Rust + MQTT 协议 | 实时消息广播引擎,支持 WebSocket 连接与分布式 pub/sub |
| coordinate-desktop | Rust + GPUI | 跨平台桌面客户端,Rocket.Chat 风格 UI |
| coordinate-sdk | Rust | 多语言客户端 SDK,一次开发多端接入 |
| coordinate-connector | Rust | MQTT 协议实现模块 |
| coordinate-core | Rust | 共享类型与模型定义 |
| 管理后台 | Web 管理界面 | 用户管理、权限配置、系统监控、日志分析 |
✨ 核心特性
1. 🚄 高性能消息分发
- 基于 rumqttd 二次开发的广播组件
- 支持 万级并发连接(rumqttd 官方压测数据:10,000+)
- 消息端到端延迟 < 50ms
- 消息持久化与历史回溯
- 主题格式:
users/{user_id}、channels/{channel_id}、teams/{team_id}
2. 🛡️ 智能安全订阅
- 服务端统一管控订阅权限,权限精细化隔离
- 客户端仅保留 CONNECT / DISCONNECT / PING 权限
- PUBLISH / SUBSCRIBE / UNSUBSCRIBE 由服务端 MQTT 客户端代理
- 支持批量订阅/退订与清空订阅
- 零数据库依赖:广播服务不直连数据库,通过 MQTT 客户端接收指令
3. 💻 卓越桌面体验
- 采用 GPUI 框架开发(Zed 编辑器同款),原生性能
- Rocket.Chat 风格 UI 设计,三栏布局:
- 左侧:工作区/服务器切换栏
- 中侧:频道/讨论组/私聊列表
- 右侧:主聊天区域
- 流畅的滚动体验与响应式界面
- 支持 中英文双语界面(rust-i18n)
- 用户头像支持在线/离线状态指示
4. 💬 完整通讯功能
| 功能 | 描述 |
|---|
| 频道 (Channel) | 公开/私有频道,支持成员管理 ✅ |
| 私聊 (DM) | 一对一即时消息 ✅ |
| 消息线程 (Thread) | 消息回复链,支持引用 ✅ |
| 文件传输 | 上传/下载/分享文件 ✅ |
| Markdown | 消息富文本格式支持 ✅ |
| @提及 | 消息中 @用户提醒 ✅ |
| 机器人 (Bot) | 服务端支持管理,客户端接入 ⏳ 规划中 |
5. 🏢 企业级权限体系
- 基于 角色 (Role) 的权限控制模型
- 团队 (Team):工作区级别隔离
- 频道成员精细化管理
🛠 技术架构
flowchart LR
subgraph Desktop [桌面客户端 coordinate-desktop]
D[Rust + GPUI<br/>960x680 双线程]
end
subgraph Server [coordinate-server]
S_HTTP[HTTP :8065<br/>业务逻辑]
S_MQTT[MQTT 客户端<br/>→ broadcast]
end
subgraph Broadcast [coordinate-broadcast]
B_WS[WebSocket :8000]
B_RPC[RPC :8066]
B_RPC ---> B_WS
end
DB[(PostgreSQL<br/>+ Redis)]
D -->|HTTP :8065| S_HTTP
D -->|WS :8000| B_WS
S_MQTT -.->|MQTT| B_RPC
S_HTTP --> DB
关键端口
| 端口 | 服务 | 说明 |
|---|
| 8065 | coordinate-server | HTTP REST API(桌面客户端调用) |
| 8000 | coordinate-broadcast | WebSocket(桌面客户端实时消息) |
| 8066 | coordinate-broadcast | MQTT 控制接口(服务端订阅管理) |
| 6379 | Redis | 缓存与会话存储 |
| 5432 | PostgreSQL | 持久化数据存储 |
主题订阅格式
users/{user_id}
channels/{channel_id}
teams/{team_id}
📊 数据模型
用户模型
- 用户信息与头像
- 在线状态管理(在线/离线/忙碌/离开/自定义)
- 用户偏好设置 (Preference)
通讯模型
- Team:团队/工作区,顶级组织单元 ✅
- Channel:公开或私有频道 ✅
- Thread:消息线程,消息 Reply 链 ✅
- Post:消息主体 ✅
- Direct Message:一对一私聊 ✅
- FileInfo:文件元数据 ✅
🎯 适用场景
| 场景 | 说明 |
|---|
| 🏢 企业内通 | 内部协作、通知公告、文件共享 |
| 👥 团队协作 | 项目沟通、任务协调、知识沉淀 |
| 💬 客服系统 | 客户咨询、工单流转、满意度评价 |
| 📡 物联网 | 设备状态推送、告警通知、远程控制 |
| 🔄 分布式通知 | 系统事件推送、服务间通信 |
🏆 技术优势
| 优势 | 说明 |
|---|
| ⚡ Rust 语言 | 内存安全,无 GC 停顿,极致性能 |
| 🔧 自研协议 | 不依赖 Kafka/RabbitMQ,降低运维复杂度 |
| 🔗 统一技术栈 | 前后端同源 Rust,减少技术栈维护成本 |
| 📈 弹性扩展 | 广播服务无状态,支持水平扩容 |
| 🔒 安全架构 | 服务端集中权限管控,安全边界清晰 |
| 💾 低资源占用 | 二进制部署,内存占用 < 100MB |
性能指标
| 指标 | 数值 |
|---|
| 单机并发连接 | 10,000+ (rumqttd 官方压测) |
| 消息吞吐量 | 100,000 msg/s |
| 端到端延迟 | < 50ms |
| 内存占用 | < 100MB |
| 启动时间 | < 2s |
🔐 安全特性
- 权限收敛:客户端无 PUBLISH/SUBSCRIBE 权限,由服务端代理
- MQTT 鉴权:内部 MQTT 客户端使用静态密钥
- WebSocket 认证:连接时携带 token 认证
- 数据隔离:Team 级别数据完全隔离
- 无外部依赖:广播服务不直连数据库,缩小攻击面
🔧 快速开始
环境要求
- Rust 1.70+
- PostgreSQL 14+
- Redis 7+
服务端启动
docker run --name redis -d -p 6379:6379 redis
cargo run --bin coordinate-broadcast --release -- -c mqtt.toml -v
cargo run --bin coordinate-server -- serve -c config.toml
cd migrations && refinery migrate
桌面客户端
cargo build --release
cargo run
export COORDINATE_ENDPOINT=http://localhost:8065
export LOCAL_DIR=./data
RUST_LOG=debug cargo run
API 验证
curl http://localhost:8065/health
ws://localhost:8000
📁 项目结构
coordinate/ # IM 服务端
├── coordinate-server/ # API 服务 (Axum)
├── coordinate-broadcast/ # 消息广播 (MQTT + WebSocket)
├── coordinate-desktop/ # 桌面客户端 (Rust + GPUI)
├── coordinate-sdk/ # 客户端 SDK
├── coordinate-connector/ # MQTT 协议实现
├── coordinate-core/ # 共享类型
└── migrations/ # 数据库迁移 (refinery)
coordinate-desktop/ # 桌面端
├── src/ # GPUI 源码
├── locales/ # 国际化资源
└── data/ # 本地数据存储
frontend/ # 管理端前端
├── src/ # 前端源码
└── public/ # 静态资源
🗺️ 发展规划
📮 联系我们
Built with Rust 🦀 | Performance by Design | Security by Default