实时聊天系统设计

news2024/12/23 14:12:56

设计一个聊天系统最主要是保证消息能够及时可靠的从一端传入到另外一端,同时要支持对历史消息的查看。按照同时聊天人数聊天系统可以分,一对一(one on one)和群聊(group chat),按照消息传递的及时性,可以分为实时发送(real-time message)和延迟发送(delay message),当发送者和接收者都在线,希望消息能够实时发送,当接受者不在线,需要将消息先保存起来,等接收者上线之后再发送。可以将这两个分类角度进行结合,分析设计时需要考虑的点。

对话场景分类

one on one & real-message

两个用户都在线,持续的发送消息,理想情况,A发送的消息B能立刻收到,延迟要低,传统的http请求无法满足请求,最好AB之间能建立一个长连接。

one on one & delaymessage

接受者当前不在线,接受者上线之后,能立刻接收到发送者发送的消息,考虑消息如何存储,消息推送时机。

group chat

A发送送的消息,能够让群里里面的其它人都接收到。

存在问题&解决思路

Q1:如何保证消息及时的快速推送?

可以在客户端和服务端使用WebSocket建立一个长连接,始终保持着连接的状态,不用每次消息发送的时候都要挥手创建链接,对应的服务就是一个有状态的服务。

Q2:如何对对离线的用户发送信息,如何传递?

对于每个用户,都要建立一个消息队列,里面存储了用户待投递的消息,当用户上线了之后,和服务端建立了连接之后,通过连接将消息推送给客户端,每次客户端收到消息之后,都要有一个成功接收的回值凭证,保证消息传递的可靠性。

Q3:如何感知用户是否在线,什么时间去尝试查用户链接是否创建成功?

如果采用服务器轮训的方式,会造成很多不必要的资源浪费,使用客户端上报心跳的方式,并且Q1中的连接是服务端发起的,当客户端开始上报心跳,服务端就会尝试创建一个长连接,过了一段时间客户端都没有上报心跳,服务端才会将对链接通道关闭,这样也避免如果让客户端发起链接,客户端可能因为不稳定的网络,频繁创建和端来链接。

Q4:多个设备情况下,如何保证所有消息都能够传递到所有设备?

对每个账号的关联的每个设备,都记录一个投递消息的最大号 cur_max_message_id,这样可以保证每次设备登陆时,建立连接,还未推送的消息接着推送。

Q4:一个大的整体架构是个什么样子?

为什么选择KV storge作为消息的存储,根据统计消息的查询和写入比例操作比例是1:1,为了快速查询,比如进行模糊文本查询,非结构化数据,查询速度要比使用结构化数据库查询效率要高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.排序总讲.

在这里赘叙一下我对y总前四节所讲排序的分治思想以及递归的深度理解。 就以788.逆序对 这一题来讲(我认为这一题对于分治和递归的思想体现的淋淋尽致)。 题目: 给定一个长度为 n𝑛 的整数数列,请你计算数列中的逆序对…

C++进阶 | [2] 多态

摘要:多态的概念,多态的条件,虚函数的重写,抽象类,多态的原理,虚函数与虚函数表,与多态有关的问答题 1. Concept 多态的概念:通俗来说,就是多种形态,具体点就…

Redis(Jedis和SpringBoot整合Redis)

文章目录 1.Jedis1.介绍2.环境配置1.创建maven项目2.pom.xml引入依赖3.新建一个包并创建一个文件 3.Jedis远程连接到Redis1.Redis放到服务器可以连接的前提条件2.为Redis设置密码1.编辑配置文件2.找到 requirepass3.设置密码为root4.重启Redis,在shutdown的时候报错…

C语言写一个终端进度条

C语言写一个终端进度条 这个功能挺简单的,主要有以下两点: 如何获取终端宽度如何让字符在原地闪烁 如何获取终端宽度 这里用到了设备控制接口函数ioctl(),下面简单的介绍一下这个函数的用法: ioctl是一个在Unix和类Unix系统中…

[C语言]指针进阶详解

指针是C语言的精髓所以内容可能会比较多,需要我们认真学习 目录 1、字符指针 2、指针数组 3、数组指针 3.1数组指针的定义 3.2&数组名vs数组名 3.3数组指针的使用 4、数组传参和指针传参 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指…

如何使用SSH密钥克隆仓库

1.创建SSH Key 在用户目录下查看有没有.ssh目录。如果有且该.ssh目录下有id_rsa(私钥),和id_rse_pub(公钥)这俩文件,那么这一步就可以跳过。否则使用以下指令创建SSH Key ssh-keygen -t rsa -C "xxxqq.com" "xx…

【C语言】详解预处理

、 最好的时光,在路上;最好的生活,在别处。独自上路去看看这个世界,你终将与最好的自己相遇。💓💓💓 目录 •✨说在前面 🍋预定义符号 🍋 #define • 🌰1.#define定义常…

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法 过去有人曾对我说,“一个人爱上小溪,是因为没有见过大海。”而如今我终于可以说,“我已见过银河,但我仍只爱你一颗星。” 在Web开发和服务器管理中&#x…

3-qt综合实例-贪吃蛇的游戏程序

引言: 如题,本次实践课程主要讲解贪吃蛇游戏程序。 qt贪吃蛇项目内容: 一、功能需求 二、界面设计 各组件使用: 对象名 类 说明 Widget QWidge 主窗体 btnRank QPushButton 排行榜-按钮 groupBox QGroupBox 难…

C/C++开发,opencv-ml库学习,ml模块代码实现研究

目录 一、opencv-ml模块 1.1 ml简介 1.2 StatModel基类及通用函数 1.3 ml模块各算法基本应用 二、ml模块的实现原理 2.1 cv::ml::StatModel的train函数实现原理 2.2 cv::ml::StatModel的predict函数实现原理 2.3 cv::ml::StatModel的save函数和load函数 一、opencv-ml模…

Nginx(搭建高可用集群)

文章目录 1.基本介绍1.在微服务架构中的位置2.配置前提3.主从模式架构图 2.启动主Nginx和两个Tomcat1.启动linux的tomcat2.启动win的tomcat3.启动主Nginx,进入安装目录 ./sbin/nginx -c nginx.conf4.windows访问 http://look.sunxiansheng.cn:7777/search/cal.jsp 3…

力扣 647. 回文子串

题目来源:https://leetcode.cn/problems/palindromic-substrings/description/ C题解1:暴力解法。不断地移动窗口,判断是不是回文串。 class Solution { public:int countSubstrings(string s) {int len s.size();int res 0;for(int i 0;…

【机器学习-21】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林(RF) 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

Samsung三星NP930XCJ-K01CN笔记本原厂Win10系统安装包下载

三星SAMSUNG笔记本电脑原装出厂Windows10预装OEM系统,恢复开箱状态自带系统 链接:https://pan.baidu.com/s/1Y3576Tsp8MtDxIpJGDucbA?pwdt0ox 提取码:t0ox 三星原装W10系统自带声卡,网卡,显卡,指纹,蓝牙等所有驱动、三星出厂主题专用壁纸…

vivado 在硬件中调试串行 I/O 设计-属性窗口

只要在“硬件 (Hardware) ”窗口中选中 GT 或 COMMON 块、在“链接 (Link) ”窗口中选中链接 , 或者在“扫描 (Scan)”窗口中选中扫描 , 那么就会在“ Properties ”窗口中显示该对象的属性。对于 GT 和 COMMON , 包括这些对象的所有属性、…

未雨绸缪:25岁Python程序员如何规划职业生涯,避免35岁职业危机?

一、程序员如何避免中年危机? 为了避免在35岁时被淘汰,程序员在25岁时可以采取一系列策略来规划自己的职业发展和提升技能。以下是我给大家整理的一些建议: 1. 持续学习 科技行业更新换代迅速,程序员需要保持对新技术和工具的敏…

揭秘大模型应用如何成为当红顶流?

Kimi广告神话背后的关键词战略 如果你生活在中国,你可能不认识ChatGPT,但你一定知道Kimi。无论是学生党还是打工人,都无法避开Kimi的广告。 刘同学在B站上搜教学视频时,弹出了一则软广,上面写着:“作业有…

SQL 基础 | BETWEEN 的常见用法

在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。 它包含这两个边界值。BETWEEN操作符常用于WHERE子句中,以便选取某个范围内的值。 以下是BETWEEN的一些常见用法: 选取介于两个值之间的值: 使用 BETWEEN来…

批处理优化

1.4、总结 Key的最佳实践 固定格式:[业务名]:[数据名]:[id]足够简短:不超过44字节不包含特殊字符 Value的最佳实践: 合理的拆分数据,拒绝BigKey选择合适数据结构Hash结构的entry数量不要超过1000设置合理的超时时间 2、批处理优…

​【收录 Hello 算法】第 3 章 数据结构

第 3 章 数据结构 Abstract 数据结构如同一副稳固而多样的框架。 它为数据的有序组织提供了蓝图,算法得以在此基础上生动起来。 本章内容 3.1 数据结构分类3.2 基本数据类型3.3 数字编码 *3.4 字符编码 *3.5 小结