/首页
/开源
/关于
《GM技术这两年》之重构篇(三)
发表@2018-12-17 00:33:42
更新@2023-01-21 22:47:40
重构用什么?当然是用swoole!反正给钱也不多,放开了玩,敞开了玩,尽情地玩,玩得开心,玩得欢乐... ... 反正,又不是我的产品和公司,大不了删联系方式跑路... 相对于LAMP或者LNMP,swoole有如下几个优势值得我们注意: - swoole进程都是常驻内存的,包括解析过后的PHP代码也会常驻内存,不会反复解析。而Apache或者FPM,虽然进程本身都是常驻内存,但是PHP代码解析运行完毕后,下次还需要重新解析 - swoole的PHP代码解析后都是常驻内存的,意味着mysql和redis等连接将会是长连接。而Apache或者FPM,一次连接使用完毕后,下次使用需要重新连接,在并发量大的情况下,反复建立销毁连接是一笔不菲的开销(不过你可以选择使用pconnet连接池来缓解这个问题) - 上述两条都是比较明显的优势,最后我认为,swoole还有最大的优势就是可以写异步PHP代码。说实话,这句话不太容易理解,我认为你可以先背过,总有一天,你会明白的;当然了,也可能你一辈子也不会明白 私以为,我对重构GM这个项目是非常用心的。以往说,对于外包的态度标准就是“又不是不能用”就行了,我认为,我对GM APP的态度已经远远超出“又不是不能用”的标准线了。 当时已经是2016年的7月初了,吴亦超跟我和于巨蛀说“你们看吧,反正我手里也就这俩子儿了,我说的都是实话,也没必要骗你们。我还是希望你们能好好做一做的,对于我们来说,这是我们最后的一次机会了”,由于对方态度十分诚恳,我曾经一度感动地留下了泪水。其次,这个APP的数据真的是十分漂亮,在没有任何推广资源的情况下(反正也没钱推广)一天就可以得到将近破百的新增用户量,这个量是我接过的所有外包中数据最牛逼最靠谱的一个。 不!不! 是我干过的正职工作中,数据最漂亮的一个! 所以,我打算好好做、用心做、塌实做。一来是不砸自己的口碑;二来是万一这玩意做成了将来自己一定会考虑全职,如果这会儿代码搞得太烂,就是给将来的自己挖坑。 最后是,我在白鹭引擎一直在力推swoole这个东西。我负责的项目我已经在生产环境全线换上了swoole,但是白鹭引擎是面相开发者的东西,用户量总是少得可怜,我自己做的一些东西,很多特性特征以及一些理论根本无法得到验证,急需一个有流量的场景进行验证和试错,我认为GM是个绝佳的机会! 综上所述,除了从技术层面考虑出发外,从非技术方面也都考虑的十分充足,于是就敲定了:swoole! 还是老一套,我认为在先理解一个东西之前,最有必要理解他的进程(线程)模型,这很重要。 #### PS:行军打仗时候,都是要看清楚轮廓制定好了大的战略后,才考虑着眼局部战斗方案。比如当年华野吃掉张灵甫的美械74师,大的战略就是“肉中挖肉”,但到了孟良崮具体怎么干,那就是另外的战术细节了。 我特意用红黑配色来画swoole进程模型,一方面除了红黑配比较炫酷外, 还代表着彪悍的性能: ![](https://ti-node.com/static/upload/6480092016645505024) PS:上图是本田著名的红头发动机,红黑的搭配,再加上咆哮而出的声浪,是不是觉得很热血?为什么做成红头呢?传说是因为PM给当时本田发动机的研发提了一个 “ 老板说了,高转速时提速太慢,必须要快。我不管,反正是老板说的 ” 这样一个需求,研发听到后一口老血吐在了发动机盖子上,说时迟那时快,就在这一瞬间,研发突然想到了一个非常牛逼的算法解决PM提的需求,这就是红头发动机的来历。 ![](https://ti-node.com/static/upload/6480093504797147136) swoole的进程模型总体来说是比较复杂的,按照角色去分的话,swoole的进程一共可以分为三类: - Master进程 - Manager进程 - Worker进程,其中Tasker进程也属于Worker进程的一种,是一种特殊的Worker进程 其中,Master进程是个多线程的进程,包含了Main线程和Reactor线程。Main线程主要用于accept链接、接受响应信号,Main线程会将accept的链接按照一定算法分配给Reactor线程,然后后面的网络数据IO则靠Reactor线程与客户端完成。Reactor线程会将收到的数据通过管道的方式传递给Worker进程(注意不包括Tasker进程)。 Manager进程是由Master进程fork出来的,主要负责管理Worker进程,包括fork worker进程、监控worker进程状态、重新拉起新的worker进程等等。 Worker进程由Manager进程fork而出,Worker进程中你可以使用同步阻塞的方式进行PHP开发(这个时候的开发模式和传统的LNMP\LAMP开发是一样的),同时如果你对自己自信爆棚,也可以选择纯异步方式搞业务开发,一般说来,如果自己不想作死,还是请大仙儿老老实实用同步阻塞的方式搞。Tasker进程是一种特殊的Worker进程,天峰说这个东西就是用来解决一些特别耗时的PHP任务的。假如你的业务逻辑中有一些耗时任务长期占用Worker进程,你就可以将任务由Worker进程投递给Tasker进程从而解放Worker进程。数据从Worker进程到Tasker进程的进程间通信方式默认是unix socket,也可以通过配置修改为消息队列,总之一句话,你开心就好。 swoole可以对外提供TCP服务器、UDP服务器、Websocket服务器以及http服务器,这意味着,我们可以不用再在服务器上安装Nginx、PHP-FPM或者APACHE之类的软件了。swoole本身就已经基于epoll实现了异步非阻塞的高并发的服务器! 实际上,进程模型如此复杂,当时我自己真实心情是忐忑的,有两方面: - 一是怕自己搞不定 - 二是怕这玩意不靠谱 正在我自己信心不满硬着头皮做这个东西的时候,我女神突然就出现在了我的脑海里,她冲着我大声疾呼: ![](https://ti-node.com/static/upload/6480102443324538881) 我认为,当一个业务需求摆到你面前的时候,你首先要做的就是进行方案选型评估,评估是考验衡量一个人技术理论是否扎实十分重要的一个方面。因为你只有对各种方案的原理和实现都比较熟悉,他们的优缺点尽收眼底,才能运筹帷幄,才能做到“手中有粮,心中不慌”。