跳转至

Websocket 连接过期和回收机制

问题

目前websocket接口连接成功后,除非用户重复登录(同个用户多个连接接入)否则服务器不会主动断开连接,这就导致可能连接时使用的token过期很久了,还是一直保持接入,所以应该有一个机制,在用户使用websocket的功能时检查连接的有效性,过期则断连

规划

检查机制接入点的选择:

  1. 用户每次使用ws/chat路由(发送ai请求或者聊天消息)时,检查用户连接是否过期

  2. 用户连接在线且收到任意消息时(系统通知,好友申请通知,用户聊天)

方案确定

消息有 收---发 这两个环节,上面规划讨论的接入点选择,1是“发”,2则是“收”。websocket connection的获取来自于websocket 路由的连接;而我们增加的机制本质上是要检查websocket连接是否合法,连接是否依旧持有合法的token。所以可以将检查操作放在每次使用websocket 路由时,而这样的操作场景目前只有发送用户消息和ai聊天,属于“发”这一环节,这么做之后,我们可以确保“发”时,用户连接基本是合法的 但是,如果只在“发”添加检查,那么如果遇到一段时间内只收不发的连接,这个机制在这个时间内就失效了。比如token有效期为5分钟,而用户在30分钟内都可能只收不发。可是在每次收到消息都要做一次检查,无疑是一种很影响性能的做法

我们可以换一种思路,既然在只收不发这个情况下,,token过期了无法自动回收,但是又没法设置一个比较好的检查点,那我们就帮它定期回收。这里很容易想到用定时器去解决这个问题,把过期时间和断连回调注册到定时器里面,时间一到,定时器就会帮我们直接断开连接

最终确定方案:1.在发消息的环节会检查连接是否过期 2.注册一个定时器实现兜底机制,定期回收连接