Skip to content

xttalk/im-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

XtTalk即时通讯

这是一个尝试从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:45和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进行调用推送消息。

Releases

No releases published

Packages

No packages published

Languages