项目地址
https://github.com/job520/im
整体架构
角色 | 机器数量 | 功能 |
---|---|---|
http 服务器 | 多台 | 处理注册/登录、文件上传等业务 |
websocket 服务器 + rpc 客户端(与 rpc 服务端保持长链接) | 多台 | 处理聊天业务 |
tcp-socket 服务器 + rpc 客户端(与 rpc 服务端保持长链接) | 多台 | 处理聊天业务 |
rpc 服务器(与 rpc 客户端保持长链接) | 1台 | 处理消息转发业务 |
redis 状态管理服务器 | 1台+ | 管理用户 & websocket / tcp-socket 服务器的在线状态 |
mongodb | 1台+ | 存储用户信息、离线消息等 |
etcd 服务发现与负载均衡服务器 | 1台+ | 服务注册/发现 & 负载均衡 |
设计图
项目架构图
流程图
技术细节
gin - 处理注册/登录、图片上传、选择可用的 websocket / tcp-socket 服务器等业务
websocket 服务器 + rpc 客户端 - 在线消息转发
rpc 服务器,处理 websocket / tcp-socket 服务器之间的转发业务
tcp-socket 服务器 + rpc 客户端 - 在线消息转发
etcd:服务注册与发现,websocket / tcp-socket 服务器负载均衡
redis:用户在线状态管理 && 记录在线用户与 websocket / tcp-socket 服务器的映射关系
mongodb:存储用户信息、用户离线消息等
不丢消息(ACK 机制)
不重复(消息添加全局唯一递增 ID)
不乱序(1.消息添加全局唯一递增 ID,客户端记录 lastID;2.上线时先推送离线消息,再将用户状态改为 online)
消息安全性(user_relations 表保存 userA 和 userB 之间的 AES 密钥)
离线消息存储(msg_type:消息类型(chat/ack)、to_user_id:接收消息的用户ID、has_read:是否已读)
防止离线消息重复推送(UPDATE
im_offline
SET has_read = true WHERE id = ${msg_id} AND has_read = false)使用 etcd 制作配置中心
接入 zipkin(链路追踪)
文档更新时间: 2024-04-20 10:57 作者:lee