腾讯云 IM 是企业级消息服务的重要基础设施,广泛用于微信生态、企业微信、QQ、游戏、客服系统等场景。
本篇将带你从底层协议到消息分发,手写一个具备“消息收发 + 心跳保持 + 群聊支持 + 离线重发”能力的 Web IM 系统,深入理解腾讯 IM 背后的架构精髓。
🧠 一、IM 系统的核心能力有哪些?
| 模块 | 功能说明 |
|---|---|
| 连接保持 | WebSocket 实现长连接与心跳 |
| 消息收发 | 实时点对点 / 群组消息 |
| 离线补发 | 用户断线后消息保留与重发 |
| 多端同步 | Web / Mobile 状态统一 |
| 消息协议 | 自定义消息结构(文本、系统、事件等) |
| 通信安全 | 签名认证 / 黑名单控制 / 鉴权策略 |
🏗️ 二、腾讯云 IM 简化架构图
Client(Web/Mobile)
↓ WebSocket
[IM网关服务器]
↓
[消息路由系统]
↓
[离线消息中心]
↓
[存储系统 + 业务系统回调]
⚙️ 三、实战:用 Node.js + WebSocket 构建简化版 IM 系统
我们用 WebSocket 实现基础消息收发,搭配 Redis 存储离线消息。
1. 安装依赖
npm install ws express redis
2. 搭建 WebSocket 服务(简化 IM Server)
const WebSocket = require('ws')
const redis = require('redis')
const wss = new WebSocket.Server({ port: 8080 })
const clients = new Map()
const redisClient = redis.createClient()
wss.on('connection', function connection(ws, req) {
ws.on('message', async function incoming(message) {
const data = JSON.parse(message)
const { type, from, to, content } = data
if (type === 'bind') {
clients.set(from, ws)
} else if (type === 'message') {
const receiver = clients.get(to)
const msg = JSON.stringify({ from, content })
if (receiver) {
receiver.send(msg)
} else {
await redisClient.rpushAsync(`offline:${to}`, msg) // 离线存储
}
}
})
ws.on('close', () => {
for (let [uid, socket] of clients.entries()) {
if (socket === ws) clients.delete(uid)
}
})
})
3. 客户端模拟(HTML 示例)
<script>
const ws = new WebSocket("ws://localhost:8080")
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'bind', from: 'u001' }))
}
ws.onmessage = (e) => {
const msg = JSON.parse(e.data)
console.log("收到消息:", msg)
}
function sendMsg(to, content) {
ws.send(JSON.stringify({ type: 'message', from: 'u001', to, content }))
}
</script>
🔁 四、离线消息重发机制
// 用户上线后执行
async function resendOfflineMessages(userId, socket) {
const msgs = await redisClient.lrangeAsync(`offline:${userId}`, 0, -1)
msgs.forEach(msg => socket.send(msg))
await redisClient.del(`offline:${userId}`)
}
🔐 五、腾讯云 IM 的专业特性(可逐步拓展)
| 模块 | 描述 |
|---|---|
| 消息签名机制 | 每条消息通过 server 校验 token |
| 会话同步机制 | 多端接入、消息已读/撤回状态同步 |
| 多媒体支持 | 音频/视频/图文消息协议封装 |
| SDK 封装 | 各端统一接口封装,提供统一调用体验 |
| 群组架构 | 群主 / 管理员权限,@消息、高优先级广播等 |
✍️ 六、总结与思考
- 腾讯云 IM 的核心亮点在于可靠性 + 多端一致性 + 开发者友好
- 本文实现了从 0 开始构建“绑定登录 → 消息发送 → 离线转存 → 上线重发”的完整流程
- 小团队可从此模型延伸出客服、社交、游戏等场景所需的自定义 IM 能力
🎁 拓展阅读推荐
- 腾讯云 IM 架构演进与挑战(官方)
- WebSocket 协议细节深入解析
- 腾讯开源:TUIKit、TIM SDK 示例仓库