请选择 进入手机版 | 继续访问电脑版

默认
发表评论 10
web通讯问题压力测试掉线问题
web客户端代码
               // 设置接受者为0
                receiver = 0;
                $inputMessage.val('');
                // tell server to execute 'new message' and send along one parameter
                //              var p = createCommonData4(dataMessage, IMSDK.getLoginInfo().loginUserId, receiver);
                var p = createCommonData(JSON.stringify(dataMessage), 0, receiver);
                sentMessageToUser(p);
                IMSDK.sendData(p);



web服务器端代码
function callBack_receivedC2SMessage(p, socket){
//    logger.info('[IM应用层-回调] 收到客户端发给服务端的C2S消息(%s)', JSON.stringify(p));
    logger.info('================(%s)', JSON.stringify(p));
   //发送信息循环
    getLoginInfoByToId(p, socket);
}

//===============

//
function getLoginInfoByToId(p, socket) {
        var dataContent = JSON.parse( p.dataContent);
        var t_loginInfo = {userId: dataContent.loginUserId};
        var $imLoginURL = dataContent.url;
        logger.info('t_loginInfo=(%s)', JSON.stringify(dataContent.url));
       
        var data = p.list;
        logger.info('发送的数据的人数=='+data.length);
       //设置发送端为0
        p.from = '0';
        for(var i = 0; i < data.length; i++) {
                var receiver = data[i].loginUserId;
                p.to= receiver;
                p.list = null;
                logger.info('发送的数据=(%s)'
                    , JSON.stringify(p));
                imServerSDK.publicSendDataGlobal(null,p,c2sCallBack);
        }
}



问题描述:
     单个账号压力测试,账号发送频率为1s100条数据,在执行到800-1500左右,会提示online==false, 当前已离线,无法发送消息!
这个问题是正常的还是其他原因






即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

推荐方案
评论 10
你测试工具用的什么?测试时,服务端的所有log输出都关闭了吗?有没有看到什么异常打出?

你可以参考这几个贴子来把你的nodejs和socket.io环境优化优化。
socket.io性能测试讨论:socket.io 高并发实战socket.io保持6万+连接测试?如何实现单服务器300万个长连接的?
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
引用:JackJiang 发表于 2018-04-10 14:18
你测试工具用的什么?测试时,服务端的所有log输出都关闭了吗?有没有看到什么异常打出?

你可以参考这 ...

测试工具是模拟点击事件:鼠大侠 鼠标连点器模拟点击的;服务器的日志是打开的。客户端没有异常,



20180410144026.png
引用:笑笑看 发表于 2018-04-10 14:59
测试工具是模拟点击事件:鼠大侠 鼠标连点器模拟点击的;服务器的日志是打开的。客户端没有异常,

MobileIMSDK是基于WebSocket发起通信的,WebSocket就是基于TCP的长连接,你这种模拟点击的,是没有办法模拟长连接的。你可以找WebSocket的长连接测试工具。说到底Web端即时通讯不是传统的Web短连接,你别理解混了
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
引用:JackJiang 发表于 2018-04-10 15:31
MobileIMSDK是基于WebSocket发起通信的,WebSocket就是基于TCP的长连接,你这种模拟点击的,是没有办法模 ...

是这个样的,我想在web端做成群发功能,我做的模式是c2s,让后在s端循环用户后s2c,您是说c2s发送变成了短连接了,还是我这种模拟的方式不正确。群发是c2s,s2c这种模式还是其他,您是说我测试方法有问题,是这个意思么
引用:笑笑看 发表于 2018-04-11 11:01
是这个样的,我想在web端做成群发功能,我做的模式是c2s,让后在s端循环用户后s2c,您是说c2s发送变成了 ...

不管是c2s还是s2c,在MobileIMSDK-Web都是长连接实现。
长连接建立的前端是,有一个握手、认证过程,所以你能在MobileIMSDK里看到登陆服务器的过程,其实就是建议长连接的过程。

你测试的时候,模拟的点击,如果没有模拟出这个完整的长连接,并基于这个长连接进行通信,等于没有测试意义。因为长连接的测试不像你普通的web页面测试:只需要http打开、页面打开完成后就关闭了,而长连接除非你退出应用,tcp是一直在连接着的,不会也不应该被关闭
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
引用:JackJiang 发表于 2018-04-11 11:23
不管是c2s还是s2c,在MobileIMSDK-Web都是长连接实现。
长连接建立的前端是,有一个握手、认证过程,所 ...

我仔细核对了一下,刚刚开始进入页面的时候,就进行数据初始化以及模拟登陆服务器initMethod(sendUserId, 1);
fireSubmit();


客户端代码
var d = document,
        w = window;
var $window = $(window);
var $userId = "";
var $sendUserId = "";
var $inputMessage = $('#dope');
var $messages = $('#newsList');
var $sendMessageButton = $('.sendBtn');
var $userPic = "";
var $userName = "";
var $loginFlag = true;;
var $roleId = "";
var $userListShow = "";
var temp_i = 0; //临时变量
// =================================【1】 end
function initMethod(sendUserId, roleId) {
        $imLoginURL = imLoginURL;
        d = document, w = window;
        $window = $(window);
        $userId = userId + "";
        $userPic = userPic;
        $userName = userName;
        $sendUserId = sendUserId;
        $inputMessage = $('#dope');
        $messages = $('.newsList');
        $sendMessageButton = $('.sendBtn');
        $userListShow = $('#userListShow');
        $roleId = roleId;

        // =================================【2】 start
        //设置公共参数
        // 开启或关闭MobileIMSDK-Web的框架内部Log输出,建议仅在调试时设为true
        IMSDK.setDebugEnable(true);

        /**
         * 【设置MobileIMSDK-Web的回调方法1:用于debug的log输出】。
         *
         * 框架回调时传入的参数1(必填):字符串类型,表示log内容;
         * 框架回调时传入的参数2(可选):bool量,true表示输出到console,否则默认方式(由开发者设置的回调决定);
         * 建议本回调的用途:开发者可在此回调中按照自已的意图打印MobileIMSDK-Web框架中的log,方便调试时使用。
         */
        IMSDK.callback_log = log;

        /**
         * 【设置MobileIMSDK-Web的回调方法2:用于收到聊天消息时在UI上展现出来(事件通知于收到IM消息时)】。
         *
         * 框架回调时传入的参数1(必填):Protocal对象(Protocal详情请见
         *          “/libs/mobileimsdk-client-common.js”下的createCommonData4函数说明);
         * 建议本回调的用途:开发者可在此回调中处理收到的各种IM消息。
         */
        IMSDK.callback_showChatMessage = showChatMessage;

        /**
         * 【设置MobileIMSDK-Web的回调方法3:服务端对客户端提交的登陆请求处理完成后的回调(事件通知于成功登陆/认证后)】。
         *
         * 框架回调时传入的参数:无参数;
         * 建议本回调的用途:开发者可在此回调中进行登陆IM服务器成功后的处理。
         */
        IMSDK.callback_afterLoginSucess = afterLoginSucess;

        /**
         * 【设置MobileIMSDK-Web的回调方法4:客户端的登陆请求被服务端认证失败后的回调(事件通知于 登陆/认证 失败后)】。
         * 补充说明:登陆/认证失败的原因可能是用户名、密码等不正确等,但具体逻辑由服务端的 callBack_checkAuthToken
         *          回调函数去处理。
         *
         * 调用时传入的参数:true表示是掉线重连后的认证失败(在登陆其间可能用户的密码信息等发生了变更),否则表示首次登陆时的认证失败;
         * 建议本回调的用途:开发者可在此回调中提示用户登陆IM服务器失败。
         */
        IMSDK.callback_afterLoginFailed = afterLoginSucessFailed;

        /**
         * 【设置MobileIMSDK-Web的回调方法5:网络连接已断开时的回调(事件通知于与服务器的网络断开后)】。
         *
         * 框架时传入的参数:无参数;
         * 建议本回调的用途:开发者可在此回调中处理掉线时的界面状态更新等,比如设置将界面上的“在线”文字更新成“离线”。
         */
        IMSDK.callback_disconnected = afterDisconnected;

        /**
         * 【设置MobileIMSDK-Web的回调方法6:掉线重连成功后的回调(事件通知于掉线重连成功后)】。
         *
         * 框架时传入的参数:无参数;
         * 建议本回调的用途:开发者可在此回调中处理掉线重连成功后的界面状态更新等,比如设置将界面上的“离线”文字更新成“在线”。
         */
        IMSDK.callback_reconnectSucess = afterReconnectSucess;
        // =================================【2】 end

}


function fireSubmit(userId) {
        // 登陆/认证后的才能发消息
        if(IMSDK.isLogined()) {
                if(!!userId) {
                        doSend(userId);
                } else {
                        window.location.reload(); //刷新当前页面.
                }
        }
        // 没登陆的先登陆再说
        else {
                remove();
                //退出后进行登录
                //              doLogin();
        }
}


其他代码跟demo代码保持一致。

我对前端代码不是了解,在用鼠标点击攻击点击按钮模拟的话,应该是有连接。判断是否是长连接应该是我们的web服务器是否有心跳,是我这边web服务器设置有问题么
引用:笑笑看 发表于 2018-04-12 14:17
我仔细核对了一下,刚刚开始进入页面的时候,就进行数据初始化以及模拟登陆服务器initMethod(sendUserId, ...

你测的点两只,相当于只是测了握手,还没有开始没长连接通信呢。
WebSocket的长连接建立是基于http的短连接握手实现的,所以很多人误以为websoket就像http的短连接一下,连一下就是了。其实不是这样。

你可以系统地读一读我整理的WebSocket系列基础文章:http://www.52im.net/thread-331-1-1.html
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
引用:JackJiang 发表于 2018-04-12 14:26
你测的点两只,相当于只是测了握手,还没有开始没长连接通信呢。
WebSocket的长连接建立是基于http的短 ...

首先,非常感谢您分享的代码。
我的初始化是
initMethod(sendUserId, 1);
fireSubmit();
初始化完毕这两个方法后,通讯已经进行了握手,建立长连接。
当我发消息的时候重新调用了fireSubmit();
在这种情况下出现online=false 但是islogin=true
引用:JackJiang 发表于 2018-04-12 14:26
你测的点两只,相当于只是测了握手,还没有开始没长连接通信呢。
WebSocket的长连接建立是基于http的短 ...

今天测试了一下,发现捂手建立长连接后,在点击发送一段时间后,会重新再次进行握手的动作,建立一个新的长连接
引用:笑笑看 发表于 2018-04-17 13:00
今天测试了一下,发现捂手建立长连接后,在点击发送一段时间后,会重新再次进行握手的动作,建立一个新的 ...

遇到这种情况,我给你的建议是量化测试:
1)先评估发生这种情况时的网络情况,最好持续的ping服务器,看看ping的结果,并据此来分析网络情况跟代码的表现是否能对的上号;
2)抓出浏览器端完整的log日志;
3)抓出服务端完整的log日志。

只有这些科学的信息情况下,才能分析出是什么原因,写网络程序一定不能凭感觉。MobileIMSDK-Web的商用案例很稳定,而且其实Websocket或socket.io方案本身也是经过大量考验的,一些低级问题出现的可能几乎很小,所以一定是另有原因。
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部