鼎力推荐github6。7kstar开源IM项目OpenIM
本报告主要分为两部分,性能测试和消息可靠性测试。前者主要关注吞吐,延时,同时在线用户等,即通常所说的性能指标。后者主要模拟真实环境(比如离线,在线,弱网)消息通道的可靠性。
先说结论,对于容量和性能:性能及容量总结
服务器资源:8核16G内存,6个机械磁盘,每个磁盘100G,用于mongo分片,10MB带宽。
容量:用户容量10万以上,消息条数10亿条。
性能评估:同时在线用户10万,每秒钟发送消息900条,消息延时1秒(从发送者发出消息到接收到消息)可靠性总结
启动sdk,模拟50个用户在线、离线情况,消息可靠性100。
发送10万消息,有3条失败,其他消息都能被对方精确收到,并成功落地本地db。对于失败的3条消息,接收方确实没有收到,系统消息是一致的。项目介绍
OpenIM是由前微信技术专家打造的开源的即时通讯组件。OpenIM包括IM服务端和客户端SDK,是一套整体的解决方案,代码开源,一切可控,
OpenIM可以实现全平台支持,目前支持Android,iOS,Flutter,Uniapp,reactnative,JSSDK等。
OpenIM可以应用在企业内部办公,dating交友,在线客服等项目,也可以用于元宇宙。
github地址:https:github。comOpenIMSDKOpenIMServer
开发者中心:https:doc。rentsoft。cn
性能测试
在单机的情况下,模拟线上用户发消息流程,在线用户量和消息量达到一定量级后,系统CPU、内存、磁盘占用、以及消息时延情况。以确定用户群体达到一定量级后,对服务器资源的预先评估。本次测试并不极限测试,一是因为生产环境本来都会有用户量和消息量的限制,二是因为OpenIM的消息模型,消息发送首先都会通过websocket入库kafka,理论上发送消息的写入性能是两者的组合,而消息发送的真正瓶颈实际在mongodb的随机读写。测试过程
服务器资源:腾讯云主机(香港)1台:linuxUbuntu18。04。4系统,4核8G内存,单块机械硬盘。5Mb带宽。
测试条件:去掉消息入库mysql(因mysql仅用于管理后台,不影响线上用户服务)。日志级别调整为4或更低。kafka设置2个分区,msgtransfer2个。
测试流程:1个客户端(成都,windowpc,4核16G内存)启动1万个协程,模拟用户与服务器建立websocket长连接,间隔时间为随机50100秒之间。两个客户端共模拟2万用户同时在线,发送消息,观察消息流转各个模块的处理能力,共计2500万条消息,观察系统内存、磁盘资源使用情况。测试结论和分析
关注指标
测试结果
同时在线人数
20000个
网关接收消息速度
150条s(因为瓶颈不在此,故意控制发送速度,以确保kafka能被快速消费入mongodb)
mongodb处理写入
300条s(收件箱模型,导致消息一拆为二)
CPU使用率
约50
内存使用率
约4G(mongo内存限制2G,由于每个文档存储5k条消息,实际实际索引量很小。redis只存了用户seq映射关系,基本不占内存)
发送消息响应时长
平均70毫秒
发送过程时延
平约1秒
磁盘空间
mongo中5000万条消息占用10G磁盘,由于一拆为二的缘故,mongo的50000万条消息,实际为2500万条消息。
mongodb数据情况
redis数据情况
磁盘状态
资源占用分析
(1)redis内存消耗极小,一个用户一条数据(包括token和seq),和用户量成正比,3万用户占用几十M内存。
(2)mongodb如果去掉cache,内存消耗极小,每个document存放5000条消息,与用户量和消息量成正比,3万用户,2500万消息,索引才950K(更好的方式查看mongo消耗cache之外的内存)
(3)2500万消息,磁盘空间占用10G。
(4)每秒钟150条消息,cpu整体占用50,即2核。
性能分析
(1)性能瓶颈在mongodb写入操作,1条消息,需要按照发送者和接收者拆分2次,mongodb写入2次,未来可以针对mongodb读写进一步优化。
(2)对于cpu消耗较大的模块,未来做一次整体优化。
(3)性能很平稳,不会随着数据量增加而降低。机械磁盘iops达到200基本达到了设备的极限单机性能预估
服务器资源:8核16G内存,6个磁盘,每个磁盘100G,用于mongo分片,10MB带宽。
性能评估:同时在线用户10万,每秒钟发送消息900条,消息延时1秒(从发送者发出消息到接收到消息)
模块
性能情况
说明
msggateway
部署多个
,同时在线5万210万
mongodb
6分片,每个磁盘对应一个分片
1800条每秒消息入库
CPU使用率
约100
需要优化模块减少cpu消耗
内存使用率
小于8G(mongo内存限制2G)
如果内存富余可以增加mongodb的cache大小
发送消息响应时长
平均70ms
发送过程时延
平约1s
从发送者到接收者
10亿条消息,磁盘空间
占用40100G磁盘,每个磁盘大概占用70G空间
对于群聊属于扩散写,磁盘消耗较大。整体要考虑磁盘空间富余未来工作优化
(1)mongo集群部署,支持上亿用户同时在线,千亿级消息;
(2)简化集群部署;
(3)数据备份、恢复工具;
以上主要对服务端性能做了一个大致测试,但一套完整的IM解决方案,不仅仅是服务端的工作。实际上,客户端重要性毋庸置疑,具体包括如何利用seq和服务端同步消息,如果保证消息收发的时序,如何回调客户端(会话改变、新增,新消息),消息落地本地db,seq同步,消息推拉如何结合以确保消息收发可靠性。消息可达率(可靠性)测试
相比于性能测试,实际上,消息的可达性(可靠性)更为重要。所以,我们在做性能测试的同时,也要对消息的可达性(可靠性)进行测试,如果不能保证消息收发的正确性,再高的性能也是徒劳。本文重点总结关于OpenIM对于消息可达性测试的方案、过程以及结果。先说结论,OpenIM消息可达率100,大家可以放心使用在生产环境中。seq对齐和同步机制,保证了OpenIM的消息可达性是业界领先的。消息可达性(可靠性)的定义
IM消息系统的可靠性,通常就是指消息投递的可靠性,即我们经常听到的消息必达,通常用消息的不丢失和不重复两个技术指标来表示。确保消息被发送后,能被接收者收到。由于网络环境的复杂性,以及用户在线的不确定性,消息的可靠性(不丢失、不重复)无疑是IM系统的核心指标,也是IM系统实现中的难点之一。总体来说,IM系统的消息可靠性,通常就是指聊天消息投递的可靠性(准确的说,这个消息是广义的,因为还存用户看不见的各种指令和通知,包括但不限于进群退群通知、好友添加通知等,为了方便描述,统称消息)。
从消息发送者和接收者用户行为来讲,消息可靠性应该分为以下几种情况:
(1)发送失败,对于这种情况IM系统必须要感知到,明确反馈发送方。如果此消息没有发送成功,发送方可以选择重试或者稍后再试。
(2)发送成功,如果接收方处在在线状态,应该立即收到此消息。如果接收方处在离线状态不能收到消息,一旦上线则立刻收到消息。
(3)消息不能重复,用数学术语表示:有且仅有这条消息,如果重复了,可能表达的意思就变了。总之,一个商用IM系统,必须包含消息可靠性逻辑,才能谈基本可用,这是IM系统最基本也是最核心的逻辑。模拟场景测试方案
互联网真实场景复杂,但客户端大体可以分为两种情况:(1)发送消息时,接收方在线,能收到消息;(2)发送消息时接收方不在线,登录后能收到离线消息。我们用测试程序模拟互联网客户端各种场景,按照登录、发送消息、接收消息的情况,把测试客户端分为以下2种类型:
(1)启动测试时离线,随机sleep060秒后登录,发送消息,且接收消息
(2)启动测试时离线,随机sleep060秒后登录,不发送消息,只接收消息test。ReliabilityTest(oneClientSendMsgNum,intervalSleepMs,imIP,randSleepMaxSecond,testClientNum)
在实际测试中共计50个客户端,约25个(50概率)客户端不发送只接收消息,约25个(50概率)客户端发送且接收消息。
发送模式:每个客户端随机选择其他客户端作为消息接收者;
测试预期:每一条发送成功的MsgID,都能在接收的消息列表中找到,同样,每一条接收到的MsgID,都能在发送成功的消息列表中找到。
具体做法:(1)消息发送成功后,通过OnSuccess回调,记录MsgID;收到新消息后回调OnRecvNewMessage,记录MsgID;(2)周期性对比两个消息列表,确认是否完全一致;测试结果
发送消息客户端
接收消息客户端
预设发送消息总量
发送成功条数
发送失败条数
接收消息条数
25个
50个
100000条
99997hr3hr99997hr发送数据100000条,其中失败3条,9999997条成功,接收方成功接收9999997条消息(接收方成功接收到消息,写入本地db,并能触发消息回调)
每一条发送成功的消息,对方都能准确接收到,无论接收方在消息发送时的登录状态是在线还是离线。
每一条发送失败的消息,对方都不会收到。测试程序mainmain。gointervalSleepMs:1randSleepMaxSecond:30imIP:127。0。0。1OpenIMiponeClientSendMsgNum:4000每个客户端发送的消息条数testClientNum:50同时启动压测客户端数量funcmain(){reliabilityTest()}
注意事项:
(1)控制压力,因为sdk需要写本地db,客户端会成为压力瓶颈。
(2)压测客户端日志会影响测试性能。成本对比
此表格是某IM云平台的价格,如果按照10万月活,存储三年消息来算,大概每年需要支付15万。而采用OpenIM只需要采购云主机,每年成本约0。8万。
一眼万年的vivoX80要说今年美貌与实力并存的新机是哪个?我肯定高喊这是vivoX80,在我看到它的第一眼,我就彻底沦陷了。怎么会有这么好看的机子呀!vivoX80采用了云阶之上,方圆之境的设计,不仅体
洼地效应显现,销区出手抢粮温馨提示原创不易,求赏赞求转发。点关注,不迷路!今天是5月03日(周二)!祝大家五一节快乐!昨日国内价格整体平稳,仅有山东地区出现小范围的上涨且出现在下午,本来应该外出游玩的五一假
驳斥河南等地村镇银行不承认互联网线上存款言论荒谬最近包括河南禹州新民生村镇银行上蔡惠民村镇银行柘城黄淮村镇银行开封新东方村镇银行,至今不能进行线上提款,让广大储户担惊受怕,无所适从。最近河南村镇银行客服直接还否认线上存款,不由得
中南建设业绩洗澡,出清利空死磕短债中南建设经历了业绩大变脸,亏得都没眼看了。之所以亏得这么惨,主要是计提减值,从2020年的6亿,猛增到30多亿。在这个时间点做这种操作,中南建设或有意为之。首先,股市正处于历史低位
五一小长假零食清单,出行宅家的灵魂伴侣在往年都会相约出去游玩,不过在今年多地方都出现了疫情,人们都开始居家上班和上学,因此这个五一,人们也从计划外出,改为宅家休息。那宅在家中,不管是自己一人,还是和朋友相约聚会,都少不
吸血鬼蜘蛛如何锁定雌性蚊子?图片来源pixabay蛛如其名,吸血鬼蜘蛛(Evarchaculicivora)热衷吸血,腹饱血液的蚊子则是它们的嘉肴美馔。众所周知,只有雌蚊子才会吸血,而这些蜘蛛是如何准确锁定蚊
小米11Ultra降价1500元,太香了,但性能和颜值,vivoX80还是强今年发布的旗舰机型来看,vivoX80属于是赢麻了,在4000元左右价位,属于影像和性能兼顾的手机,而且外观颜值也耐看。一台颜值出众,性能拍照都在线的手机,很难让人不爱。但隔壁小米
曲折反应堆的直线圈为核聚变提供了新形态科学家们正在通过各种实验性的反应堆设计追求从核聚变中获得清洁和取之不尽用之不竭的动力,其中一个更有趣的例子是一种被称为仿星器(stellarator)的近乎圆形装置。虽然这些装置通
陌上人如玉,公子世无双情感点评大赏陌上人如玉,公子世无双偶然的刷到了一个视频。民谣的。歌词很美,调子也很美。循环的听了好几遍。歌词里唱到太阳落下了山,秋虫儿闹声喧,日思夜想的辫儿哥哥,来到了我的门前呐。
做独一无二的死神你是不一样的烟火人生有很多种快乐。读好书书籍是人类进步的阶梯。乐于助人不以善小而不为。乐于工作在工作中创造人生价值。天伦之乐高山流水其中,运动也是人生中快乐的一种生命在于运动能够既可以强身健体又可
抄书第25天,收益也在增加每天都会抽一点的时间来看书,顺道把自己喜欢的句子抄下来和大家分享,不仅增加了心里的那份喜悦,还增加了一些收入。今天,要和大家分享的依旧是作家陈年喜的作品微尘最近有一直在看这本书,喜