说明
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
查看评论