当前位置: 首页 > news >正文

IM聊天系统架构实现

一、IM系统整体架构

二、企业级IM系统如何实现心跳与断线重连机制;

        1、重连机制(服务端下线)

                服务端下线,客户端netty可以感知到,在感知的方法中进行重连的操作,注意重连可能连接到旧的服务器继续报错,延迟重试处理(Zk有延迟);重连就是清楚老的redis中的旧数据,重新放入新的链接信息;

        2、重连机制(客户段下线)

                客户端下线,服务端netty同样可以感知到,当服务端下线清除链接信息以及redis信息;

        3、心跳机制(保活)

                心跳机制主要目的是为了保活,客户端要不断地向服务端发送心跳机制,让服务端知道客户端的状态;

                客户端启动时加上心跳handler,规定时间内没有发送心跳,回调触发发送心跳事件;

                服务端同样也是加上心跳机制handler,规定时间内客户端没有发送心跳,触发检测事件,判断是否大于规定时间,是则下线客户端;

三、IM系统数据持久化(使用mq削峰)

        千万用户在线,数据库QPS1w已经算是不错的服务器了;千万用户发送消息,mysql很难平稳处理;

四、消息丢失的处理

        服务端网络不通,客户端消息体添加感叹号用户重发操作;

        Mq消息丢失,参考Mq消息丢失处理

五、消息去重

        客户端生成每条消息的唯一id,发送时携带消息id;服务端做幂等处理;

六、离线消息(未读消息)的拉去

        用户上线后拉去未读消息,频繁拉去未读消息,单独启动离线服务,离线服务也消费mq消息,将数据同步到缓存中;拉去未读消息去离线服务中的缓存拉去;为了防止数量过多的离线消息存储在redis中(可以使用Zeset数据类型,根据id进行排序),可以只存储最新的部分离线消息;

七、海量聊天数据存储

        1、冗余索引表(空间换时间):所谓冗余索引表,其实是将消息宽表数据冗余在一张表中,当只需要部分关系信息时,只查询冗余的索引表,根据mysqlB+树的索引结构,当数据量越小时,存储同样的数据层级结构越小;

        2、分库分表:根据用户冗余索引表的查询条件,节后人id以及发送人id 进行Hash取值分库分表设计;

        3、历史数据归档:将超过三个月或更久的数据进行归档,放到新的归档数据库中,查询历史消息时查询历史消息服务信息;根据时间匹配不通的归档数据库;

               

相关文章:

  • day12_调度和可视化
  • org.mortbay.jetty和org.eclipse.jetty的区别
  • 论文笔记:Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling
  • 罗格科技发布全球首款税务智能合规终端“罗拉DeepTax双引擎AI一体机”
  • Grok 3当前唯一跑分超过1400分的模型,Grok 2 和 Grok 3 如何使用
  • 燕云十六声武器心法搭配推荐 燕云十六声心法怎么选择
  • GitBash输出中文乱码处理
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑬】
  • 青少年编程与数学 02-009 Django 5 Web 编程 21课题、部署
  • idea-gradle打包运行配置
  • DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
  • spring分层解耦(springboot)
  • 阿里云百炼通义大模型
  • 安全问答—评估和应用安全治理原则相关
  • Deepseek官方整理的13类提示词推荐
  • id生成系统和mp条件简化
  • 《模式和状态管理》知识总结
  • 百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
  • 深入解析 Flutter Widget 树与布局:从电商首页到性能优化
  • 23种设计模式 - 建造者模式
  • 张涌任西安市委常委,已卸任西安市副市长职务
  • “老中青少”四代同堂,季春艳携锡剧《玲珑女》冲击梅花奖
  • 【社论】公平有序竞争,外卖行业才能多赢
  • 大英博物馆展歌川广重:他是梵高最钟爱的浮世绘名家
  • 经济日报:美国滥施汽车关税损人不利己
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元