bfwsoa框架高并发请求的同步异步缓存策略及队列访问机制
当一个系统如果每次的操作能直接访问数据库的话,也没有限流,那么一旦遭遇cc攻击,数据库服务器就能崩了,我们应该就数据库的访问进行限制,用户访问的永远是缓存,不会直接接触数据库,而缓存的过期时间和更新全部由一个异步的cli来执行,这样进行排队更新缓存,前端结合nosql内存缓存进行高并发请求,一旦缓存过期,另一个cli中的就会搜到过期提醒,立刻更新缓存,即时有100万人访问,读的都是缓存,只有一个进程负责更新缓存。同样的是写入请求也要排队。下面我来讲讲bfwsoa如何开启异步缓存与队列请求执行。

首先确保Public/index.php入口函数的app_root要是这样的。不能直接使用../

一、异步缓存
异步缓存就是说缓存读与缓存更新是两个进程,默认是同步,就是cache_expire_strategy这个配置是syn

,如果单独设置某个client cache会异步,可以设置client的cache方法的第二个参数为true表示开启异步缓存更新。

这样全局是异步的,这个参数不写或设置false都不会影响全局是异步的,这个缓存的过期处理是有cli命令行中执行队列式一个一个更新,前端获取的缓存是不过期的,不会去触发数据库的更新,更新缓存全部由php cli命令行中消息队列读取 过期自动更新。

二、异步任务
异步任务也是,任务提交后给出一个任务id,一个cli进程读取队列消息执行命令
app下的Config.php中定义那些service是需要加锁或异步队列执行的。

例如client_order服务下的bid方法需要按队列执行,并且每个报价请求只能执行一次

然后业务代码中执行 下面的,如果发现data中包含queuerequest键值对,说明是异步任务,这个时候获取的是reqid是请求id,通过这个id定时去查询cache是否有结果。

命令行中执行

配合bfwsoa专用的前端ajax封装请求插件bfwrequest.js
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BFWRequest 智能验证码插件演示</title>
<style>
body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
background-color: #f4f6f8;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 50px;
}
h1 { color: #333; }
.btn-group { margin-top: 20px; }
button {
padding: 10px 20px;
font-size: 16px;
margin: 0 10px;...点击查看剩余70%
网友评论0