Go: IM系统开发及注意事项

news2024/9/21 22:13:34

概述

  • 使用Go语言打造支持,同时十万人在线的IM系统
  • 系统单机支持十万人,如果分布式部署后,支持数百万都是可以的
  • IM 系统, 即时通讯(Instant Messaging),比如说我们的微信,QQ 等
  • IM 系统,它具备非常独特的几个特性
    • 第一个特性,它本身是结合社交产品电商产品以及办公类产品的标配
    • 第二个特性,我们的产品,它的技术含量非常高
  • 打个比方,我们的微信群里面,每天可能没什么聊天的话语
  • 但是突然之间因为一些突发事件,那整个微信群就数十条上百条聊天记录一下子就爆了
  • 这时候对我们整个系统的应对突发事件的这个能力要求就非常高了
  • 如果十分钟之内没有处理好这个事情,每个用户也感受到延迟非常严重
  • 所以,IM是用户最能切身体会的一个产品,好不好用,很快就能鉴别出来

关于 IM

  • IM 产品本身具备一定的技术含量
  • 未来是5G的时代,互联网的时代,物联网的时代,AI的时代
  • 这个时代要求我们人和人之间联网人和AI之间联网人和终端之间联网
  • 人的一些指令,一些信息发送出去,比如说你的一个指令发给设备,怎么实时的发给这个设备呢?
  • 人和人之间发括信息,怎么实时发送这个信息?这就是我们核心的一个技术,是就实时推踪技术
  • 恰恰IM是整个实时推送技术的非常典型的一个代表,门槛也不高,业务场景人们也熟悉

实现IM的基本功能

  • 实现我们的文字发送图片, 实现发送表情, 实现发送语音, 发送视频
  • 语音和视频是我们应用中基本常用的一种交流的媒介了
  • 如果基于h5来实现的,意味着可以移植到我们的浏览器,PC端,安卓和iOS系统里去
  • 也可能有不同的业务,比如:支持红包,支持表单, 支持签到功能
  • 在实现功能之后,自然而然就会进行到性能上的一个调优

性能调优

  • IM的性能有几个关键性因素,一个是时效性,不能出现很大的延迟
  • 第二个是很多人同时登录IM, 要具备并发的一个要求,
  • 实现了基本的功能的问题,同时又解决了单机的性能问题,在这两个基础上,我们的应用已经是很优秀了
  • 之后,就涉及到如何进行分布式的部署

前端技术栈

  • html5:ajax/获取音频/websocket发送消息
  • vue 制作单页app
  • mui/css3等

后端技术

  • 强大的websocket
  • channel/goroutine
  • template技术

系统架构

  • 反向代理 Nginx
  • 消息总线MQ/Redis
  • 协议Udp/Http2的协议

整体流程时间安排

  • 需求分析10%
  • 重难点技术方案20%
  • 功能实现60%
  • 上线部署10%

需求分析


1 )基本需求

  • 发送/接收消息
  • 实现群聊
  • 高并发 = 单机 + 分布式 + 弹性扩容

2 )需求拆分

2.1 实现功能界面

  • 消息界面:发送人消息样式,我的消息样式,发送按钮面板相关功能等
  • 好友列表界面
  • 群聊界面
  • 我的界面

2.2 实现资源标准化编码

  • 资源信息采集并标准化,转化成content/url
  • 资源编码,终极目标斗士拼接一个消息体 (JSON/xml)
  • 资源标准化就是想尽办法想尽各种手段,将我们的本地资源转化成可以访问的资源
  • 打个比方,我们输入文字, 通过输入框就可以获得我们这个可访问的资源了
  • 如果输入一个图片,是什么样的一个流程?首先,点开我们的相册,选择这个图片
  • 再发送到我们的服务器,服务器,再返回一个链接
  • 这个链接就是我们资源标准化的一个结果,发送语音也是一样的
  • 首先弹出这个语音按钮,录音以后,将获得的这个文件发送到服务器,转换成一个链接
  • 我们拿到这个链接,这就是资源的标准化,那资源标准化以后就进入消息编码的阶段
  • 拿到这个文字和语音图片的链接,将它们编码到一个消息中去
  • 最后通过我们系统的一些api,发送到我们服务器服务器转发到我们群聊或者单聊的某一个人
  • 整个过程文字首先转化成 content 存在到我们消息中去
  • 表情包它本身要去提供了一个URL,它是一个双方已知的这样一个url
  • 并不需要额外的再上传了,直接编码到我们消息里面去
  • 我们的图片语音,它会首先被上传到服务器,再返回一个标准的URL,这个url可以被我们每个人访问了
  • 这时候再把这个URL编码的我们消息中去
  • 最后消息体通过API发送到我们系统,系统再转发给我们参与聊天的人或者群里的每一个人
  • 这就是我们的资源标准化,并且实现编码的整个过程

2.3 确保消息体的可扩展性

  • 消息体它本身一定需要兼容基础的媒介:URL/Pic/Content/Num
    • 比如说图片,比如说文字,比如说语音,但是兼容了这些媒介往往是不够的
    • 因为这个IM它的业务性非常强,将来肯定会扩张红包,签到,语音电话等
  • 那这时就要求我们这个消息体的设计,应该兼容后续大量的新的业务场景
    • 对新业务进行扩张的时候,不能对现有的业务产生影响
  • 基于上面几点,我们这里提供一种可行的这种消息体的一个格式如下

在这里插入图片描述

  • 这里只是一个举例,后续可以扩展

2.4 接收消息并解析显示

  • 接收到消息体(Json)并进行解析
  • 区分不同显示形式(图片/文字/语音)
  • 界面显示出自己发和别人发的

2.5 群聊的特殊需求

  • 基础功能上无区别,发送文字,语音,图片等
  • 特殊性在于:一条消息由多个参与群聊的终端及时接收到
  • 这意味着服务器压力,考虑服务器流量的计算

服务器负载分析

  • A发送图片512K, 如果这个群有 100 人在线群人员同时接收到 512K * 100 = 50 M
  • 如果系统里面有 1024个群,50M * 1024 = 50G
  • 这样的流量是非常大的,一台服务器能抗住这个流量,是一个非常大的挑战
  • 解决方案:
    • 1 ) 使用缩略图 (51.2k) 提高单图下载和渲染速度
    • 2 ) 资源分离,提高资源服务并发能力使用云服务(qos/alioss), 100 ms 以内,支持海量并发
    • 3 )压缩消息体,发送文件路径而不是整个文件

2.6 高并发

  • 单机并发性能最优
  • 海量用户采用分布式部署
  • 应对突发事件弹性扩容,云平台提供

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

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

相关文章

软件测试服务公司分享:系统测试和验收测试有什么联系和区别?

软件系统测试是指对软件系统的各个模块、组件以及整个系统进行全面检查和验证的过程。它旨在检测系统的功能是否符合需求、是否能够正常运行以及是否存在潜在的问题。在软件开发的整个生命周期中,系统测试是一个非常重要且必不可少的环节。 软件验收测试是软件在开…

vs code 启动react项目,执行npm start报错原因分析

1.执行 npm start错误信息:npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 npm start ~~~ CategoryInfo …

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用,可能是由于以下原因导致: 恶意攻击:攻击者利用自动化脚本或工具对接口进行大量请求,以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误:某些情…

【正点原子i.MX93开发板试用连载体验】录音小程序采集语料

本文最早发表于电子发烧友论坛:【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 接下来就是要尝试训练中文提示词。首先要进行语料采集,这是一…

C双指针元素去重

需求 在尾部插⼊、删除元素是⽐较⾼效的&#xff0c;时间复杂度 是 O(1)&#xff0c;但是如果在中间或者开头插⼊、删除元素&#xff0c;就会涉及数据的搬移&#xff0c;时间复杂度为 O(N)&#xff0c;效率较低。 代码 #include <stdio.h>// 相邻元素去重 int remove…

Linux-管道

管道&#xff1a;把一个命令的输出&#xff0c;通过管道连接&#xff0c;作为另一个命令的输入。管道的工作原理是通过一段共享内存来实现数据的传输&#xff0c;其中一个进程向管道写入数据&#xff0c;另一个进程则从管道的另一端读取数据。 1.可以通过ls -lh罗列出当前文件…

Smartbi体验中心升级新装,全产品线沉浸式体验

为了让用户更好地了解Smartbi产品在数据分析中的价值和能力&#xff0c;优化用户的产品体验&#xff0c;我们近期对Smartbi在线体验中心进行了全新改版和系统调优。本次更新内容包括全新首页、全新行业示例Demo、新增产品核心功能Demo&#xff0c;并优化了现有的Demo。让我们一…

直播预告|V学院|干货预警!2.5D、流光、动效?一次掌握!

随着可视化行业持续发展&#xff0c;可视化设计随之不断进化升级&#xff0c;对于设计师的视觉审美、设计能力和灵活运用等要求也随之进阶。可视化设计越来越卷了&#xff0c;设计师需要了解市场上的热点效果、优秀案例&#xff0c;持续学习&#xff0c;才能随行业发展不断进步…

C基础day9

一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…

合合TextIn - 大模型加速器

TextIn是合合信息旗下的智能文档处理平台&#xff0c;在智能文字识别领域深耕17年&#xff0c;致力于图像处理、模式识别、神经网络、深度学习、STR、NLP、知识图谱等人工智能领域研究。凭借行业领先的技术实力&#xff0c;为扫描全能王、名片全能王等智能文字识别产品提供强大…

Jeecgboot vue3的选择部门组件JSelectDept如何实现只查询本级以及子级的部门

jeecgboot vue3的文档&#xff1a;地址 JSelectDept组件实现了弹窗然后选择部门返回的功能&#xff0c;但部门是所有数据&#xff0c;不符合需求&#xff0c;所以在原有代码上稍微改动了一下 组件属性值如下&#xff1a; 当serverTreeDatafalse的时候&#xff0c;从后端查询…

在uniapp中如何使用地图

1&#xff0c;技术选择 最好是使用webview html形式加载&#xff0c;避免打包app时的地图加载问题 2&#xff0c;webview使用 使用webview必须按照官方文档,官网地址&#xff1a;https://uniapp.dcloud.net.cn/component/web-view.html <template><view><!…

windows电脑的linux虚拟机连接电脑网络的方法

一、虚拟机新建网络适配器,将其设置为NAT模式 子网等信息就不知道该设置什么网段的先就设置为192.168.0.x,后面可以修改 二、电脑设置 1.网络和Internet>高级网络设置 2.编辑虚拟网络NAT适配器 &#xff08;1&#xff09;选中"自动获取ip地址",确认 3.编辑WLAN…

【后端开发实习】用Redis实现消息队列邮件发送

简介 用Resi本身封装的方法相比于调redis-smq库&#xff0c;实现方式就要简单朴素很多&#xff1a; 调用redis本身的List数据结构的Lpush实现消息的进队。用Redis的List数据结构的brpop方法实现消息的出队。将出队消息通过邮件方法发送给指定的用户。 生动形象理解就是用redi…

RabbitMQ 实现简易即时通讯

设计思路 利用消息队列的特性进行消息投递&#xff0c;假设客户端 A 要与客户端 B 进行通信。 客户端 A &#xff1a;创建队列 A-B &#xff0c;发送的消息推送到 A-B 队列&#xff0c; 绑定 B-A 队列&#xff0c;接收 B-A 队列推送给客户端的消息。 客户端 B &#xff1a;创建…

ROS2入门到精通—— 2-2 ROS2实战:运动规划仿真环境Nav2搭建和导航测试

1 Nav2总体架构 头文件源文件约八万行 安装cloc&#xff1a;sudo apt install cloc bigdavidbigdavid-Legion-Y9000P-IRX8:~/Nav2$ cloc .1137 text files.1133 unique files. 57 files ignored.github.com/AlDanial/cloc v 1.90 …

72.WEB渗透测试-信息收集- WAF、框架组件识别(12)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;71.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;11&#xff09;-CSDN博客 常用…

视频剪辑软件如何选?FCPX和PR更适合新手呢

随着抖音、快手等短视频平台的迅速兴起&#xff0c;短视频数量急剧增加。想要发布一款简单、高质量的短视频&#xff0c;运用剪辑软件至关重要。目前比较流行的有Adobe家的Premiere&#xff0c;以及Final Cut Pro X&#xff0c;经常有用户在二者间&#xff0c;不知如何选择&…

【自媒体直播】手机充当电脑摄像头的方法

你知道如何使用手机作为电脑摄像头进行直播吗&#xff1f;当我们短时间内需要通过线上直播的方式进行录课、召开线上会议等紧急情况&#xff0c;但又不想花费昂贵的费用购买高清电脑摄像设备时&#xff0c;我们可以通过使用第三方专业虚拟摄像头软件通过手机充当电脑摄像头的方…

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【SLAM-翻译与解读】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是许多机器人视觉任务的基本组成部分&#xff0c;如 2D 或 3D 目标检测、识别和配准。2D 特征提取和匹配已取得巨大成功。然而&#xff0c;在 3D 领域&#xff0c;当前方法由于描述性差…