聊聊开发中经历的几种后端语言

前言

谈这个话题,没有任何语言之争,只是个人开发的经历。

适合

开发语言的选择只是当时条件下适合每个项目或者每个团队乃至每个公司的最佳选择,并不是说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%的项目需要,为什么还有那么多人和小公司去冒着风险去尝试新的技术、新的语言,新的异步方式、新的消息队列,他说过的话至今记忆深刻,你们说的都对,但是技术人得有点追求啊。
多尝试,只会有好处没坏处。一些小的独立的项目试试新的实现方式,效果也许会令人大吃一惊,更优的解决方案就慢慢呈现出来了。

原文地址:https://www.cnblogs.com/feixiangmanon/p/11706676.html

时间: 2024-10-13 20:07:10

聊聊开发中经历的几种后端语言的相关文章

Android开发中单元测试的两种方式

Android开发中单元测试的两种方式 一位优秀的程序员也同样不能保证自己的程序没有bug,因此编写合适的测试程序是完全有必要的,这样也会降低程序在后期出现各种奇奇怪怪bug的可能,降低维护成本,未雨绸缪将bug扼杀在摇篮之中. 看到网上有很多依旧用写java单元测试的方式在写android程序的单元测试程序--junit,当然我一直都反感将不合时宜的东西强搬到新的技术应用以获取一席之地的这种做法,不断的应用新的方法提高效率,完善程序才是真理!废话不多说,直接说到今天的重点:Android开发中

android开发中监听器的三种实现方法(OnClickListener)

Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v)). 二.监听器的三种实现方法 (以OnClickListener为例) 方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener

前端开发中常用的几种图片格式及其使用规范

在介绍图片格式之前,首先说一些额外的东西. 矢量图与位图. 矢量图是通过组成图形的一些基本元素,如点.线.面,边框,填充色等信息通过计算的方式来显示图形的.一般来说矢量图表示的是几何图形,文件相对较小,并且放大缩小不会失真. 这里有一点要注意的是web开发中用到的图片都不是矢量图,即使是一个三角形,只有一个边框,都是位图. 那么矢量图在哪里有用到呢? 我目前的知识池就知道一个图标字体,比如 font-awesome 目前在前端的开发中常用的图片格式有三种:jpg,png,gif.这些都是位图.

iOS开发中常用的几种设计模式

下面是iOS开发中比较常用的几种设计模式.详情如下所示: (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求.列表row个数delegate自定义的delegate (二)观察者模式应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息.优势:解耦合敏捷原则:接口隔离原

嵌入式开发中常见3个的C语言技巧

Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数的入口地址赋值给指针.这样就可以通过指针来访问函数.还可以把函数指针当成参数来传递.函数指针可以简化代码,减少修改代码时的工作量.通过接下来的讲解大家会体会到这一点的. /*函数指针简单讲解 *通过指向函数的指 *针调用比较两个数 *大小

详解Android开发中Activity的四种launchMode

Activity栈主要用于管理Activity的切换.当使用Intent跳转至某个目标Activity,需要根据目标Activity的加载模式来加载. Activity一共有以下四种launchMode: 1.standard:默认,每次使用Intent跳转到目标Activity时都创建一个新的实例.坏处是每次进入都要创建新的实例,执行OnCreate方法. 2.singleTop:如果要跳转的目标Activity正好在task的顶部(说明当前肯定不在目标task里,例如我在微信首页,然后想使用

在web开发中的href几种跳转方式

第一种: <input name="AddDic" type="button" class="frm_btn" id="AddDic" onClick="javascript:window.location.href='<html:rewrite action="/control/product/type/manage"/>?method=addUI&parentid=$

ANDROID开发中定时器的3种方法

在android中,经常用到的定时器主要有以下几种实现:一.采用Handler与线程的sleep(long )方法二.采用Handler的postDelayed(Runnable, long) 方法三.采用Handler与timer及TimerTask结合的方法.下面逐一介绍:一.采用Handle与线程的sleep(long )方法Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释.1.定义一个Handle

ui开发中常用的几种框架

由于最近心血来潮,想做个XX系统,几乎尝试完了常用 的几种ui框架, 1.easyui  这东西,简单,上手快,控件丰富,api详细,控件的属性方法啥的我用起来很顺手,性能有点差,遗憾的是商业化需要付费 2.extjs 我感觉除了性能要比easyui 好之外,其他的对于一个新手来说,都要差些,商业化也需要付费 4.ligerui 感觉没什么人用,控件不全,api不详细,对于我这样的新手来说还是算了 6.jqueryui jquery团队开发的,肯定是杠杠的,只是控件有点少,对于我这个英文菜鸟来说