Django-Vue聊天应用多WebSocket实例实现新消息通知是否可行?
方案可行性判断
你构思的双WebSocket连接方案完全合理可行,这也是即时通讯类应用实现全局消息通知的主流方案之一,实现难度低且职责拆分清晰,完全可以实现你要的WhatsApp式侧边栏消息提醒效果。
方案逻辑说明
两个连接的职责拆分非常清晰,不会产生功能冲突:
- 挂载在侧边栏的用户专属持久连接
ws:127.0.0.1:8000/chat/$Username:用户打开应用后就保持连接,专门用来接收全局通知类消息,包括未接入聊天室的新消息提醒、加群邀请、好友申请等。收到通知后直接更新侧边栏对应聊天室的未读数字、最新消息预览即可。 - 对应当前打开聊天室的临时连接
ws:127.0.0.1:8000/chat/$ChatId:仅在用户进入对应聊天室时创建,退出聊天室就销毁,专门用来同步当前聊天室的实时消息、已读状态、对方输入状态等场景化实时数据。
具体实现注意事项
后端逻辑调整
你现有模型已经可以支撑逻辑,只需要调整消息推送的流程即可:
- 发送消息时,除了把消息推送到对应
$ChatId的聊天室分组,还要遍历该聊天室所有参与者,给每个参与者的专属$Username分组推送一条新消息通知,通知内容带上聊天室ID、最新消息内容、发送人ID/昵称、消息时间即可。 - 未读计数可以用两种方案实现:
- 轻量方案:给
Chat和CustomUser加一个中间表,存储每个用户在对应聊天室的last_read(最后阅读时间),每次查询未读数就统计该聊天室中created_at大于last_read的消息数量即可 - 高性能方案:用Redis存储每个用户的各聊天室未读数,读写更快,适合用户量较大的场景
- 轻量方案:给
前端逻辑调整
- 侧边栏的WebSocket收到新消息通知后,先判断用户当前是否打开了通知对应的聊天室:如果是,直接不统计未读,交给聊天室专属WebSocket处理消息渲染即可;如果不是,就给侧边栏对应聊天室条目加未读角标、更新最新消息预览。
可选优化方向
如果后续用户量上来想要减少WebSocket连接数,也可以改成单连接多分组订阅的模式:用户只建立一个全局WebSocket连接,连接成功后自动加入自己的个人通知分组,每次进入聊天室时订阅对应聊天室的分组、退出时取消订阅即可,本质逻辑和双连接方案一致,只是减少了连接占用。但你当前的双连接方案实现成本最低,前期完全没必要做额外优化。
内容的提问来源于stack exchange,提问作者Juan Andrade
相关产品推荐
相关产品推荐

