0%

IM - 一种可参考的即时通讯设计

做了一段时间的即时通讯IM应用,有些心得,特来分享分享。

IM

IM,又称为即时通讯。

既然是即时,那就需要和客户端建立一个长连接。
对于长连接需要有连接保活心跳机制而长连服务器的IP地址又需要进行下发等。

总体划分如下:

  • 服务器地址下发
  • 网关层
  • API层
  • 服务层
  • 队列机层

用户客户端打开应用之后,将会向服务器发起一个HTTPS请求,服务端根据长连服务器负载情况将要下发的地址进行排序,客户端根据获取到的长连服务器地址顺序尝试连接,成功建立连接之后开始进行通信。

每一条上行及下行的消息都需要与网关层进行交互,在连接期间,需要与网关层进行心跳检测链路问题,消息经过encode处理之后发送到网关层,网关层直接调用API层的RPC透传到API层去处理。

API层收到来自网关层的RPC请求之后,先进行decode,然后解析出相应的header、body,根据header中定义的tag和type去调用相应的方法。这些方法除了业务逻辑外,另外就是通过RPC或者HTTP去调用各种所需的服务,如:用户服务、私信服务、群聊服务。

服务层收到API层的请求之后,生成消息版本号,将消息入库,并将消息异步写入队列之中,返回处理结果给API层。

队列机这一层负责接收、处理及转发多种服务写入的消息,然后将处理后的消息pub到Redis中,包括离线缓存队列,由长连服务器去sub,然后下推给客户端。

需要解决的问题
  • 消息乱序问题
  • 消息可靠性问题