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

聊天系统设计-面试

------------------ | 客户端 | | (App / Web) | ----------------- | -----------v----------- | API Gateway LB | ← 负载均衡、限流、鉴权 ---------------------- | ----------------v------------------ | IM Core Service Cluster | ← 无状态服务处理消息收发 ----------------------------------- ↙ ↘ --------------------- -------------------------- | Redis Cluster | | Kafka / RocketMQ | | (在线状态、会话管理) | | (消息异步解耦、削峰填谷) | -------------------- ------------------------- | | v v ---------------------- ------------------------- | MySQL Cluster | | Elasticsearch | | (用户、好友、消息存档)| | (搜索聊天记录) | ---------------------- ------------------------- | v ------------------------- | Push Service | ← 对接 APNs / FCM / 小米推送 | (离线用户通知) | -------------------------详细设计1️⃣ 客户端WebSocket 还是 HTTP Long Polling选项是否采用原因✅WebSocket✔️ 是支持双向通信低延迟适合实时消息❌ HTTP 轮询✖️ 否浪费资源延迟高 什么是WebSocketWebSocket 是一种让「客户端比如浏览器」和「服务器」之间建立长期连接、实现双向实时通信的技术。建立连接三步走握手阶段通过一次特殊的 HTTP 请求来“升级”成 WebSocket 连接。建立持久连接握手成功后这条 TCP 连接就不会断开了客户端和服务端可以互相随时发送数据帧双向通信任意一方都可以发消息为什么用 WebSocket双向通道服务端可以主动推消息给客户端连接复用一次建立长期使用性能好相比轮询节省 90% 以上流量 类比打电话 vs 不停打电话问“有事吗”—— 显然前者更高效。2️⃣ API GatewayNginx 自定义模块负责TLS 终止HTTPS → WSIP 黑名单、限流Sentinel路由到具体的 IM 服务实例使用 Nginx 的ngx_stream模块支持 WebSocket 代理✅ 优势轻量、高性能、成熟稳定3️⃣ IM 核心服务IM Core Service架构特点无状态设计 → 可水平扩展每个实例维护一部分用户的 WebSocket 连接使用Redis ZooKeeper/Nacos实现路由表userId → serverInstanceId示例流程A 发消息给 BA 发送: {to: B, msg: Hello}↓A 所在的服务查找B 当前连在哪个服务器上查 Redis↓如果在同一台 → 直接内存转发 否则 → 通过 Kafka 发送到 B 所在的服务↓B 的服务通过 WebSocket 推送消息这里的关键技术点分布式消息路由4️⃣ 消息中间件Kafka 或 RocketMQ全屏复制用途说明跨节点消息投递A 和 B 在不同服务器时通过 MQ 传递削峰填谷高峰期消息涌入MQ 缓冲防止雪崩异步处理消息持久化、通知生成等走后台消费✅ 选 Kafka 还是 RocketMQ国内大厂多用RocketMQ阿里开源事务消息强国际公司偏好 Kafka生态丰富解决痛点避免“只能同机房通信”的局限性5️⃣ Redis缓存在线状态 会话管理存储内容online:{userId}→ 存储用户是否在线、连接的 serverIdsession:{userId}→ 当前会话 token、心跳时间unacked:{msgId}→ 待确认的消息用于重试机制✅优势快速查询某人是否在线毫秒级支持发布订阅模式可用于广播系统公告6️⃣ 数据库MySQL 分库分表表设计-- 用户表 CREATE TABLE user ( id BIGINT PRIMARY KEY, nickname VARCHAR(50), avatar_url TEXT ); -- 好友关系表 CREATE TABLE friend ( user_id BIGINT, friend_id BIGINT, create_time DATETIME, PRIMARY KEY(user_id, friend_id) ); -- 消息表按 receiver_id 分片 CREATE TABLE message ( id BIGINT AUTO_INCREMENT PRIMARY KEY, msg_id CHAR(32) UNIQUE, -- 全局唯一 UUID sender_id BIGINT, receiver_id BIGINT, content TEXT, msg_type TINYINT, -- 0文本, 1图片... status TINYINT DEFAULT 0, -- 0发送中, 1已送达, 2已读 create_time DATETIME DEFAULT NOW(), INDEX idx_receiver_create (receiver_id, create_time) );分库分表策略按receiver_id哈希分 1024 片 → 查询某人的消息快使用 ShardingSphere-JDBC 自动路由7️⃣ 消息可靠性保障三大机制这是面试必考题✅ 1消息去重防止重复消费客户端发送消息带唯一 ID如 UUID 或 Snowflake服务端用SETNX msg_id_incoming:{msgId} 1 EX 3600防重避免网络超时导致客户端重发造成“一条消息发两次”✅ 2消息确认机制ACKA 发送消息 → B 收到 → 回复 ACK → A 收到 ACK → 更新为“已送达”↑如果没收到 ACK↓本地重试 3 次 → 进入离线队列类似 TCP 的 ACK 机制确保“至少送达一次”✅ 3消息补发Sync on Reconnect当用户重新上线客户端请求“请给我过去 1 小时未接收的消息”服务端从数据库或 Kafka 回放消息可结合增量拉取last_msg_id8️⃣ 已读未读功能实现方案一简单标记法适用于单设备每条消息增加字段read_status客户端显示消息时发送mark_as_read请求服务端更新数据库并通知对方“对方已读”方案二多设备同步挑战问题手机看了算不算“已读”iPad 看了呢✅ 解决方案维护每台设备的最后已读位置last_read_seq:{userId}:{deviceId}只有所有设备都读过才上报“已读”事件 技术难点最终一致性 防冲突更新9️⃣ 离线推送服务Push Service当 B 不在线时消息写入 DB Kafka触发 Push Service 向 B 的手机发通知APNs / FCM内容如“张三你好啊~”摘要式提醒 注意隐私保护不应在通知栏显示完整敏感内容可配置“免打扰”或“仅提示” 搜索聊天记录Elasticsearch将消息异步同步到 ES支持关键词搜索“找上周提到‘合同’的对话”字段建议content, sender_id, create_time, chat_with✅ 优势全文检索快支持高亮、模糊匹配沟通“好的我来逐步为您设计一个支持千万级用户的即时聊天系统。我会从需求分析、核心架构、关键技术点三个方面展开。第一需求澄清我们假设这是一个类似微信基础功能的单聊系统支持文本消息、离线推送、已读回执日活 1000 万峰值 QPS 约 5w。第二整体架构我们采用分层设计客户端通过 WebSocket 连接接入层API Gateway由 IM 核心服务处理消息路由。使用 Redis 管理在线状态Kafka 实现跨节点消息传递MySQL 分库分表存储消息Elasticsearch 支持搜索Push Service 负责离线通知。第三关键设计决策使用WebSocket而不是轮询保证实时性通过Redis 记录 userId → serverId 映射实现精准投递消息通过Kafka 异步传输提高可用性和扩展性所有消息落库并通过ACK确认机制 重试机制保证至少送达一次支持离线推送和重新连接后的消息补发已读状态通过独立上报机制更新并可通知对方。第四扩展性考虑未来可支持群聊需优化写扩散、语音视频WebRTC、消息加密端到端等功能。

相关文章:

聊天系统设计-面试

------------------| 客户端 || (App / Web) |-----------------|-----------v-----------| API Gateway & LB | ← 负载均衡、限流、鉴权----------------------|----------------v------------------| IM Core Service Cluster | ← 无状态…...

2023年半导体硅片技术演进与市场格局深度解析

1. 2023年半导体硅片技术演进全景图 硅片作为芯片制造的"地基",其技术迭代直接决定了整个半导体产业的"建筑高度"。2023年最显著的技术突破发生在300mm(12英寸)硅片领域,全球领先厂商的月产能已突破800万片大…...

5.1.1 通信->TCP IP协议簇标准(IETF RFC 791 793):TCP(Transmission Control Protocol)、IP(Internet Protocol)

RFC 791(IPv4 协议)与RFC 793(TCP 协议)是 TCP/IP 协议簇的核心基石,分别定义了网络层与传输层的标准规范,二者协同构建了互联网可靠通信的基础 协议总览与定位 RFC 791 —— Internet Protocol (IP / IPv4…...

Google Public CA+acme.sh实战:免费通配符证书申请全流程指南

Google Public CA与acme.sh实战:通配符证书申请与自动化管理指南 当你的业务需要同时保护api.yourdomain.com、app.yourdomain.com和static.yourdomain.com时,为每个子域名单独配置SSL证书不仅繁琐,还会增加管理成本。这正是通配符证书大显身…...

数据库系统工程师-Armstrong 公理系统:函数依赖推理与候选码求解核心方法论(重点)

一、引言Armstrong 公理系统是关系数据库理论中函数依赖推理的形式化规则体系,是软考数据系统工程师考试中关系数据库规范化模块的核心考点,占数据库设计类题型分值的 15%-20%。该系统由 IBM 研究员 William Armstrong 于 1974 年首次提出,经…...

李雅普诺夫函数实战指南:如何用Python验证系统稳定性

李雅普诺夫函数实战指南:如何用Python验证系统稳定性 在控制理论和动态系统分析中,稳定性是一个核心问题。想象一下,你设计了一个无人机控制系统,或者正在优化一个化学反应器的温度调节算法——如何确保系统在受到扰动后能够恢复…...

14-Decisions Form表单进阶:Flex弹性布局全解析

Decisions Form表单进阶:Flex弹性布局全解析 在前两篇内容中,我们完成了Decisions表单的基础认知与实操进阶,掌握了表单核心概念、设计器操作、首个普通表单搭建、6大布局类型解析以及表单与Flow的联动使用。本文将聚焦Decisions表单Flex弹性…...

OpenCore Legacy Patcher破局指南:旧Mac设备的系统升级与硬件解锁方案

OpenCore Legacy Patcher破局指南:旧Mac设备的系统升级与硬件解锁方案 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 对于许多Mac用户而言,当苹果…...

通义千问1.5-1.8B-Chat-GPTQ-Int4对话流畅度与逻辑性深度评测报告

通义千问1.5-1.8B-Chat-GPTQ-Int4对话流畅度与逻辑性深度评测报告 最近,一个只有18亿参数的小模型——通义千问1.5-1.8B-Chat-GPTQ-Int4,在社区里引起了不少讨论。大家好奇的是,一个经过量化压缩后的小模型,在真实的对话场景下&a…...

codex(一)下载安装

一、下载安装 1、下载 https://chatgpt.com/codex/...

STM32中断优先级科普:以F103为例,从零吃透NVIC分组与实战配置

前言 STM32F103作为入门级嵌入式开发的经典款MCU,凭借性价比高、资料丰富、外设齐全的特点,成为绝大多数嵌入式新手的第一块开发板。不管是按键外部中断、串口收发、定时器定时,还是ADC采集、SPI通信,都会用到中断机制&#xff1b…...

ai coding工具共性(三)Rules

rules...

[Redis小技巧20]先删缓存还是先更新数据库?一文厘清 Redis 缓存一致性难题

在现代分布式系统中,Redis 几乎已成为缓存层的“标配”。然而,缓存与数据库之间的一致性问题,始终是高并发场景下的“阿喀琉斯之踵”。 一、为什么缓存一致性如此棘手? 缓存一致性问题的本质,源于写操作在缓存与数据库…...

Qwen3-Reranker-8B部署教程:Nginx反向代理+HTTPS保护Gradio WebUI

Qwen3-Reranker-8B部署教程:Nginx反向代理HTTPS保护Gradio WebUI 1. 引言:为什么需要安全部署? 当你成功部署了强大的Qwen3-Reranker-8B模型后,下一个重要问题就是如何安全地对外提供服务。直接暴露Gradio WebUI存在安全风险&am…...

C++ 避坑指南:解决 VS2019 E1696 源文件缺失与 MSB803 SDK 定位难题

1. 问题重现:当VS2019突然拒绝编译Hello World时 那天我正打算写个简单的C Hello World程序测试环境,按下F5的瞬间,屏幕上突然爆出400多个错误。最显眼的是E1696"无法打开源文件"和MSB803"找不到Windows SDK"的报错——这…...

Local SDXL-Turbo环境部署:512x512分辨率下的低延迟图像生成实践

Local SDXL-Turbo环境部署:512x512分辨率下的低延迟图像生成实践 重要提示:本文介绍的SDXL-Turbo模型仅支持英文提示词,默认输出分辨率为512x512,专为实时交互场景优化。 1. 环境准备与快速部署 1.1 系统要求与前置准备 在开始部…...

三相10kW光伏并网逆变器代码功能说明

三相10Kw光伏并网逆变器。包含全套理图/PCB/源代码一、概述 本文档详细解读基于TI F28379D DSP芯片的三相10kW光伏并网逆变器代码系统。该代码采用模块化设计,涵盖核心控制、硬件抽象、参数配置、驱动适配等多个功能层级,支持交流开环、电流环独立逆变、…...

RAG 完全图解:让 AI 不再“胡说八道“的核心技术

你让 AI 帮你查某款产品的售后政策,它给你列了一套看起来很专业的条款——但这些条款根本不存在。你让它总结一份技术文档的要点,它说得头头是道,可有一半内容是它自己编的。这不是 AI 变笨了,而是它根本"不知道"这些专…...

命题逻辑中的对偶原理:为什么它与德摩根律如此相似?

命题逻辑中的对偶原理:为什么它与德摩根律如此相似? 在数理逻辑的迷宫中,对偶原理与德摩根律如同两枚相互映照的棱镜,折射出命题逻辑的深层对称性。这种相似性绝非偶然——当我们将真值表翻转、将联结词置换时,隐藏在形…...

很多人不知道这个职业,应届生起薪破万、缺口超300万!

当学历内卷与岗位内卷成为压在年轻人身上的两座大山,一条鲜为人知的黄金赛道正在悄然敞开——网络安全工程师。这里不看你的毕业院校排名,不要求5年工作经验起步,甚至零基础3-5个月集训即可上岗,应届生起薪轻松破万! …...

归并排序实战:如何用分治思想高效计算逆序对(附Python代码)

归并排序实战:如何用分治思想高效计算逆序对(附Python代码) 在金融风控系统中,我们常需要评估交易数据的异常波动;在推荐算法里,用户行为序列的混乱程度直接影响推荐效果。这些场景背后都藏着一个关键指标—…...

Java桌面开发新姿势:用JCEF116.0.19内嵌Chrome内核实现混合开发(避坑指南)

Java桌面开发新姿势:用JCEF116.0.19内嵌Chrome内核实现混合开发(避坑指南) 在数字化转型浪潮中,企业级应用对跨平台、高交互界面的需求激增。传统Java桌面开发受限于AWT/Swing的陈旧架构,而Electron等方案又存在内存占…...

QLDependency:彻底解决青龙面板依赖配置难题的革新工具

QLDependency:彻底解决青龙面板依赖配置难题的革新工具 【免费下载链接】QLDependency 青龙面板全依赖一键安装脚本 / Qinglong Pannel Dependency Install Scripts. 项目地址: https://gitcode.com/gh_mirrors/ql/QLDependency QLDependency是一款专为青龙面…...

C#源码解析:欧姆龙NX1P通讯DEMO的CIP通讯实现

C#编写CIP通讯源码,欧姆龙NX1P通讯DEMO一、概述 本代码是基于C#语言开发的CIP(Common Industrial Protocol)通讯Demo程序,专门用于与欧姆龙NX1P2系列PLC进行工业通讯交互。程序采用.NET Framework 4.8框架开发,通过TCP…...

AI绘画新手入门:基于Anything V5的Web服务快速搭建指南

AI绘画新手入门:基于Anything V5的Web服务快速搭建指南 1. 准备工作与环境搭建 1.1 硬件与系统要求 在开始之前,请确保您的设备满足以下基本要求: 操作系统:Linux(推荐Ubuntu 20.04/22.04)GPU&#xff…...

收藏!大厂AI Agent开发岗位解析+小白友好型学习路线(程序员必看)

在AI技术迭代速度日益加快的当下,AI Agent(智能体)已然成为互联网大厂布局的核心方向,成为行业新风口。从阿里巴巴、字节跳动、腾讯等大厂最新校招JD中不难发现,AI Agent开发相关人才的缺口正持续扩大,薪资…...

高频面试题:口径变了,历史数据断层如何处理?

这道题是数据岗面试的核心高频题,尤其贴合当下口径精细化迭代的主流趋势——新口径要么是旧口径新增过滤规则、剔除无效数据,要么是拓展数据源、补充细分维度,绝非单纯的逻辑推翻。作答核心绝非粗暴刷数,而是平滑过渡、权责清晰、数据可追溯、可信度不打折,全程围绕“精细…...

饥荒云服保姆级搭建教程,一键部署专属于你的饥荒世界,手把手教你五分钟完成搭建过程!!

《饥荒联机版》(Dont Starve Together)是一款经典的生存沙盒游戏,与朋友一起在荒野中求生、对抗怪物、探索世界是游戏的乐趣所在。但官方服务器有时延迟高、不稳定,搭建自己的私人服务器可以让你和好友拥有专属的、低延迟的游戏环…...

基于主从博弈的动态定价策略与电动汽车充电管理优化在智能小区的应用研究

基于主从博弈的智能小区代理商定价策略及电动汽车充电管理 关键词:电动汽车 主从博弈 动态定价 智能小区 充放电优化 参考文档:《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现 仿真平台:MATLABCPLEX/gurobi平台 优势…...

TFT时间序列预测实战:用Python从零搭建电力需求预测模型(附完整代码)

TFT时间序列预测实战:用Python从零搭建电力需求预测模型(附完整代码) 电力需求预测一直是能源行业的核心挑战之一。随着可再生能源占比提升和用电模式多样化,传统统计方法在预测精度和灵活性上逐渐显露出局限性。今天我们将深入探…...