18 KiB
18 KiB
Tinode IM 功能详解
本文档全面介绍 Tinode 即时通讯平台的功能特性,帮助理解产品能力和使用场景。
目录
产品概述
什么是 Tinode
Tinode 是一个开源的即时通讯平台,提供完整的 IM 基础设施:
| 特性 | 说明 |
|---|---|
| 开源免费 | GPL 3.0 许可证,代码完全开源 |
| 跨平台 | 支持 Android、iOS、Web 三端 |
| 多协议 | WebSocket、gRPC、长轮询 |
| 多数据库 | MySQL、PostgreSQL、MongoDB、RethinkDB |
| 高并发 | 支持数万并发连接 |
| 可扩展 | 支持集群部署、插件系统 |
核心架构
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Android │ │ iOS │ │ Web │ │
│ │ Tindroid │ │ Tinodious│ │TinodeWeb │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼─────────────┼─────────────┼─────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ 协议层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │WebSocket │ │ gRPC │ │Long Poll │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼─────────────┼─────────────┼─────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ 服务端 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Hub │ │ Topic │ │ Session │ │ Auth │ │
│ │ 连接中心 │ │ 消息路由 │ │ 会话管理 │ │ 认证模块 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 存储层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ MySQL │ │PostgreSQL│ │ MongoDB │ │ RethinkDB│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
核心功能
1. 消息收发
基本特性
| 功能 | 说明 |
|---|---|
| 实时消息 | WebSocket 实时推送,毫秒级延迟 |
| 离线消息 | 用户上线自动推送离线期间的消息 |
| 消息回执 | 已发送、已送达、已读取三种状态 |
| 消息撤回 | 支持撤回已发送的消息 |
| 消息引用 | 回复特定消息,形成对话链 |
| 消息转发 | 转发消息到其他会话 |
消息状态流转
发送 → 已发送(sent) → 已送达(delivered) → 已读取(read)
│ │ │
│ │ └── 接收方打开会话
│ │
│ └── 接收方客户端收到
│
└── 服务器确认接收
2. 消息类型
文本消息
- 纯文本消息
- 富文本消息(Drafty 格式)
- 支持@提及功能
- 支持表情符号
多媒体消息
| 类型 | 格式支持 | 说明 |
|---|---|---|
| 图片 | JPEG, PNG, GIF, WebP | 自动生成缩略图 |
| 视频 | MP4, MOV, WebM | 支持视频预览 |
| 音频 | MP3, AAC, OGG | 语音消息支持 |
| 文件 | 任意格式 | 文档、压缩包等 |
特殊消息
| 类型 | 说明 |
|---|---|
| 位置 | 地理位置分享 |
| 名片 | 用户名片分享 |
| 链接预览 | 自动抓取网页标题、描述、图片 |
3. 输入状态
实时显示对方输入状态:
| 状态 | 说明 |
|---|---|
kp |
正在输入文字 |
kpa |
正在录制语音 |
kpv |
正在录制视频 |
会话类型
1. 单聊(P2P)
两个用户之间的私密对话:
| 特性 | 说明 |
|---|---|
| 自动创建 | 首次发消息自动创建会话 |
| 双向同步 | 双方看到不同的会话名(对方用户ID) |
| 加密存储 | 消息加密存储在数据库 |
| 阅后即焚 | 支持(需客户端实现) |
2. 群聊(Group)
多用户之间的群组对话:
| 特性 | 说明 |
|---|---|
| 创建群组 | 任意用户可创建群组 |
| 成员上限 | 默认支持数百人(可配置) |
| 权限管理 | 所有者、管理员、普通成员 |
| 邀请加入 | 成员可邀请新成员 |
| 踢出成员 | 管理员可踢出成员 |
| 退出群组 | 成员可主动退出 |
群组角色
| 角色 | 权限 |
|---|---|
| 所有者(Owner) | 全部权限,可转让所有者 |
| 管理员(Admin) | 管理成员、修改群信息 |
| 普通成员(Member) | 发送消息、查看成员 |
3. 频道(Channel)
单向广播式群组:
| 特性 | 普通群组 | 频道 |
|---|---|---|
| 订阅者数量 | 有限制 | 无限制(只读) |
| 消息发送者 | 所有成员 | 仅管理员 |
| 加入通知 | 有 | 无 |
| 消息来源 | 显示发送者 | 不显示 |
| 用途 | 团队协作 | 内容分发 |
4. 系统消息(sys)
与系统管理员通信的通道:
- 普通用户可向系统发送消息(如举报)
- root 用户可订阅并查看所有消息
- 用于客服、举报等场景
用户体系
1. 用户属性
| 属性 | 说明 |
|---|---|
username |
登录名(唯一,用于 basic 认证) |
public |
公开资料(昵称、头像、简介) |
private |
私有数据(仅自己可见) |
trusted |
可信标记(由系统设置) |
tags |
发现标签(用于搜索) |
2. 用户状态
| 状态 | 说明 |
|---|---|
ok |
正常状态 |
susp |
暂停状态(禁止访问,可恢复) |
del |
已删除状态(软删除) |
3. 认证方式
| 方式 | 说明 |
|---|---|
| Basic | 用户名 + 密码 |
| Token | 加密令牌(主要方式) |
| Anonymous | 匿名登录(仅创建账户) |
| REST | 外部认证系统集成 |
4. 多设备登录
- 支持同一用户多设备同时在线
- 每个设备独立会话
- 消息同步到所有设备
- 设备标识(User Agent)区分
群组功能
1. 群组管理
创建群组
{sub topic="new"} → 创建普通群组
{sub topic="nch"} → 创建频道
群组信息
| 信息 | 说明 |
|---|---|
| 名称 | 群组名称 |
| 头像 | 群组图标 |
| 简介 | 群组描述 |
| 标签 | 发现标签 |
2. 成员管理
邀请加入
发送者: {set topic="grpXXX" sub={user="usrYYY", mode="JRWS"}}
接收者: {pres what="acs"} → 收到邀请通知
权限控制
| 权限 | 说明 |
|---|---|
J |
加入权限(订阅话题) |
R |
读取权限(接收消息) |
W |
写入权限(发送消息) |
P |
在线状态(查看成员状态) |
A |
管理权限(审批、踢人) |
S |
分享权限(邀请他人) |
D |
删除权限(硬删除消息) |
O |
所有者(完全控制) |
3. 群组操作
| 操作 | 说明 |
|---|---|
| 修改群名 | 所有者权限 |
| 修改群头像 | 所有者权限 |
| 修改群公告 | 管理员权限 |
| 设置管理员 | 所有者权限 |
| 踢出成员 | 管理员权限 |
| 解散群组 | 所有者权限 |
文件传输
1. 上传方式
带外上传(推荐)
大文件通过 HTTP POST 单独上传:
POST /v0/file/u
Content-Type: multipart/form-data
响应: {ctrl: {params: {url: "/v0/file/s/xxx.jpg"}}}
消息引用
{
"pub": {
"head": {"mime": "text/x-drafty"},
"content": {"ent": [{"data": {"ref": "/v0/file/s/xxx.jpg"}}]}
},
"extra": {"attachments": ["/v0/file/s/xxx.jpg"]}
}
2. 存储方式
| 方式 | 说明 |
|---|---|
| 本地文件系统 | 适用于单机部署 |
| AWS S3 | 适用于云端部署 |
| 自定义存储 | 实现 media 接口即可 |
3. 文件限制
| 配置项 | 说明 |
|---|---|
max_file_size |
最大文件大小 |
allowed_mime_types |
允许的 MIME 类型 |
upload_timeout |
上传超时时间 |
推送通知
1. 支持平台
| 平台 | 推送服务 |
|---|---|
| Android | Firebase Cloud Messaging (FCM) |
| iOS | FCM / APNs |
| Web | Web Push API |
2. 推送内容
{
"topic": "grpXXX",
"xfrom": "usrYYY",
"ts": "2024-01-01T00:00:00Z",
"seq": "123",
"mime": "text/x-drafty",
"content": "消息内容..."
}
3. 推送策略
| 状态 | 推送行为 |
|---|---|
| 前台运行 | 不推送,实时接收 |
| 后台运行 | 推送通知 |
| 离线 | 推送通知,上线后同步 |
4. 设备管理
- 每个设备注册唯一
dev_id - 支持多设备推送
- 支持设备解绑
视频通话
1. 基本流程
┌─────────────────────────────────────────────────────────────┐
│ 呼叫建立 │
│ │
│ 呼叫方 服务端 被叫方 │
│ │ │ │ │
│ │──── {note what="call"} ─┼───── {info what="call"} ────>│
│ │ │ │ │
│ │ │<──── {note what="call"} ─────│ 接听
│ │ │ │ │
│ │<───── {info what="call"} ──────────────────────────────│
│ │ │ │ │
│ │<════════════════════ WebRTC Signaling ════════════════>│
│ │ │ │ │
│ │<═══════════════════════ Media Stream ═════════════════>│
│ │ │ │ │
└─────────────────────────────────────────────────────────────┘
2. 通话类型
| 类型 | 说明 |
|---|---|
| 音频通话 | 纯语音通话 |
| 视频通话 | 音视频通话 |
| 屏幕共享 | 共享屏幕内容 |
3. 信令流程
- 发起呼叫:
{note what="call", seq=...} - 接听/拒绝:
{note what="call", seq=...} - 挂断:
{note what="call", seq=...} - WebRTC 信令: 通过
{note what="data", content=...}传递
安全机制
1. 传输安全
| 层面 | 措施 |
|---|---|
| 传输加密 | TLS/HTTPS/WSS |
| API 鉴权 | API Key 验证 |
| 防篡改 | HMAC 签名 |
2. 认证安全
| 措施 | 说明 |
|---|---|
| Token 加密 | 令牌使用 AES 加密 |
| Token 过期 | 可配置过期时间 |
| 密码哈希 | bcrypt 存储密码 |
3. 访问控制
权限矩阵
实际权限 = want AND given
| 操作 | 权限要求 |
|---|---|
| 发送消息 | W |
| 接收消息 | R |
| 查看成员 | P |
| 邀请成员 | S |
| 管理成员 | A |
| 删除消息 | D |
| 管理群组 | O |
4. 数据安全
| 功能 | 说明 |
|---|---|
| 软删除 | 消息标记删除,保留数据 |
| 硬删除 | 物理删除消息(需 D 权限) |
| 消息清理 | 自动清理过期消息 |
扩展能力
1. 插件系统
通过 gRPC Plugin API 开发插件:
service Plugin {
rpc Firehose(stream PluginReq) returns (stream PluginResp);
}
插件事件
| 事件 | 说明 |
|---|---|
Account creation |
账户创建 |
Message publish |
消息发布 |
Subscription |
订阅事件 |
Topic creation |
话题创建 |
2. 聊天机器人
示例:chatbot 插件
# 监听新用户创建
# 自动发送欢迎消息
# 回复用户消息
3. 自定义认证
集成外部认证系统:
┌─────────────┐ REST API ┌─────────────┐
│ Tinode │ ───────────────> │ External │
│ Server │ │ Auth │
│ │ <─────────────── │ Server │
└─────────────┘ JSON Resp └─────────────┘
4. 数据库适配
实现 db.Adapter 接口即可支持新数据库:
type Adapter interface {
Open(config string) error
Close() error
UserGet(uid string) (*User, error)
MessageSave(msg *Message) error
// ...
}
应用场景
1. 社交应用
| 功能 | 实现方式 |
|---|---|
| 私信 | P2P 话题 |
| 群聊 | 群组话题 |
| 发现用户 | fnd 话题 + tags |
| 用户资料 | me 话题 + public |
2. 企业办公
| 功能 | 实现方式 |
|---|---|
| 部门群组 | 群组话题 |
| 公司公告 | 频道话题 |
| 文件共享 | 带外文件 + 消息引用 |
| 视频会议 | WebRTC 视频通话 |
3. 客服系统
| 功能 | 实现方式 |
|---|---|
| 匿名咨询 | anonymous 认证 |
| 客服工号 | sys 话题 |
| 消息记录 | 历史消息查询 |
| 机器人客服 | chatbot 插件 |
4. IoT 通知
| 功能 | 实现方式 |
|---|---|
| 设备告警 | 群组话题 |
| 远程控制 | 自定义消息格式 |
| 数据上报 | 消息 content 字段 |
功能对比
与其他 IM 方案对比
| 功能 | Tinode | 自建 WebSocket | 第三方 SDK |
|---|---|---|---|
| 开源免费 | ✅ | ✅ | ❌ |
| 多端支持 | ✅ | 需自建 | ✅ |
| 消息存储 | ✅ | 需自建 | ✅ |
| 离线推送 | ✅ | 需自建 | ✅ |
| 群组功能 | ✅ | 需自建 | ✅ |
| 视频通话 | ✅ | 需自建 | ✅ |
| 自定义认证 | ✅ | 完全自主 | 受限 |
| 数据私有 | ✅ | ✅ | ❌ |
| 部署难度 | 中等 | 高 | 低 |
快速体验
1. Docker 部署
# 启动 MySQL 版本
docker run -d -p 6060:18080 \
--name tinode-server \
tinode/tinode-mysql:latest
# 访问 Web 客户端
open http://localhost:6060
2. 默认账户
使用 tinode-db 工具初始化测试数据:
| 用户名 | 密码 | 说明 |
|---|---|---|
| alice | alice123 | 测试用户 |
| bob | bob123 | 测试用户 |
| carol | carol123 | 测试用户 |
| dave | dave123 | 测试用户 |
| tino | tino123 | 聊天机器人 |
3. API 测试
# 使用 tn-cli 测试
cd tn-cli
pip install -r requirements.txt
python tn-cli.py --login-basic=alice:alice123
客户端下载
| 平台 | 仓库 | 说明 |
|---|---|---|
| Web | github.com/tinode/webapp | React SPA |
| Android | github.com/tinode/tindroid | 原生应用 |
| iOS | github.com/tinode/tinodious | Swift 原生 |