聊聊开发中经历的几种后端语言
前言
谈这个话题,没有任何语言之争,只是个人开发的经历。
适合
开发语言的选择只是当时条件下适合每个项目或者每个团队乃至每个公司的最佳选择,并不是说XXX公司也用这个我们用这个肯定没问题。
当时还在某手机公司,有次跟某公司后端leader聊天的时候,我说我们现在一些高并发的场景的项目都在用lua开发,那哥们说了几句,你们XX手机现在都流量这么高了,Facebook 微博都在用PHP开发,你们的量都超过微博了。然后,后面没法聊了,不知道该怎么接这茬了。大家都了解的是,Facebook在很多年前已经开发了HHVM来优化PHP的性能,对PHP的了解和熟悉已经将PHP用到了极致了。微博也一直在用PHP,鸟哥在微博作为技术专家工作了很多年,后面微博PHP的版本升级也有鸟哥兜底,所以这种大型的公司,不管使用何种语言都有会资源上的保证,小公司是没法比的。
所以选择适合的语言,有适合的人和资源保证,才是王道,公司和个人心里才有底。
我们公司现在是这样选择的,后台管理系统一般用PHP开发,前台的一些简单项目比如短连接服务、跳转服务等等的都使用lua开发,中间件项目,服务项目抽奖、插屏、消息服务等使用GO开发,当然了,主要对外的几个高访问量的项目也使用GO开发。LB上的安全防火墙也是使用lua开发的。
原则就是,对外的高访问量的项目和中间件的项目使用GO开发,简单项目,LB上的需求都是使用lua开发,后台管理系统使用PHP开发。
PHP
PHP这门语言,应该是算我开发时间最长的语言了。专门的WEB开发语言,优秀的开源框架、开源项目数不胜数,开发便捷,容易入门,是中小型公司热衷的选择。还有PHP的新版本7.X之后对性能成倍级的提升,加上高性能的异步并发的通信网络服务swoole的加持,让PHP换发出了第二春,性能上对80-90%以上的项目已经不存在问题了。当时我们支付系统使用的swoole,确实解决了很多痛点。到现在,项目的选择都是优先想到PHP。
原来的公司有个访问量比较高的应用,每天3K万的请求量,到现在还是使用的PHP,使用了四台机器,两台机器提供API,两台提供后台服务,性能上一点问题也没有,即使将来性能上有问题了,加一两台机器,再抗几年也是没问题的,出过几次事故,都是MySQL的问题,跟PHP本身没有任何关系,还有很多项目每天几百万的请求量,都是PHP开发的。所以前面说了,80-90%以上的项目根本不会有性能的问题。
高并发大流量的场景还是有些限制的,比如抢购秒杀等等。我们每次新品发布的时候,前面阶段加上限流,逻辑上为了达到每秒3000多单的下单率,每次活动前,都需要把机器从平常两三台加到8台,来满足3000多的下单率。
lua
lua作为后端语言,主要是指OpenResty。OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。简单的将openresty的lua理解成Nginx就可以了。
之前也研究过一段时间的openresty,但都处在学习和练手的阶段,没有开发过生产的项目。使用lua开发高并发的项目,是因为当时有个项目,困扰了我们很长时间。大概是这样的,每天凌晨0-2点,会把昨天的日志打包上传到服务器,每天的这个时候,四台的机器的负载都在80-90以上,服务基本上处于不可用的状态,过了凌晨2点,服务慢慢就会恢复,想了很多办法都未能解决这个棘手的问题。后来就尝试使用lua将项目重写了下,写完之后就灰度发布到一台机器上了,观察了一段时间,发现这台机器在0-2点负载最高是5,基本上解决了我们的问题,观察经过了安全期后全部发布。下面是当时修改之后的监控数据的截图,修改之前的截图找不到了。
后来就深入研究了openresty,找一些开源的框架,发现了vanilla,Vanilla是一个基于Openresty实现的高性能Web应用开发框架。后来的一些高并发的项目或者接口就使用lua重构了一次。整体上还是比较满意的。
golang
golang的语言的使用应该算是一个水到渠成的事情。前期一些高并发的项目都是用lua开发,优点是解释型语言,写个小的项目或者网关上waf类的项目,可以说相当适合,即改即生效,网关上拉个黑名单,限流限频调整配置等等。弊端也越来越明显,面向对象是使用lua的metatable实现的,很弱很弱,手误或者写错或者有BUG很难及时的定位到,有问题了经常需要调试老半天,或者写一两天代码需要半天时间调试,相当影响开发效率和定位问题的效率。急需一种新的方案来解决高并发的场景,然后Golang就骑着大白马来了,当时可选方案很少,只有Java和Golang,团队成员都是PHP出身的,转战Java的代价太大成本太高。相比之下,Golang就容易的多,入门简单,专为为高并发而生,他爹Google又令人这么放心。唯一担心的就是,原来接触的PHP Lua都是解释型语言,写游戏的时候倒是使用过几年actionscript3,但是写客户端程序和写服务器程序是有天壤之别的。使用了Golang之后觉得担心是多余的,相当顺手,现在是越来越喜欢了。写了一天代码之后下班的时候编译一下,解决掉几个编译错误之后基本上就没其他问题了,第二天测试下就可以发布了。使用解释型语言的时候哪有这么顺利过,一般得调试老半天,一度都以为自己半年来技术都牛逼到这个程度,差点都离职去面试阿里的P10了,O(∩_∩)O哈哈~。直到使用解释型语言的时候就回到现实了,自己还是以前的哪个自己...... 总之,挺好用的,值得尝试下。
技术人得有点追求
很多年以前,我们的技术负责人说过一句话,我们问,PHP+MYSQL已经能满足80-90%的项目需要,为什么还有那么多人和小公司去冒着风险去尝试新的技术、新的语言,新的异步方式、新的消息队列,他说过的话至今记忆深刻,你们说的都对,但是技术人得有点追求啊。
多尝试,只会有好处没坏处。一些小的独立的项目试试新的实现方式,效果也许会令人大吃一惊,更优的解决方案就慢慢呈现出来了。