最近因为做统计,有些部门需要一次性展示几十项数据,而每项数据是单独查询且都有可能跨多库,但查询的库均是从库,访问量不大,看了下服务端和数据库的cpu,内存峰值也不是很高,于是想着要不要用多线程+连接池的方式去执行。在经过一番权衡和试验后选择了协程与连接池的搭配,原因很简单,省事,好维护!哈哈~~~~
注意:此方案适用于数据库资源富余的情况,否则会出事的!!!对于资源不足的优化SQL,增加配置,负载均衡等等才是关键
因为本文主旨是提供思路,方案,此处不提供基础知识介绍,关于协程可以去了解下以下几点:
1. 操作系统调度算法---时间片轮算法
2.进程,线程与协程的区别
关于连接池的话随便搜一篇文章应该就能理解,理解所有的这些前提是你要知道你平时写的PHP (指FPM,不是用FPM的同学就肯定不用看这句了 哈哈 ) 是多进程模型的。
关于连接池,我当时是想用其他语言去写一个,但是在连接协议上处理比较麻烦,我想过用thrift调用(嫌麻烦,后续再研究),但这时候偏偏发现了一个很棒的项目SMProxy: https://github.com/louislivi/SMProxy 他们采用的就是mysql的协议,本身也带读写分离,这样对已有的项目就无须有太多的修改了。但是php的mysql客户端只有mysqli支持协程,平常各大框架使用的都是PDO,所以这中间可能需要权衡一下,具体可参考下向facebook学习,通过协程实现mysql查询的异步化。以下主要是一些测评演示,demo将上传至我的github上 https://github.com/wufantastic/php-async-linkpool-mysql ,欢迎各位star。
无协程:
mysql直连 连接池
有协程:
mysql直连 连接池
另外本次测试mysql协程查询是通过锁表,然后show full processlist来操作的
lock tables t1 write;
show full processlist;
做完实验记得unlock tables;