查看: 1386|回复: 0

IM离线消息优化拓展

[复制链接]

2

主题

2

帖子

16

积分

积分
16
发表于 2018-11-2 19:23:21 | 显示全部楼层 |阅读模式
作为通信的基础框架socket提供了足以满足普通标准的实时聊天会话的需求,在离线推送上我们采用了redis+socketio 推送逻辑,设计初期只是考虑可以实现基本的用户离线再次登录可以收到,在优化上考虑欠佳。
出现问题:前端收到推送的消息是逐条推送的,处理上也是不断刷新会话列表来更新离线未读消息个数和会话列表。消息数量不大的时候体验无差别,但在用户数据量增大和消息数量的增加的同时,前端处理相当困难。
优化构思:
原有消息存储和推送结构(四个客户端同时给一个客户端发送消息):
接收方会收到4*1 条消息
优化结构构思:
只给接收方发送一条离线通知消息,并在消息实体内封装不同的离线会话和对应的离线消息个数
服务器优化步骤:
         检测用户是否有连接在线,在线直接推送消息,不在线开始离线存储
首先依照消息存储设计,将单一用户会话 用哈希存储,内容是每个会话的对象和对象类型
消息存储依照用户会话保存的内容作为键值,使用队列方式存储用户会话消息
当用户上线,从用户会话存储中取出对应的会话,遍历会话并取出对应会话消息个数推送数据
最新消息数据需要单独处理,redis原子唯一性做了良好的支持,如果不在线直接将对应用户的离线最后一条消息更新即可
优化推送数量比较:
假设用户A1000个好友,每个用户给A发送了10条离线消息,当A上线时,原来架构会推送1000*10=10000条记录,前端都要做相应处理。优化后:只会推送一条统计离线消息消息体内 有用户1*10,用户2*10,用户3*10···,增加了消息体积减少了线程数量。



回复

使用道具 举报

友情链接

热点

返回列表 发新帖
您需要登录后才可以回帖 登录

本版积分规则

Copyright © 2018 SAMIM.All Rights Reserved

快速回复 返回顶部 返回列表