这是一个尝试从0开始探索的IM项目,也不确定这个项目是否能够成功完成,目前处于一步一步探索中。预计想要实现的功能:私聊、群聊、音频、推流视频。 项目。
- Mysql
- MongoDB
- Redis
- Zookeeper
- Rabbitmq
- Gateway 网关层
- Connect 连接层
- Logic 逻辑层
- Message 消息中心
- Websocket
- Tcp
- Protobuff
个人相关
- 登录
- 退出登录
- 获取个人信息
- 修改个人信息
- 获取陌生人信息
- 获取当前账号目前在线设备列表
好友/私聊相关
- 获取好友列表
- 获取好友信息
- 发起好友申请
- 处理好友申请
- 删除好友
- 获取私聊消息记录列表
- 私聊消息撤回
个人相关
- 当前账号其他设备登录/离线事件
好友/私聊相关
- 推送私聊消息事件
- 私聊消息送达事件
- 私聊消息已读事件
- 收到好友申请事件
- 收到好友新增/删除事件
- 好友上线/离线事件
用户1和用户2之间在redis中维护一个叫 private_msg:1:2
的自增键,
这个键的规则为1和2的用户ID组合,按照从小到大进行组合,例如3和4即为3:4
,5和4为4:5
,
当用户1给用户2发送消息时自动在redis中进行自增,如果redis中不存在该键,则从数据库中查询查询当前最大时序值。
用户查询消息时根据时序顺序进行消息排序,而不是时间顺序。
- 0.首先每个客户端连接到
连接层
的时候,会在redis中记录该用户在哪一台服务器,方便后续消息发送。 - 1.
客户端A
发送消息给客户端B - 2.
客户端A
首先将消息通过TCP发送给连接层
- 3.
连接层
收到消息后,无需解析,直接将消息通过RPC转发给逻辑层
- 4.
逻辑层
收到客户端A
发送的消息,进行路由处理抵达对应函数 - 5.
逻辑层
首先进行双方身份的判断,然后将消息投递到消息中间件,然后同步RPC返回给客户端A
,告知客户端A
消息已成功发送成功。 - 6.
消息中层
的消费者获取到消息
后,第一步将消息写入数据库,第二步将消息发送给客户端B所在的连接层服务器,具体发送方式为找到客户端B
所连接的服务器,然后通过连接层的RPC进行调用推送消息。