原生php协程异步mysql方案

       最近因为做统计,有些部门需要一次性展示几十项数据,而每项数据是单独查询且都有可能跨多库,但查询的库均是从库,访问量不大,看了下服务端和数据库的cpu,内存峰值也不是很高,于是想着要不要用多线程+连接池的方式去执行。在经过一番权衡和试验后选择了协程与连接池的搭配,原因很简单,省事,好维护!哈哈~~~~

注意:此方案适用于数据库资源富余的情况,否则会出事的!!!对于资源不足的优化SQL,增加配置,负载均衡等等才是关键

因为本文主旨是提供思路,方案,此处不提供基础知识介绍,关于协程可以去了解下以下几点:

1. 操作系统调度算法---时间片轮算法

2.进程,线程与协程的区别

3.再根据鸟哥这篇文章结合代码敲一敲应该理解得差不多了http://www.laruence.com/2015/05/28/3038.html

关于连接池的话随便搜一篇文章应该就能理解,理解所有的这些前提是你要知道你平时写的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;

发布了17 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wufantastic/article/details/90596908