lcs-js测试相关

    2015年03月04日 doc test 字数:3173

背景

变量解释

  • 涉及的变量 :包含命令号、数据内容、收发的数据格式、以及是否压缩和加密、超时时间、重试次数、序列id、发送的时间戳、接收到的返回等字段。
  • 涉及的方法:包含发送消息前准备好数据后调用的方法、成功接收到返回时调用的方法、发生错误时调用的方法、完成后调用的方法
  • 轮询消息队列:
  • 已发送队列:目的是记录已发送的数据
  • 等待发送队列:目的是在不能发送时存储数据
  • 监听队列:监听一些命令号。

逻辑策略

  • 建立连接&心跳流程
    • 建立连接其实就是如下发消息的流程。
    • 心跳也同样。通过命令号来区分。
    • 心跳策略目前是每300s下发一次。
    • 上线和心跳均是系统命令号,不允许通过控制台进行消息发送。所以通过上线时的请求和log来观察。
  • 发消息
    • 消息分类
      • ACK消息
      • PING包
      • 普通消息(依赖命令号的)
    • 方法入参
      • 命令号
      • 待发送的数据
      • 接收到数据后的回调方法,传入一个{Object}类型的参数
      • 待发送数据的封装格式
      • 待返回数据的封装格式,不能直接指定待返回数据格式而不指定待发送数据格式
    • 发送流程
      • 对参数做一系列的判断(基本需要满足:按照入参格式来或者是直接封装成object来。除了command其余均是可选)
      • 获取seq(ack消息不需要)
      • 编码器(不通类型的消息编码操作不同)
      • 打包
      • 获取发消息时间
      • 发送前回调
      • 发送
      • 加入待ack队列
      • 开始轮询ack队列
  • 消息监听
    • 方法入参
      • 命令号(number/array/string均可)
      • 回调函数
    • 方法应用
      • 业务需求。比如说需要监听某个命令号的消息
      • 自助设置需要监听的命令号以及监听后需要的操作。存放到队列中。方便调用。同时也可以进行自助解除监听。
  • 收消息
    • 消息类型
      • 普通消息
      • ACK
      • PING
    • 方法入参
      • 收到的消息(string类型)
    • 收消息流程
      • 入参判断(如果消息类型是ping包,则默认data为空,简单处理。如果消息needack为true的包,则继续调用send方法发送ack包。)
      • 根据入参中的seqid和command来寻求该消息的发送者信息
      • 如果找到,则做相应处理,比如说完成后的回调方法等。否则,继续从监听队列中,寻求该消息是否被监听中。
      • 如果找到,则调用监听相应的回调方法。否则,就既不是消息返回(或者返回已超时),又没人搭理。不处理。
  • 多tab通信逻辑
  • 多浏览器测试

后端配置梳理

  1. lcs.conf是入口。
  2. conf/ext/httptb.conf。扩展相关。分流分默认和配置两种。

前端配置梳理

  1. codec.js中需要配置命令号和对应proto文件名。
  2. 在static/下建立对应的protos文件夹。

测试点&命令梳理

  • 测试入参格式参照
    • lcs/tools/下的文件im.case来配置
  • 调试工具类:以LCS_DEBUG做开关:$.cookie(‘lcs_debug’,1) localStorage.setItem(‘lcs_debug’, 1);
  • 上线&心跳流程
    • 保证正常上线,多tab公用一条长连接。
    • 保证心跳间隔正确
    • 保证重试策略正确(3次重试)
  • 发送消息类
    • 路由形式
      • 走默认路由发送消息 js执行如下: 先上线,才能获取到列表信息
        req={"cuid":"abc", "data":{"bduss":"X5ZZE1aZjluVlJHMjI4bn56bHJrblRic25XS3VlaXFIWnYyQjdReUhIQ2NZaDlWQVFBQUFBJCQAAAAAAAAAAAEAAADYBQAAYWJjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzV91Sc1fdUd","device":"{\"pversion\":\"1.0.6\",\"_client_version\":\"6.5.7\",\"_client_type\":\"2\",\"push_channel\":\"1\"}"}}`
      		
       L.send(1001,req);
        req={"data":{"kw":"test"}};
        L.send(301001,req);
      		 
        req={"data":{"kw":"test"}};
        L.send(301001,req,function(data){console.log('yujie',data)});
      
      • 走指定路由发送消息
        req={"data":{"kz":8086193}};
        L.send(302001,req);
      

      问题:现有的消息返回均依赖1001上线。需要改变这块逻辑。

    • 入参构造
      • object类型的入参
       L.send({
           command:304001,
           data: {
               "data": {
                   "timestamp": 0
               }
           },
           success: function(data){
               console.log('yujie',data);
           }
       });
      
      • 单个入参形式(测试js入参推移时的发消息表现)
         L.send(304001,{"data":{"timestamp":0}},function(data){console.log('yujie',data)},"pb","pb")
      
  • 监听&解除监听消息 L.on(304001,function(data){console.log('yujie',data)}) L.off(304001,function(data){console.log('yujie',data)})

  • 接收消息 forum_msglogic/ ./redis-cli -p 7975 包含两个值(flushall) 1个是用户名:appid 1个是channelId

      L.onmessage({command:304001,
           data:{"data":{"timestamp":0}},
           success:function(data){console.log('yujie',data)},
           contentType:"pb",
           dataType:"pb"})
    
  • 反推消息

反推消息时会发送一条ACK消息。command为4.但是会超时。为啥不走onMessage那一套流程呢。

command为7时会发送4和9.均需要在http.conf中配置。

  • 主动下线和被动下线

  • 多tab通信

    • socket抢占
    • 多tab收发消息 场景列举: 1、1个tab lcs断口,此时连接断开。这个时候lcs恢复,此时再打开一个新的tab,不会建立socket且后端反推消息不成功 2、

疑问记录

  1. 为什么命令号为object时会走发送的流程。命令号不就应该是数字嘛?
  2. 为什么data为啥会有函数形式的时候?

问题记录

  • “已获取Seq-Id -479387852”连接时获取的seqid有误 – 后端
  • cookie应该设到tieba域。跨域问题怎么解决? –前端
  • cookie长度太长时后端无法解析。 —后端
  • 发送301001消息时,显示发送,但是js会报错:Uncaught Error: Illegal wire type in unknown group 14: 7。 错误文件为lcs.js。
  • 系统命令号写反了
  • 解除监听时不对系统命令号做提示
  • is_push字段的意义!解除对系统命令号的监听

几个有趣的分享

  • 性能压测辅助
  • js的一些小特性