顶层设计-IM系统架构
一、系统总体架构概览
即时通讯(IM)系统的核心目标,是让用户可以随时随地稳定地发送和接收消息。为了支撑成千上万用户同时在线交流,我们需要将整个系统划分成多个专职模块,每个模块只负责一件事情,彼此协同配合。
最基础的一层是 WebSocket 服务。WebSocket 是一种保持长连接的通信方式,可以让客户端和服务器随时互发消息。但一个 WebSocket 服务器的连接数是有限的,一般能同时维护几千个连接,因此我们通常会部署多个 WebSocket 服务实例,组成一个“集群”,来支撑海量在线用户。
在 WebSocket 服务之上,还有一系列专门的服务模块:
-
IM 服务:负责消息的收发与转发,也就是把你发的消息送到对方那里。
-
Logic 服务:处理登录后的操作,比如你上线、加好友、建群,这些都归它管。
-
Auth 服务:负责登录验证,确保你是你。
-
Router 服务:像导航员一样,决定消息该送去哪台服务器上的哪个用户。
除了模块分工,IM 系统还有一个重要设计:消息一定要先保存再发出去。这保证了即使网络出问题,消息也不会丢。保存之后,系统会通过消息队列把消息交给后续处理模块继续处理,比如发送到你好友的“信箱”里。
总的来说,整个系统像流水线一样,每一步都专注做好一件事,最终让消息安全、快速地送达每一位用户手中。
二、核心服务模块介绍
整个 IM 系统就像一个团队,每个成员负责不同的工作。下面我们来看看这些“成员”都做些什么。
1. WebSocket 服务
这是系统的“入口”。每个在线用户,都会通过 WebSocket 和服务器保持一个长连接。这个连接就像一条专属通道,方便用户随时发消息、收消息。
但一个 WebSocket 服务器能撑的连接数量有限,一般几千个就到头了。所以我们会部署很多台,组成一个“集群”,大家一起分担压力。
2. IM 服务
这是系统中最重要的“中转站”。
你发出一条消息后,IM 服务会先把它保存到数据库,然后丢进一个消息队列,再交给后面专门的模块去处理。为什么要这样?为了确保消息不会丢失,即使网络闪了一下,消息也还在。
它还负责把消息转发给接收方,比如你发了一句话给朋友,IM 服务就会负责把这句话送过去。
3. Logic 服务
Logic(逻辑)服务管的是用户行为。
比如:
-
登录后多久没动了,要不要认为你掉线了?
-
你加了一个好友,要不要让对方知道?
-
创建一个群聊,拉了谁进来?
这些操作都属于“逻辑事件”,由这个服务来处理。
4. Auth 服务
Auth 是认证服务,意思是“你是谁”的确认。
比如你输入账号密码登录,系统会调用 Auth 服务确认这个账号是否合法。如果你用的是第三方登录(比如微信、GitHub),Auth 也负责对接这些服务,确保只有通过验证的人才能进来。
5. Router 服务
Router(路由)服务的职责是找人。
比如你要给好友发消息,系统得先知道:他现在在哪台服务器上?连的是哪一个 WebSocket 实例?Router 服务会告诉你消息应该往哪发。
当然可以,这里是 “三、消息处理机制” 的内容,继续保持通俗、清晰、简洁的风格,面向小白讲解:
三、消息处理机制
当你在聊天窗口里按下“发送”按钮,背后其实触发了一连串操作。下面我们来看看,一条消息从你手里出去,到达对方的手里,中间到底经历了什么。
1. 消息先入库,再发送
你发的每一条消息,系统都会先保存起来,也就是“入库”。
为什么要先保存?这是为了防止消息丢失。比如你发完消息后,网络突然断了,如果没保存就直接发,很可能这条消息就彻底丢了。保存之后,就算后续出问题,也可以补发。
所以,IM 服务会:
-
把消息写入数据库(比如 MongoDB、MySQL 等)
-
然后告诉你:“发送成功!”
2. 消息写入队列
消息保存后,不会直接发给对方,而是先丢到一个“消息队列”中。
这个队列就像一个“中转仓库”,专门用来缓冲和调度消息。这样可以让处理流程更灵活,比如根据用户在线状态、网络条件、处理能力,安排合适的时间发消息。
3. 写扩散与用户信箱
消息进入队列后,有多个“消息处理器”来处理这些消息。
其中一个关键思路叫做 “写扩散”,意思是:
-
系统会主动把这条消息写到**目标用户的“信箱”**里,
-
每个用户都有自己的消息列表(就像邮箱收件箱),
-
登录时或收到推送时,系统会从信箱中取出消息送给你。
这样做的好处是:接收方什么时候来都能拿到消息,不怕错过。
4. 热点信箱的设计
对于一些经常聊天的热门用户(比如大 V 或群主),他们的消息非常多。
如果每个用户都维护完整的信箱,系统会变得很慢。因此我们会设计一个 “热点信箱”,专门处理这类高频用户,减少重复写入,提升效率。
比如一个群有几千人,系统不需要把同一条群消息复制几千遍,而是用热点信箱+聚合机制,智能分发。
四、聚合层设计
前面说过,每个用户都有一个自己的“信箱”,专门用来存放别人发给 TA 的消息。对于一些活跃用户,除了普通信箱外,还会有一个**“热点信箱”**,存放高频或群聊消息。
聚合层的作用,就是把这些分散的消息来源统一起来,给用户呈现一份最终的收件列表。
1. 为什么需要聚合层?
想象一下:
-
一部分消息在用户自己的信箱里;
-
一部分消息在群聊的热点信箱里;
-
还有一些可能来自系统通知、客服等。
如果客户端要自己去找这些消息,就像你自己跑到各个邮箱、微信群、通知中心去翻,麻烦又低效。
所以,我们引入聚合层:
-
它会自动去不同地方收集消息;
-
然后按时间顺序整理好;
-
最后一口气推送给用户。
2. 聚合层怎么工作?
流程其实不复杂:
-
用户上线后,客户端向聚合层请求“新消息”;
-
聚合层会去:
-
用户个人信箱取消息;
-
热点信箱查是否有该用户感兴趣的群消息;
-
-
将多个来源的消息合并在一起;
-
排好顺序,按页返回给用户。
这样一来,用户只需要调一次接口,就能拿到所有需要的消息,既快又省资源。
3. 推模式 vs 拉模式
聚合层支持两种方式:
-
拉模式:客户端主动问“有没有新消息?”
-
推模式:系统检测到有新消息,直接通知客户端来取。
实际使用时,两者会配合起来使用,确保消息不漏、不慢、不中断。
五、可靠推送与 ACK 策略
在 IM 系统中,“消息已送达”不代表“对方已经收到”。为了确保消息真正到达用户手里,并且对方确实收到了,系统需要一套可靠推送机制,其中一个关键环节就是 ACK(应答确认)。
1. 什么是 ACK?
ACK 是英文 Acknowledgement 的缩写,意思是“确认”。
举个例子:你给朋友发了一条消息,系统通过 WebSocket 把消息推到了朋友的手机上,这时候朋友的设备会给服务器回一个“我收到了”的信号,这个信号就是 ACK。
只有服务器收到这个 ACK,才说明消息真正送达了客户端。
2. 为什么需要 ACK?
如果没有 ACK,系统根本不知道消息有没有送到。可能你朋友网络不通、手机掉线,甚至消息被系统中的某个节点“弄丢了”,这些都需要系统感知并做补救。
所以,ACK 有两个核心作用:
-
确认送达:保证用户真的收到了消息。
-
触发下一步逻辑:比如更新“消息状态”,从“已发送”变成“已送达”。
3. 如果没有收到 ACK 怎么办?
系统会设置一个超时时间,比如 5 秒。如果超过这个时间还没收到 ACK,就认为“推送失败”。
这时候系统可能会:
-
重试推送:再次把消息发一遍。
-
切换推送通道:如果 WebSocket 不通,可以尝试发离线推送(比如通知栏提示)。
-
记录失败状态:方便后续排查或提醒用户“消息可能没送达”。
4. ACK 的流程总结一下:
-
服务器把消息推送到客户端
-
客户端收到消息,立刻回 ACK
-
服务器收到 ACK,标记消息为“送达成功”
-
如果长时间没收到 ACK,就重试或记录失败
相关文章:
顶层设计-IM系统架构
一、系统总体架构概览 即时通讯(IM)系统的核心目标,是让用户可以随时随地稳定地发送和接收消息。为了支撑成千上万用户同时在线交流,我们需要将整个系统划分成多个专职模块,每个模块只负责一件事情,彼此协同…...
信任的进阶:LEI与vLEI协同推进跨境支付体系变革
在全球经济版图加速重构的背景下,跨境支付体系正经历着前所未有的变革。2022年全球跨境支付规模突破150万亿美元,但平均交易成本仍高达6.04%,支付延迟超过2.7天。 这种低效率背后,隐藏着复杂的身份识别困境:超过40%的…...
安全性(三):信息安全的五要素及其含义
五要素及其含义 序号要素英文缩写含义说明1保密性Confidentiality仅授权用户才能访问信息,防止信息被非法获取或泄露(例如:加密、访问控制)2完整性Integrity信息在传输、存储和处理过程中保持准确、完整、未被篡改(例…...
PHP 与 面向对象编程(OOP)
PHP 是一种支持面向对象编程(OOP)的多范式语言,但其面向对象特性是逐步演进而非原生设计。以下是关键分析: 1. PHP 对面向对象编程的支持 核心 OOP 特性: 类和对象: PHP 支持通过 class 关键字定义类&…...
Axios全解析:从基础到高级实战技巧
目录 核心特性 安装配置 基础使用 高级功能 错误处理 拦截器机制 请求取消 TypeScript支持 最佳实践 常见问题 1. 核心特性 1.1 核心优势 全平台支持:浏览器 & Node.js 双环境 自动转换:JSON数据自动序列化 拦截器系统:请求…...
EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型
EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型。以下是具体实现方法: 1. EXO 的分布式计算能力 EXO 是一个支持 分布式 AI 计算 的开源框架,能够将多台 Mac 设备(如 M4 和 Mac Air)组合成…...
数据库故障排查指南
数据库连接问题 检查数据库服务是否正常运行,确认网络连接是否畅通,验证数据库配置文件的正确性,确保用户名和密码无误。 性能问题 分析慢查询日志,优化SQL语句,检查索引使用情况,调整数据库参数配置&am…...
RBTree的模拟实现
1:红黑树的概念 红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因…...
docker-compose——安装mongo
编写docker-compose.yml version : 3.8services:zaomeng-mongodb:container_name: zaomeng-mongodbimage: mongo:latestrestart: alwaysports:- 27017:27017environment:- MONGO_INITDB_ROOT_USERNAMEroot- MONGO_INITDB_ROOT_PASSWORDpssw0rdvolumes:- ./mongodb/data:/data/…...
Vue 3.0中响应式依赖和更新
响应式依赖和更新是Vue 3.0中最重要的机制,其核心代码如下,本文将结合代码对这个设计机制作出一些解释。 // 全局依赖存储:WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 当前活动的副作用函…...

uniapp|实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,拍照保存至相册,多端兼容(APP/微信小程序)
基于uniapp以及微信小程序实现移动端人脸识别相似度对比,实现摄像头、相册权限获取、相机模块交互、第三方识别集成等功能,附完整代码。 目录 核心功能实现流程摄像头与相册权限申请权限拒绝后的引导策略摄像头调用拍照事件处理人脸识别集成图片预处理(Base64编码/压缩)调用…...

JavaScript【7】BOM模型
1.概述: BOM(Browser Object Model,浏览器对象模型)是 JavaScript 中的一个重要概念,它提供了一系列对象来访问和操作浏览器的功能和信息。与 DOM(Document Object Model)主要关注文档结构不同&…...

[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程
本人为强化学习小白,为了在后续科研的过程中能够较好的结合强化学习来做相关研究,特意买了西湖大学赵世钰老师撰写的《强化学习数学原理》中文版这本书,并结合赵老师的讲解视频来学习和更深刻的理解强化学习相关概念,知识和算法技…...
使用Spring Boot与Spring Security构建安全的RESTful API
使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中,安全性是不可忽视的重要环节。Spring Boot和Spring Security作为Java生态中的主流框架,为开发者提供了强大的工具来构建安全的RESTful API。本文将详细介绍如何结合S…...

深入理解构造函数,析构函数
目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有,叫作空类. class A {}; 那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。 默认成员函数:用户没有显…...

Day 16
目录 1.JZ79 判断是不是平衡二叉树1.1 解析1.2 代码 2.DP10 最大子矩阵2.1 解析2.2 代码 1.JZ79 判断是不是平衡二叉树 JZ79 判断是不是平衡二叉树 dfs 1.1 解析 1.2 代码 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(in…...

摄影构图小节
1、三分构图法 三分构图法即将画面横竖各分为三份,即九宫格形式。 将画面用两条竖线和两条横线分割,就如同是书写中文的【井】字。这样就可以得到4个交叉点,然后再将需要表现的重点放置在4个交叉点中的一个附近即可。 拍摄自然风光时…...

DAY 28 类的定义和方法
知识点回顾: 类的定义pass占位语句类的初始化方法类的普通方法类的继承:属性的继承、方法的继承 比如def、class这些定义的关键词后,必须有一个有占据缩进位置的代码块。 还有下面这些依赖缩进的语句,都可以用pass语句来占位 x 1…...

RAG数据处理:PDF/HTML
RAG而言用户输入的数据通常是各种各样文档,本文主要采用langchain实现PDF/HTML文档的处理方法 PDF文档解析 PDF文档很常见格式,但内部结构常常较复杂: 复杂的版式布局多样的元素(段落、表格、公式、图片等)文本流无…...

机器学习 day04
文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习,我掌握了机器学习中的线性回归的相关基本概念,包括损失函数的概念,最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…...

蓝牙耳机什么牌子好?倍思值得冲不?
最近总被问“蓝牙耳机什么牌子好”,作为踩过无数坑的资深耳机党,必须安利刚入手的倍思M2s Pro主动降噪蓝牙耳机!降噪、音质、颜值全都在线,性价比直接拉满。 -52dB降噪,通勤摸鱼神器 第一次开降噪就被惊到!…...

机器学习-人与机器生数据的区分模型测试-数据处理 - 续
这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…...

ESP系列单片机选择指南:结合实际场景的最优选择方案
前言 在物联网(IoT)快速发展的今天,ESP系列单片机凭借其优异的无线连接能力和丰富的功能特性,已成为智能家居、智慧农业、工业自动化等领域的首选方案。本文将深入分析各款ESP芯片的特点,结合典型应用场景,帮助开发者做出最优选择…...

特斯拉虚拟电厂:能源互联网时代的分布式革命
在双碳目标与能源转型的双重驱动下,特斯拉虚拟电厂(Virtual Power Plant, VPP)通过数字孪生技术与能源系统的深度融合,重构了传统电力系统的运行范式。本文从系统架构、工程实践、技术挑战三个维度,深度解析这一颠覆性…...
jvm安全点(三)openjdk17 c++源码垃圾回收之安全点结束,唤醒线程
1. VMThread::inner_execute() - 触发安全点 cpp 复制 void VMThread::inner_execute(VM_Operation* op) { if (op->evaluate_at_safepoint()) { SafepointSynchronize::begin(); // 进入安全点,阻塞所有线程 // ...执行GC等操作... SafepointSynchronize::…...
Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法
Python方法类型全解析:实例方法、类方法与静态方法的使用场景 一、三种方法的基本区别二、访问能力对比表三、何时使用实例方法使用实例方法的核心场景:具体应用场景:1. 操作实例属性2. 对象间交互3. 实现特定实例的行为 四、何时使用类方法使…...

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)
一、nfs概念 NFS(Network File System,网络文件系统) 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议,允许用户通过网络访问远程计算机上的文件,就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...

博客打卡-求解流水线调度
题目如下: 有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。 流水…...
基于React的高德地图api教程006:两点之间距离测量
文章目录 6、距离测量6.1 两点之间距离测量6.1.1 两点距离测量按钮6.1.2 点击地图添加点6.1.3 测量两点之间距离并画线6.2 测量过程显示两点之间预览线6.3 绘制完毕6.4 显示清除按钮6.5 代码下载6.06、距离测量 6.1 两点之间距离测量 6.1.1 两点距离测量按钮 实现代码: re…...

数据库blog1_信息(数据)的处理与效率提升
🌿信息的处理 🍂实际中离不开信息处理 ● 解决问题的建模 任何对问题的处理都可以看作数据的输入、处理、输出。 eg.一个项目中,用户点击信息由前端接收传递到后端处理后返回结果eg.面对一个问题,我们在搜集信息后做出处理与分析…...