前言

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

适合

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

聊聊开发中经历的几种后端语言相关推荐

  1. ChatGPT初始,未来十年哪种后端语言更有发展前景?

    1.未来十年哪种后端语言更有发展前景? 我认为未来十年后端开发语言的前景可能会有以下几个方向: Python:Python已经成为了最流行的编程语言之一,在数据科学.机器学习.人工智能.Web开发等领 ...

  2. 浅谈在游戏陪玩开发中常见的几种加密算法及实现

    前言 数字签名.信息加密是游戏陪玩开发前后端都经常需要使用到的技术,应用场景包括了用户登入.交易.信息通讯.oauth 等等,不同的应用场景需要游戏陪玩开发时使用到不同的签名加密算法,或者需要搭配不一 ...

  3. 前端路由||路由的基本概念与原理||在开发中,路由分为:   后端路由   前端路由

    前端路由 路由的基本概念与原理 vue-router的基本使用 vue-router嵌套路由 vue-router动态路由匹配 vue-router命名路由 vue-router编程式导航 基于vue ...

  4. 转:聊聊开发中幂等性问题(*)

    [README] 这是一篇非常棒的, 讲解幂等性问题的post, 感谢原文作者: 转自: https://juejin.cn/post/6844903815552958477 幂等 (idempote ...

  5. 嵌入式开发中常用的几种通信接口总结

    关注.星标公众号,直达精彩内容 在嵌入式系统中,板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线. 以下内容为常用板上通信接口:包括I2C.SPI.UART.1-Wire: I ...

  6. 前端开发中常用的几种设计模式

    设计模式概览 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案.设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式.学习设计模式更多的是理解 ...

  7. c语言改变cmd 字体大小_嵌入式开发中常见3个的C语言技巧

    原文:https://www.cnblogs.com/CrazyCatJack/p/6080266.html 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数 ...

  8. 在web开发中,为什么前端比后端更得到转行程序员的青睐?

    通过各大招聘网站上都可以看出,前端工程师是一个很大的缺口,很多企业愿意用高薪来聘请优秀的前端开发工程师.前端在互联网中越来越受到大家的青睐,所以,近几年学前端的人也逐渐增多.具体前端比后端有哪些可见优 ...

  9. 在web开发中,为什么前端比后端更得到转行程序员的青睐?必看

    1.Web开发分类与区别 人们通常将Web分为前端和后端,前端相关的职位有前端设计师(UI/UE),前端开发工程师,后端相关的有后端开发工程师. 2.技术栈区别 在各大招聘网站上,公司对前端开发工程师 ...

最新文章

  1. iOS 跑马灯封装(带点击事件)
  2. 201-3-19李宏毅机器学习视频笔记七(游戏解释Gradient Descent)
  3. 包子和饺子之扫地机器人_智能家居篇之扫地机器人
  4. HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)
  5. MFC CListCtrl 取消选中
  6. My favorite books
  7. mingw64 下 java,如何安装MinGW-w64和MSYS2?
  8. linux脚本判断流程控制,Shell 脚本-6- 流程控制之判断分支
  9. JavaWeb --第四章Maven详解
  10. Linux的实际操作:用户管理(用户组的管理groupadd useradd usermod)
  11. php下载 微信头像图片_php 下载微信头像
  12. 高级GIS-1.提取纯净像元
  13. android 自定义searchview,android自定义searchView圆角
  14. windows默认共享的打开和关闭
  15. mybatis的Mapper文件中的大于小于号,为什么要转成“lt ;”、“gt ;”,转义后的lt、gt又代表什么?
  16. 克隆一个自己的 AI 来上网课,
  17. USB过压过流保护芯片,可调限流4A,6V过压关闭
  18. Java基础--继承案例(二)
  19. 你可能不知道的 new.target
  20. jdk动态代理proxy

热门文章

  1. 蓝桥杯算法提高VIP-贪吃的大嘴
  2. html5中如何分区,win7磁盘管理怎样给新硬盘分区
  3. u盘如何在计算机应用内存,怎么把u盘当电脑内存来使用,详细教您如何操作
  4. 前端ui框架layUI
  5. 谷歌浏览器开发者模式,屏幕类型选择
  6. springmvc与thymeleaf集成_晏无心_新浪博客
  7. Noip2021模拟赛题解
  8. 如何查java当前负载_linux进程和线程排查 · 记一次JVM CPU高负载的排查办法
  9. vscode怎样彻底卸载干净
  10. 女性排卵期的七个表现,把握住提前当宝妈