上篇提到PHP通过Gearman扩展调用worker时造成的PHP进程死锁问题(同步模式),今天简单总结下与该问题以及Gearman原理相关的一些东西。
正好最近在学车,就用生活中驾考的实际例子来说明吧。
考试的基本流程是:学员先申请,看当前是否有考试名额,报名成功则到驾考中心参加考试,上车前先在驾考中心的候考厅排队,当轮到自己的时候上车进行考试。
与Gearman的原理相对应的如下图所示:
假设有6个考试名额(php-cgi进程)、3辆考试车辆(worker进程);
有2个学员前来报名参加考试(向PHP服务器发起了两个HTTP请求);
此时为理想的正常情况,资源充足,啥都别说了,直接上车吧,妥妥的~
————————————————— 休息一哈 —————————————————————
话说那俩人正在车上不慌不忙倒桩呢,突然又有3个学员以迅雷不及掩耳到铃儿响叮当之势前来报名参加考试:
厄……不错,名额还有,走着!
ABC三人来到驾考中心一看,还有一个车空闲,甲当即冲到了前面;
木办法啊,BC二人只好乖乖在侯考大厅排队等着
此时对于请求者来说相当于挂起状态,系统开始出现延迟等现象,需要及时考虑解决方案:
如果worker的逻辑耗时太离谱,那就得赶紧查找原因,减少耗时;
如果worker耗时正常,那说明处理能力不足,赶紧增加worker吧。
都说中国人干嘛都爱扎堆,这不,见大家都去考试了,DEF也坐不住了:
可是名额就还剩1个,被D抢先了一步,D也到侯考大厅排队等上车了;
喏,EF只能一人吃了个502 Bad Gateway的闭门羹(注:图中504为笔误,下同);
此时如果还不解决worker瓶颈的问题,那么一段时间后请求会将前端client占用完,这时系统就不仅仅是访问缓慢了,一些用户已经开始出现502错误的页面。
————————————————— 另外的情况 —————————————————————
一般来说都是client数量多于worker,但如果worker富裕client紧张呢?
很明显,瓶颈直接卡在源头,worker再多也木有用。
果断增加client吧~