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

IM 即时通讯系统-45-merua0oo0 IM 分布式聊天系统

IM 开源系列

IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IM+RTC能力

IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统

IM 即时通讯系统-43-简单的仿QQ聊天安卓APP

IM 即时通讯系统-44-仿QQ即时通讯系统服务端

IM 即时通讯系统-45-merua0oo0 IM 分布式聊天系统

IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案

IM 即时通讯系统-47-beardlessCat IM 使用netty开发分布式Im,提供分布netty集群解决方案

IM 即时通讯系统-48-aurora-imui 是个通用的即时通讯(IM)UI 库,不特定于任何 IM SDK

IM 即时通讯系统-49-云信 IM UIKit 是基于 NIM SDK(网易云信 IM SDK)开发的一款即时通讯 UI 组件库,包括聊天、会话、圈组、搜索、群管理等组件

IM 即时通讯系统-50-📲cim(cross IM) 适用于开发者的分布式即时通讯系统

IM 即时通讯系统-51-MPush开源实时消息推送系统

IM 即时通讯系统-52-leo-im 服务端

IM 即时通讯系统-53-im system server

IM

https://github.com/merua0oo0/im

项目介绍
  1. IM是一个分布式聊天系统,目前完全开源,仅用于学习和交流。
  2. 支持私聊、群聊、离线消息、发送图片、文件、好友在线状态显示等功能。
  3. 后端采用springboot+netty实现,前端使用vue。
  4. 服务器支持集群化部署,每个im-server仅处理自身连接用户的消息
项目结构
模块功能
im-platform与页面进行交互,处理业务请求
im-server推送聊天消息
im-client消息推送sdk
im-common公共包
消息推送方案(推方案)

[外链图片转存中…(img-MfL0LF70-1738503818612)]

  • im通过长连接实现消息推送,单机情况下不同用户的channel是在同一台机器上可以找到并且投递,当场景转换为分布式后,不同的用户channel可能是不同的server在维护,我们需要考虑如何将消息跨server进行投递

  • 利用了redis的list数据实现消息推送,其中key为im:unread:${serverid},每个key的数据可以看做一个messageQueue,每个server根据自身的serverId只消费属于自己的queue

  • 同时使用一个中心化存储记录了每个用户的websocket连接的serverId,当用户发送消息时,platform将根据receId所连接的server的id,决定将消息推向哪个queue

  • 每个server会维护本地的channel,收到messageQueue中的消息后找到对应的Queue进行投递

热点群聊优化方案(推拉结合)

[外链图片转存中…(img-LZluHRZx-1738503818614)]

  • 在客户端会维护热点群聊的已读offset,用户发送热点群聊消息给server

  • server统一将消息通过MQ与TS服务进行解耦,TS服务负责将消息进行入库,同时对比用户存在redis中的已读消息的存根是否有必要将message投递到receId对应的messageQueue

  • 若投递到messageQueue后,server消费后投递给client无状态的可以拉取请求

  • client收到请求后进行批量拉取,拉取是需要从DB中拉取,防止DB压力过大,用存根offset与group最新消息进行判断是否有必要拉取。

  • 拉取操作务必使用异步,可以使用MQ,方便可以使用业务线程,防止单个拉取动作过慢导致work线程阻塞进而影响用户的心跳检测。


http://www.kler.cn/a/530499.html

相关文章:

  • Workbench 中的热源仿真
  • 【UE】 APlayerState
  • Janus-Pro 论文解读:DeepSeek 如何重塑多模态技术格局
  • hot100_21. 合并两个有序链表
  • 前端知识速记—JS篇:null 与 undefined
  • 自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)
  • 【Ai】DeepSeek本地部署+Page Assist图形界面
  • 【软件测试项目实战】淘宝网订单管理功能
  • 项目集成Spring Security授权部分
  • 2025年2月2日(range()函数的参数及含义)
  • 「全网最细 + 实战源码案例」设计模式——享元模式
  • 【C++面试题】malloc和new delete和delete[]
  • 在AWS上使用Flume搜集分布在不同EC2实例上的应用程序日志具体流程和代码
  • Golang 并发机制-4:用Mutex管理共享资源
  • 毕业设计:基于卷积神经网络的鲜花花卉种类检测算法研究
  • 51单片机 02 独立按键
  • 享元模式——C++实现
  • Java基础知识总结(四十)--Java.util.Properties
  • 浅析服务器虚拟化技术
  • unity学习26:用Input接口去监测: 鼠标,键盘,虚拟轴,虚拟按键
  • Leetcode:598
  • 深入核心:一步步手撕Tomcat搭建自己的Web服务器
  • Ubuntu 下 nginx-1.24.0 源码分析 ngx_debug_init();
  • 构建一个文档助手Agent:提升知识管理效率的实践
  • CUDA内存模型
  • 力扣经典题目之3无重复字符的最长子串