飞道的博客

推送V2 - 开发笔记整理

357人阅读  评论(0)

说明

1.代码整洁之道

第一期的推送有很多不确定性,代码的扩展和阅读都造成了很多麻烦,所以要自我革命,在功能点不变的基础上重新编写。

代码整洁之道的几个基本点:

1.一个函数只处理一个功能,和参数个数最好不超过4个
2.增加代码可读性,尽可能的不加注释
3.注意编码的格式和段落
4.增加对象内部的高内聚,低耦合
5.面向对象设计原则:单一职能、依赖倒置、高内聚

之前高内聚这个词听过好多遍,直到读完代码整洁之道才明白具体的含义,它是指对象中定义的属性尽可能的被程序所使用。

在下面的代码里,我把要执行的程序分成了四个部分,接收参数、验证参数、执行逻辑和返回结果。

use App\Utility\Ws\Params;
use App\Utility\Ws\ParamsCheck;
use App\Utility\Ws\Result;
use App\Utility\Ws\Category;

namespace App\WebSocketController\V1;

public function login()
{
   
    //接收参数
    list($token,$syncstamp) = Params::LoginParams ( Category::CLIENT_TYPE_PC ,$this->body['token'],$this->body['syncstamp']);
    //验证参数
    $msgErrorRet = ParamsCheck::checkTokenAndSyncstamp($token,$syncstamp);
    if(!empty($msgErrorRet))  return $this->response()->setMessage(json_encode($msgErrorRet));
    //处理逻辑
    //...
    //返回结果
    $result = Result::getLoginResult(Category::CLIENT_TYPE_PC,$uid,$syncstamp);
    $this->messageBase($result);
    return true;
}

分离Base基类、Error、V1 和 V2,使Controller 代码结构更整洁

├── Base.php
├── Error
│   └── ErrorMessage.php
├── V1
│   ├── AndroidMessage.php
│   ├── H5Message.php
│   ├── IosMessage.php
│   └── PcMessage.php
└── V2
    ├── AndroidMessage.php
    ├── H5Message.php
    ├── IosMessage.php
    └── PcMessage.php

Utility 需要使用的类库,针对Http 、 WebSocket进行分层。

├── Http
│   ├── Curl.php
│   ├── OAuth.php
│   ├── ParamsCheck.php
│   └── Response.php
├── Mall
│   └── SendMall.php
└── Ws
    ├── Category.php
    ├── ParamsCheck.php
    ├── Params.php
    └── Result.php

2.网络优化

推送一期上线后,每天入库9800/ * 128 天,56800 * 128 / 周,峰值链接数4w+左右,因为项目一期时属于技术探索阶段,重新梳理了业务逻辑,有很多需要优化的地方。

1.推送消息体优化

优化前结构体

{
   
    "uid":2546,
    "msg":{
   
        "rid":2546,
        "uid":177263,
        "top_rid":2546,
        "module":"novel",
        "module_name":"盛世宠妃,倾国女帝",
        "module_id":163838,
        "module_nid":163838,
        "comment_uid":176986,
        "comment_nickname":"wireshark",
        "content":"560第560章宣伦的复仇大计560第560章宣伦的复仇大计560第560章宣伦的",
        "gift_id":0,
        "gift_name":"",
        "gift_number":0
    }
}

优化后

{
   
    "uid":2546,
    "msg":{
   
        "comment_uid":176986,
    }
}

备注:保留msg结构体,方便下次更新代码。

2.Redis存储消息体优化

优化前的结构体

{"noce_ack":"C0369AA1-FF10-0E85-3BB9-988970AD1033","to_uid":"177477","is_sent":1,"is_read":0,"msg_type":4,"client_type":0,"msg_extend":"","create_time":1618555705,"update_time":0}

优化后

{"noce_ack":"DD93657C-EC25-236A-913E-001DDBE0D235","to_uid":"177477","create_time":1618478951}

占用内存容量 从515 bytes(字节) 优化到94 bytes(字节)。

程序测试

有一个编码思想我深以为正确,就是用程序测试程序,至于怎么实践才是最佳实践,下面的程序是使用Js来模拟一个用户的请求(登陆->查询未读数)。

var websocket = null;
        var env = data.field.env; //0本地 1测试服 2正式服
        var uid = data.field.uid;
        var token = '34ab0761fcfa12e5330243192f586569';
	    var wsHost = 'ws://swoole-msg';
        var wsName = 'dev';	 
		 
		websocket = new WebSocket(wsHost);
		

        //连接成功建立的回调方法
        websocket.onopen = function(event){
            setMessageInnerHTML("<span style='color: #39cc39;'>" + wsName + " : client connect success!</span>");
            if(websocket.readyState == 1){
                login();
            }
        }


        //接收到消息的回调方法
        websocket.onmessage = function(event){
            
            var responseData = JSON.parse(event.data);
            //console.log(responseData);
            switch (responseData.msg_type) {
                case 2:
                    console.log(responseData);
                    if( 200 == responseData.code ){
                        var log = "<span style='color: #39cc39;'>log success!uid: <b>"+ responseData.uid + "</b></span>";
                    } else {
                        var log = 'log error ! ' + responseData.msg;
                    }
                    setMessageInnerHTML(log);
                    if(responseData.uid && responseData.uid > 0){
                       // pull(responseData.uid);
                        UnReadAll(responseData.uid);
                        UnReadFromComments(responseData.uid);
                        UnReadToComments(responseData.uid);
                        //test(responseData.uid);
                    }
                    break;
                case 10:
                case 11:
                case 12:
                    console.log(responseData);
                    break;
                default:
                    var log = 'default! ' + responseData.msg;
                    setMessageInnerHTML(log);
                    //console.log(responseData);

            }
        }

        function login(){
            var msgData = '{"client_type":1,"msg_type":2,"syncstamp":"20200120210000","body":{"token":"'+token+'"}}';
            //var msgData = '{}';
            var params = 'login:传递参数:'+ msgData;
            setMessageInnerHTML(params);
            websocket.send(msgData);
        }


        function UnReadAll(to_uid){
            var msgData = '{"msg_type":10, "client_type":1, "syncstamp":"20200120210000", "body":{"to_uid":'+to_uid+'}}';
            var params = 'UnReadAll:传递参数:'+ msgData;
            setMessageInnerHTML(params);
            websocket.send(msgData);
        }


        function UnReadFromComments(to_uid){
            var msgData = '{"msg_type":11, "client_type":1, "syncstamp":"20200120210000", "body":{"to_uid":'+to_uid+'}}';
            var params = 'UnReadFromComments:传递参数:'+ msgData;
            setMessageInnerHTML(params);
            websocket.send(msgData);
        }

        function UnReadToComments(to_uid){
            var msgData = '{"msg_type":12, "client_type":1, "syncstamp":"20200120210000", "body":{"to_uid":'+to_uid+'}}';
            var params = 'UnReadToComments:传递参数:'+ msgData;
            setMessageInnerHTML(params);
            websocket.send(msgData);
        }

        //将消息显示在网页上
        function setMessageInnerHTML(innerHTML){
            document.getElementById('message').innerHTML += innerHTML + '<hr>';
        }      
        return false;
      });
    });


转载:https://blog.csdn.net/xuezhiwu001/article/details/115761717
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场