概述

站内信相较于 IM 通信系统而言,实现是比较简单。具体而言就是一个单向的通信系统,由服务端向客户端进行推送,而没有客服端向服务端推送的功能。

1
2
3
4
IM: 
client <-----> server
Site Message:
client <------ server

站内信的核心内容是:消息内容,消息和发送人之间的关系,是否已读

实现起来的技术点也是和 IM 几乎没有区别,也存在群发和私发的消息,因此也需要考虑群发消息和私发消息的储存和可靠性。
私发消息相对而言实现比较简单,只需要保证有序性和可靠性即可
群发消息就实现起来相对复杂,正常来说需要使用单独的一张表来保存这部分消息,是常见的 IM 系统中的读扩散问题,还有已读状态,都需要进行考虑。

由于工期比较赶,因此实现起来也比较潦草,整体实现思路为:

某个 Pod 起来的时候都会订阅某个特定的 channel,并且注册自己独特的 channel,借助 Redis 的 Pub/Sub 机制完成消息的转发。

这种实现方法并不完美,因为 Pub/Sub 会导致消息的丢失,并且强依赖与 redis

Client A 与 Pod A 建立连接,并且订阅了广播 broadcast channel,private channel A,Server 想要发送某个消息给 Client A:

  • 将消息 A 写入到 Redis 中的某个 channel
  • 内部通过消息类型进行判断转发
    • 私聊消息:从 Redis 中找到用户所在 pod,然后写到对应的 Pod
  • 在线状态:Client A 为登录状态,client A 与 Pod A 建立一个 websocket 连接,Pod 内部保存这个连接句柄

alt text