Swoole入门到实战(三):图文直播和聊天室模块、系统监控和性能优化模块、负载均衡 - 完结篇

本文主要是介绍Swoole入门到实战(三):图文直播和聊天室模块、系统监控和性能优化模块、负载均衡 - 完结篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、直播、聊天

1.1 图文直播(Redis)

    在线用户处理:
    方案(一):https://wiki.swoole.com/wiki/...(推荐)
    方案(二)redis方案,无序集合Set
    方案(三)swoole-table

    /*** 监听ws连接事件* @param $ws* @param $request*/public function onOpen($ws, $request) {// fd redis [1]\app\common\lib\redis\Predis::getInstance()->sAdd(config('redis.live_game_key'), $request->fd);var_dump($request->fd);}/*** 监听ws消息事件* @param $ws* @param $frame*/public function onMessage($ws, $frame) {echo "ser-push-message:{$frame->data}\n";$ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s"));}/*** close* @param $ws* @param $fd*/public function onClose($ws, $fd) {// fd del\app\common\lib\redis\Predis::getInstance()->sRem(config('redis.live_game_key'), $fd);echo "clientid:{$fd}\n";}
// 获取连接的用户
// 赛况的基本信息入库   2、数据组织好 push到直播页面$taskData = ['method' => 'pushLive','data' => $data];$_POST['http_server']->task($taskData);
    /*** 通过task机制发送赛况实时数据给客户端* @param $data* @param $serv swoole server对象*/public function pushLive($data, $serv) {$clients = Predis::getInstance()->sMembers(config("redis.live_game_key"));foreach($clients as $fd) {$serv->push($fd, json_encode($data));}}
    /*** 基础类库优化,优化两个参数的方法(重要)* 1.集合的添加和删除* @param $name* @param $arguments* @return array*/public function __call($name, $arguments) {//echo $name.PHP_EOL;//print_r($arguments);if(count($arguments) != 2) {return '';}$this->redis->$name($arguments[0], $arguments[1]);}

    Tips:关闭服务后,清除Redis中所有客户端的id

1.2 聊天(connections)

$this->ws = new swoole_websocket_server(self::HOST, self::PORT);
$this->ws->listen(self::HOST, self::CHART_PORT, SWOOLE_SOCK_TCP);
//推荐使用connections这种方式,redis方式也可以
foreach($_POST['http_server']->ports[1]->connections as $fd) {$_POST['http_server']->push($fd, json_encode($data));
}

二、系统监控和性能优化模块

2.1 系统监控

/*** 监控服务 ws http 9911*/class Server {const PORT = 9911;public function port() {$shell  =  "netstat -anp 2>/dev/null | grep ". self::PORT . " | grep LISTEN | wc -l";$result = shell_exec($shell);if($result != 1) {// 发送报警服务 邮件 短信/// todoecho date("Ymd H:i:s")."error".PHP_EOL;} else {echo date("Ymd H:i:s")."succss".PHP_EOL;}}
}// 每2秒执行一次
swoole_timer_tick(2000, function($timer_id) {(new Server())->port();echo "time-start".PHP_EOL;
});

    以‘守护进程’方式在后台执行:

nohup /usr/local/php/bin/php /home/wwwroot/swoole/thinkphp/extend/swoole/monitor/server.php > /home/wwwlog/monitor.log &

    检测:

  1. ps aux | grep monitor/server.php
  2. tail -f /home/wwwlog/monitor.log

2.2 平滑重启

/*** 设置进程名,为后续平滑重启进程* @param $server*/
public function onStart($server) {swoole_set_process_name("live_master");
}        

    reload.sh

echo "loading..."
pid=`pidof live_master`
echo $pid
kill -USR1 $pid
echo "loading success"
# linux 信号控制:USR1 平滑重载所有worker进程并重新载入配置和二进制模块

2.3 nginx 转发到 swoole_server

if (!-e $request_filename ) {proxy_pass http://127.0.0.1:9911;
}

三、 负载均衡

负载均衡:nginx必须是单台,其实nginx特别耗费cpu,需要测试nginx的转发量

 代理 - 代为办理(如代理理财、代理收货等等)

3.1 代理分类

    clipboard.png

1、正向代理:

    clipboard.png

2、反向代理:

    clipboard.png

    clipboard.png

3.2 后端服务器在负载均衡调度中的状态

    clipboard.png

模拟downbackup可通过关闭端口: iptables -I INPUT -p tcp --dport 8003 -j DROP
清理规则: iptables -F

3.3 轮询策略

    clipboard.png

ip_hash:解决了不同请求打到不同服务器问题,从而保证了 sessioncookie的一致性。

缺点:客户端可能会再用一层代理**

    url_hash:

    clipboard.png

3.4 负载均衡示例

clipboard.png

完!

这篇关于Swoole入门到实战(三):图文直播和聊天室模块、系统监控和性能优化模块、负载均衡 - 完结篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993660

相关文章

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from