网易首页 > 网易号 > 正文 申请入驻

浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)

0
分享至

本文由转转QA赵里京分享,原题“浅谈IM与相关测试方法”,下文进行了排版和内容优化。

1、引言

目前转转的所有业务都在快速增长,支撑其用户服务的客服系统也同样在快速发展,以承接用户每天大量的问题。

最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。

技术交流:

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》

- 开源IM框架源码:https://github.com/JackJiang2011/MobileIMSDK(备用地址点此)

(本文已同步发布于:http://www.52im.net/thread-4748-1-1.html)

2、什么是WebSocket

WebSocket是HTML5出的一种在单个TCP连接上进行全双工(通信允许数据在两个方向上同时传输)的通信协议。

1)WebSocket与http协议区别:简单的说跟HTTP协议基本没有关系,WebSocket只基于HTTP,或者说借用了HTTP的协议来完成握手动作。

2)WebSocket与Socket区别:WebSocket是应用层协议,Socket是传输控制层协议,即WebSocket建立了Socket连接。下图可直接说明两者区别。

PS:更详细资料请阅读:

  1. WebSocket从入门到精通,半小时就够!
  2. WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)
  3. WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)
  4. WebSocket详解(六):刨根问底WebSocket与Socket的关系

3、Web端IM系统常用的实现方案

IM系统常用的实现方案:

1)http短轮询:循环发送request请求,有没有新消息都会发送;

2)http长轮询:Client端发送request请求,server端收到后保持住此次请求x秒,x秒过程中有消息立刻返回。没有新消息就等待x秒,x秒后放开请求,Client端再发送请求, 不断反复;

3)WebSocket长连接:Client端发送http请求,http请求会比普通的http请求多出信息如下图,这个就是Websocket的核心了,告诉Nginx注意啦我发起的是Websocket协议。与Server端建立握手成功后连接建立并在不触发onClose事件情况下不会断开。

那么哪一种方案更加合适呢?

短轮询与长轮询有以下几个缺点:

  • 1)实时性差;
  • 2)每一次请求都需要进行用户身份验证;
  • 3)流量开销大,每一次请求都会携带header,但业务上header里面大部分的信息都是多余的,这样就产生了数据的冗余。

而WebSocket不存在以上几个问题,身份验证只进行一次。传输信息完全由业务方自定义,不会有冗余。当然WebSocket也有自身的问题,应用置后台、终止进程、手机重启、4g转wifi、断网等都会中断连接。所以WebSocket方案在实时性以及稳定性上更加合适IM,我们也选择的是WebSocket。

PS:更详细资料请阅读:

  1. 新手入门贴:史上最全Web端即时通讯技术原理详解
  2. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
  3. 详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket
  4. 网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket
  5. 搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE

4、项目整体测试过程概览

先从一张图看看我们在项目中的整体测试过程:

5、前置测试阶段

整体测试过程主要有三个测试阶段,“前置测试阶段”、“功能测试阶段”与“上线监控阶段”

所谓“前置测试阶段”就是在开发的过程中进行的测试。首先在需求评审完成后,我们基于WebSocket开发了UserWebSocketClient

和KefuWebSocketClient两个WSClient实例,分别模拟用户端和客服端。

实现功能有:用户与客服登录,相互发送包括纯文本、表情、图片、商品和订单消息,会话转移,坐席状态转换,用户排队等。基于这两个测试实例来不断的测试调试开发的版本。

WebSocket客户端基本实现:
publicclassUserLoginSendMsg {
privatestaticWebSocketClient chatclient =null;
publicstaticvoidtestRun()throwsException {
chatclient =newWebSocketClient(newURI(URI), newDraft_17(), header,500) {
@Override
publicvoid onOpen(ServerHandshake handshakedata) {
//建立握手创建连接
this.send("。。。");
//发心跳,维持连接
service.execute(() - > {
while(!this.getConnection().isClosed()) {
this.send("心跳信息");

@Override
publicvoidonMessage(String message) {
//业务场景逻辑写在onMessage中,并可以计算发送接收的信息条数与时间。下面为用户发送或回复消息
this.send("。。。");
@Override
publicvoidonClose(intcode, String reason,booleanremote) {
System.out.println("连接被关闭");
@Override
publicvoidonError(Exception ex) {
System.out.println(ex.getMessage());

//创建一个无需证书的webSocket信任
trustAllHosts(chatclient);
if(chatclient !=null) {
chatclient.connectBlocking();

WSClient有4个主要事件:onOpen、onMessage、onClose和onError(详见WebSocket官方手册)。

首先是WSClient发送onOpen事件与服务器握手建立连接,成功后发送心跳消息保持连接。同时触发onMessage事件,onMessage开始监听服务端发来的信息,我们可以在onMessage中进行需求实现。onOpen、onMessage为异步操作。

以上代码是由一个线程来执行,所以可以对以上代码进行多线程操作。

6、功能测试阶段

6.1 概述

也就是正式的测试阶段,这一阶段除业务需求功能外,有IM系统自身的特性。

需要我们重点关注以下几点:

  • 1)消息实时性;
  • 2)消息可靠性;
  • 3)消息断线重连;
  • 4)容灾容错;
  • 5)系统的安全性;
  • 6)系统性能。

6.2 实时性

发送端发送消息,接收端能立刻收到。测试手段,在程序的onMessage中加入如下逻辑。

longt1=System.currentTimeMillis();
longt2=System.currentTimeMillis();
System.out.println(t2-t1);

分别获取发送端,接收端发出和接收信息的时间戳,差值即为延迟时间。还可以给Server端施加压力的情况下计算这个时间会更加贴近线上的实际场景。

详细资料请学习:零基础IM开发入门(二):什么是IM系统的实时性?。

6.3 可靠性

所谓可靠性是指发送消息不丢失,异常提示准确等。

如发送和接收方的消息数量与内容准确,并在网络异常的情况下有保障机制,保证发送的消息在网络恢复后,能够正常的发送到接收方。可在WSClinet的onMessage中循环发送大量消息,另一端进行统计,测试数据一致性。

异常提示准确,如网络情况的断网恢复提示,发送失败提示,已读未读提示等相关提示信息,能够保证用户清晰了解系统状态。

详细资料请学习:零基础IM开发入门(三):什么是IM系统的可靠性?

6.4 断线重连

WebSocket对于应用置后台、终止进程、手机重启、4g与wifi互转、断网等都会中断连接,并且这些场景在实际使用中会经常发生。所以要对这些场景进行模拟。在这些场景下,IM系统自身保证一个合理的功能。

相关资料:《Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?》。

6.5 容灾容错

多集群场景,在其中一个服务停止运行后还可以保证会话重连。

6.6 安全性

跨脚本站点攻击,用户可以发送任何文本内容,所以一定要做的就是跨站点脚本攻击的测试。

发送消息到任意用户,即修改目标id。验证会话的身份校验。

相关资料:《通俗易懂:一篇掌握即时通讯的消息传输安全原理》、《微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解》。

6.7 系统性能

WS在性能方面很重要的一点是在服务器上最大能支持的连接数量,最后会简单介绍一下使用jmeter如何进行ws建立连接的性能测试。

7、线上监控阶段

上线后我们使用puppeteer对线上进行ui自动化功能监控,监控主要有3个方面内容。

1)监控主流程的ui用例:

主要包括的场景:用户客服登录IM、机器人问题校验、用户与机器人互动、用户申请人工客服、排队、建立会话、消息发送回复最后关闭会话等。

puppeteer 基本实现:
asyncfunctionmainProcess() {
//一般一个brower实例即可,但为了测试时便于观察使用了两个,无头形式
const browser = await puppeteer.launch({
args: ['--no-sandbox','--disable-setuid-sandbox']
//有头形式
//const browser = await puppeteer.launch({headless:false});
const page = await browser.newPage();
letcookies = await getData();
await page.setCookie(cookies.cookie1);
await page.setCookie(cookies.cookie2);
try{
await page.goto(url);
}catch(e) {
//抛出异常后截取屏幕快照
varfilename = Date.now() +'.png';
await screenShot.screenshotMethod(page1, page2, filename);
//失败后关闭浏览器实例
await browser.close);
await page2.waitFor(2000);
开始对两个页面进行自动化操作

以上代码首先打开页面并进行登陆。当用例执行失败或者抛出异常后,会对当时的情况进行屏幕快照。

2) 监控平台:

如果上面的用例执行失败,产生了快照,我们会将失败信息与快照上传到监控平台。可对错误记录进行查看和编辑。

如下图所示:

目前平台功能简单,后期也会不断增加功能,如用例管理,监控频率设定,手动触发用例等等。

3)上线自动触发ui用例:

对应的集群上线完毕后,会通过mq消息推送到监听服务,监听服务收到后会自动触发用例执行,回归线上功能,并返回结果。

8、WebSocket性能测试

最后,我们来简单介绍一下如何使用Jmeter进行WebSocket的性能测试。

首先是Jmeter环境搭建和脚本配置,需要下载jar包:

  • 1)Jmeter (已有就不用了)
  • 2)websocket请求模板 :JMeterWebSocketSamplers ;
  • 3)jetty-http;
  • 4)jetty-io;
  • 5)jetty-util;
  • 6)websocket-api;
  • 7)websocket-client;
  • 8)websocket-common。

将(2)~(4)中下载的jar包放到Jmeter以下目录下,就能够被调用了。再将你下载的所有jar包,复制到apache-jmeter-4.0\lib\ext下(apache3也可以)。

先在测试计划中添加线程组,然后右键添Sampler时就能看到websocket的模板,常用的就是websocket request-response Sampler(连接+发送data或者只发data)。

如果需要用户认证,再加上用户的信息http信息头管理器,进行用户认证,连接和发送接收消息的基本配置搞定。就可以对server端进行websocket的连接和发送消息的压力测试了,非常简单。

9、参考资料

[1]新手入门贴:史上最全Web端即时通讯技术原理详解

[2]Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

[3]详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket

[4]网页端IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

[5]搞懂现代Web端即时通讯技术一文就够:WebSocket、socket.io、SSE

[6]新手快速入门:WebSocket简明教程

[7]WebSocket从入门到精通,半小时就够!》

[8]WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)

[9]WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)

[10]WebSocket详解(六):刨根问底WebSocket与Socket的关系

[11]Web端IM聊天消息该不该用浏览器本地存储?一文即懂!

[12]零基础IM开发入门(一):什么是IM系统?

[13]零基础IM开发入门(二):什么是IM系统的实时性?

[14]零基础IM开发入门(三):什么是IM系统的可靠性?

[15]从客户端的角度来谈谈移动端IM的消息可靠性和送达机制

[16]IM消息送达保证机制实现(一):保证在线实时消息的可靠投递

[17]IM消息送达保证机制实现(二):保证离线消息的可靠投递

[18]如何保证IM实时消息的“时序性”与“一致性”?

[19]理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨

[20]阿里IM技术分享(七):闲鱼IM的在线、离线聊天数据同步机制优化实践


(本文已同步发布于:http://www.52im.net/thread-4748-1-1.html)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
格雷厄姆遗作法案获特朗普力挺!看似强硬制裁,实则走过场

格雷厄姆遗作法案获特朗普力挺!看似强硬制裁,实则走过场

老马拉车莫少装
2026-07-14 09:44:16
2026车市最大骗局:省油电车全亏钱,烂大街油车才是真赢家

2026车市最大骗局:省油电车全亏钱,烂大街油车才是真赢家

民间胡扯老哥
2026-05-24 13:40:40
3架超级双发首入中国!油耗降21%舱容多25%,南航洲际货运再升级

3架超级双发首入中国!油耗降21%舱容多25%,南航洲际货运再升级

航空之家Aviation
2026-07-14 08:36:48
“天才少女”蒋方舟的今天,会是多少“天才少年”的明天?

“天才少女”蒋方舟的今天,会是多少“天才少年”的明天?

茄小茄说事
2026-07-14 11:40:53
出生人口腰斩!毕业人数却屡创新高,这代人的红利还剩多少?

出生人口腰斩!毕业人数却屡创新高,这代人的红利还剩多少?

李云飞Afey
2026-07-13 01:55:51
各取所需!维拉中场核心花落梦剧场 只有纽卡受伤的世界达成了

各取所需!维拉中场核心花落梦剧场 只有纽卡受伤的世界达成了

雪狼侃体育
2026-07-14 10:23:53
豪门真难进!华晨宇给孩子做2次亲子鉴定,彻底断了张碧晨豪门梦

豪门真难进!华晨宇给孩子做2次亲子鉴定,彻底断了张碧晨豪门梦

八卦王者
2026-07-13 13:18:19
董路反讽:日韩的青训很不科学,往死里练,咱们是一下雨就找妈妈

董路反讽:日韩的青训很不科学,往死里练,咱们是一下雨就找妈妈

风过乡
2026-07-14 11:10:49
林青霞发文悼念施南生:不舍,不舍,还是得放手

林青霞发文悼念施南生:不舍,不舍,还是得放手

韩小娱
2026-07-14 10:12:03
16岁运动员拍门被捅杀!母亲:对方是卖淫场所 泣血请求死刑立即执行

16岁运动员拍门被捅杀!母亲:对方是卖淫场所 泣血请求死刑立即执行

念洲
2026-07-13 08:59:41
“郑州这次丢脸丢到全国了!”

“郑州这次丢脸丢到全国了!”

阿振观点
2026-07-14 05:18:45
75岁郭台铭色心不死,被爆迎来第三春了,老三50岁会提供情绪价值

75岁郭台铭色心不死,被爆迎来第三春了,老三50岁会提供情绪价值

毒舌小红帽
2026-07-12 19:57:21
《浪姐7》李小冉惊爆离婚!11年婚掰了制片人老公…1原因关系破裂

《浪姐7》李小冉惊爆离婚!11年婚掰了制片人老公…1原因关系破裂

ETtoday星光云
2026-07-13 11:26:45
53分先生!加盟欧洲球队!10年NBA生涯结束了

53分先生!加盟欧洲球队!10年NBA生涯结束了

篮球教学论坛
2026-07-14 12:24:07
陪玩陪睡只是皮毛!继手伸进裤子后,又一女星自曝,50多都不放过

陪玩陪睡只是皮毛!继手伸进裤子后,又一女星自曝,50多都不放过

不似少年游
2026-06-22 19:32:51
传奇影人施南生去世,闺蜜林青霞发文悼念,不舍还得放手传递她爱的能量

传奇影人施南生去世,闺蜜林青霞发文悼念,不舍还得放手传递她爱的能量

话娱论影
2026-07-14 07:59:55
江苏父亲高调晒女儿“力争清北,C9保底”,录取结果揭晓,被打脸

江苏父亲高调晒女儿“力争清北,C9保底”,录取结果揭晓,被打脸

世界圈
2026-07-14 10:45:19
百年前条约铁证如山,巴丹群岛与郑和岛主权归属菲律宾彻底出局

百年前条约铁证如山,巴丹群岛与郑和岛主权归属菲律宾彻底出局

掉了颗大白兔糖
2026-07-13 16:21:00
底薪签约首轮10号秀!湖人又有操作,令东契奇满意

底薪签约首轮10号秀!湖人又有操作,令东契奇满意

德译洋洋
2026-07-14 12:02:20
新款丰田亚洲龙现身,外观大变样,车长超5米,会被大家认可吗?

新款丰田亚洲龙现身,外观大变样,车长超5米,会被大家认可吗?

红涛说車
2026-07-13 11:44:11
2026-07-14 13:03:00
即时通讯技术分享
即时通讯技术分享
即时通讯相关技术的研究与分享
484文章数 3621关注度
往期回顾 全部

科技要闻

Meta投1.7万亿元建一个AI园区,配10座电厂

头条要闻

男子得到"暗示"闯女邻居家想发生性关系 被发现称抢劫

头条要闻

男子得到"暗示"闯女邻居家想发生性关系 被发现称抢劫

体育要闻

33岁成为法国主力,他将在世界杯防守亚马尔

娱乐要闻

75岁施南生走完一生,撑起香港电影黄金时代

财经要闻

赛力斯的“代工厂”困境还能撑多久?

汽车要闻

小米澎程N90 Max工信部信息曝光 全尺寸旗舰 露营版首秀

态度原创

本地
艺术
亲子
游戏
教育

本地新闻

打的直达拉萨,一条视频拿下五十万奖金

艺术要闻

看不起“馆阁体”的人,看过此帖后安静了

亲子要闻

科普|暑假到了,孩子视力还好吗

《捞女游戏》团队力挺“散帅”一词:冲破枷锁!

教育要闻

关键时刻,京城这所学校干了这件事

无障碍浏览 进入关怀版