Swoole怎么通过聚合请求高效实现业务
发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章主要介绍"Swoole怎么通过聚合请求高效实现业务"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Swoole怎么通过聚合请求高效实现业务"文章能帮助大
千家信息网最后更新 2024年11月24日Swoole怎么通过聚合请求高效实现业务
这篇文章主要介绍"Swoole怎么通过聚合请求高效实现业务"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Swoole怎么通过聚合请求高效实现业务"文章能帮助大家解决问题。
本示例选取的背景是并发下单业务。常规情况下,后端创建订单是逐条 insert
的操作。在并发较低的时候,数据库的 insert
操作的确能保持不错的效率,但是当遇到请求数量增多,数据库 频繁地单次 insert
就会让下单业务整体效率变低 (本文简单地假设1次下单=1个 insert
)。
通过上面的描述,其实已经很容易想到需要优化的地方了。类比现实生活中乘坐电梯的场景:一架电梯 装满后再上行,可以最快地缓解人流压力。
下面我们就来用代码简单实现一下我们思路:
pop(1); // 保存1个正常的请求数据 if (!empty($rq)) { $rqQueue[] = $rq; } // 请求数量未达上限或者还有等待次数时, 提前进入下一次循环 if ($times > 0 && count($rqQueue) < MAX_REQUEST) { continue; } // 重置等待次数 $times = MAX_TIMES; // 初始化SQL $sql = "INSERT INTO orders VALUES "; $inserts = []; // 模拟数据验证 $validator = function ($input): bool { // 为了缩减代码, 没有真的做数据验证的处理 array_filter($input); return true; }; // $rqQueue在协程上下文是并发安全的, 所以遍历时不用担心 foreach ($rqQueue as $index => $rq) { list($data, $chan) = $rq; // 这里可以考虑后置执行, 原因是后面可以有一些补救逻辑 unset($rqQueue[$index]); // 判断$chan是否关闭å if ($chan->errCode === SWOOLE_CHANNEL_CLOSED) { $data = null; continue; } $bool = $validator($data); if ($bool) { $inserts[] = "({$data['user_name']}, {$data['amount']}, {$data['mobile']})"; $chan->push(['state' => 1]); } else { $chan->push(['state' => 0]); } // unset($rqQueue[$index]); } $sql .= (implode(',', $inserts) . ';'); // 模拟创建订单落库的逻辑 echo $sql; } }; // 新手要注意这一句代码的位置, 原因是 $server->start() 之后的代码不会执行 go($createOrder); // 路由处理器 $orderHandler = function ($rq, $res) use ($rqChannel) { $chan = new Swoole\Coroutine\Channel(1); // 使用timeout参数模拟超时 $bool = $rqChannel->push([$rq->post, $chan], MAX_TIMEOUT); if (!$bool) { // 关闭$chan $chan->close(); $res->end('timeout'); } if (!empty($data = $chan->pop())) { // 关闭$chan $chan->close(); // 区分成功或失败状态再输出响应 if ($data['state'] === 1) { $res->end(microtime()); } else { $res->end('error'); } } }; $server = new Co\Http\Server("0.0.0.0", 9502, false); $server->handle('/order/create', $orderHandler); // 当前协程容器的终点 $server->start();});
代码整体上还是很容易理解的,变量 $rqQueue
就是类比电梯,暂留请求等待一定时间的次数 $times
就是类比电梯需要等待人流依次进入。当然最在希望读者注意的一点是:在协程环境下,不要使用共享内存而通信,应该使用通信来共享内存。
关于"Swoole怎么通过聚合请求高效实现业务"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
业务
代码
电梯
数据
知识
人流
内存
原因
就是
效率
数据库
数量
整体
次数
行业
订单
逻辑
通信
不同
不错
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
2060数据库
云服务器iis
网络技术学院珠海
在线保险软件开发
网络安全威胁有哪些
安全关联数据库在哪
233服务器
学软件开发需要多少时间
衡阳erp软件开发
互联网服务器安全隐私
如何报考网络安全师
网络安全东华软件
青浦区数据库安防系统制度
凌源网络技术公司
mule监听数据库
网站优化服务器推荐
计算机网络安全论文致谢怎么
如何举报软件开发者
网络安全及服务带来的效益
网络安全人才师资队伍的培养
三大运营商软件开发
业余学习网络安全知识
数据库表设置男女
公司网络服务器费用计入哪个科目
百元购物软件开发
软路由和web服务器
蚂蚁金服 ai 网络安全
网络安全与数据保护的原则
服务器设置C盘
清除数据库