最近项目被俩次质疑了一个问题,就是后端服务是go写的,前端用node+react,node做go服务接口请求拿到数据和html渲染整合,下发到客户端这样的模式。但是,为什么用node,不直接用react写页面就好了吗? 我的点主要是解决技术问题:
- node对于ssr有很好的技术支持,使用就很方便
- 页面有多个请求,放在react就很重,在node层做聚合降低复杂性。
被质疑的点:
- node作为中间层瓶颈就放在node端了,多加一层收益小,影响大
- node的稳定性和go差距很大,容易出事故 面对这个质疑大家有什么看法吗?
语雀全站都是node,有故障吗?双十一大促ssr去年qps相当大,不稳定吗?
本质上还是人的问题,如果后端人闲的蛋疼就让他做,比如用go+react写一个ssr,他们如果愿意做也挺好的
直接请求数据库吧,,不用请求go了,和老板说,不用他们了,工资加百分之五十就行。。 最终老板和你双赢,, 云原生微服务下,,还请求他干啥。。
- 对直出效果有一定追求的是可以整的, 且团队对可能会出现的代码安全,内存泄漏能够及时解决,因为业务的代码的质量可能高低不齐
- node 一般搭配一个 nginx 做兜底,稳定性还不错
说稳定性的问题,这个锅node不背 应用的稳定性是多种因素作用的结果,和语言没有必然的联系
质疑就质疑,继续做下去,不case就可以。
node的稳定性和go差距很大,容易出事故 面对这个质疑大家有什么看法吗?
年经问题了,你不如问问他,node 稳定性差在哪,容易出什么事故,我很好奇他会怎么回复
这个问题像是“哪个编程语言是最好的语言”一样
不论是编程语言,还是某种技术,都有优缺点、适用场景
还有最重要但经常被忽视的就是,个人喜好和专长
即使搞房地产可能挣钱更多,但是我的专长是写代码,所以即使目的是赚钱,我也会选择做一个码农
因为写代码我还能拿到稳定的工资,搞房地产没准会负债累累
也就是即使某种语言、技术,更适合做某件事,但如果你不熟悉、而非要用的话,可能还不如用一个不那么适合、但你非常熟练的语言或技术
就像今天 jQuery 依然坚挺着,就算不考虑兼容老浏览器、以及其他优点,就凭“顺手”,“不用学新的”,也还是会有很多人用
Node作为大前端的理由
- 接口请求拿到数据和html渲染整合 这里的接口数据一般是指json, node处理json远比go方便快捷得多,因为对于javascript/nodejs而言,json属于自带电池,解析json的时间几乎可以忽略不计。同样的业务,如果用nodejs来做大前端处理json接口数据组装是事半功倍,而goang做同样的事情则是事倍功半
- 越靠近用户界面,需求变动越频繁,越靠近数据库,需求变动相对要少,而nodejs这种动态解释脚本应付前端频繁变动的需求,要比强类型编译性的golang要方便高效,更别说golang里面各种奇葩的强制规定,定义变量不使用编译不通过,依赖的导入的包没有显式调用,编译不通过 大括号另起一行,编译不通过 多个变量的重复声明没有新变量,编译不通过 。 如果你非要用golang来应付频繁改动的需求,你会发现你大量的时间在不停注释变量然后编译和去掉注释再编译之间来回切换。 最后的结果就忍无可忍,无需再忍,终于有一天和产品经理打起来
- nodejs基于单线程,事件循环的调度模式要比golang锁竞争的调度模式稳定得多。 为什么很多码农会有nodejs不稳定的幻觉呢,因为js松散的语法即使不写异常处理那怕裸奔也能跑(没有强制review的公司的码农一般倾向不写try catch) ,而B站的golang码农即使强制把err != nil写满半个屏幕服务器照崩不误。 实际上事件循环除了写法有点怪异(这一点随着async/await语法糖的引入在逐步改善)是应付资源竞争的最优方案,在业务量逐步增加的条件下竞争度依然是常数, 意味着线下测试环境的代码跟线上高并发业务的表现结果是一致的,而基于锁竞争的调度策略在小数据量的时侯貌似很稳定,随着业务增加竞争度指数级增加, 需要各种各样的sync应付花样翻新的deadlock, golang码农经常面对的就是自己线下跑得好好的代码,上线以后就出现各种薛定谔的bug, 而在线调试要远比线下测试环境调试要困难得多,这时侯土憋老板不是反思自己选择了错误的解决方案,而是让golang码农连夜加班加点调bug ,坚信码农免费加班加点的努力可以大于老板的错误选择 ,然后996就开始了,然后什么跳动的码农忽然以头抢地一动不动了,代码还在跳动,golang码农永远不动了,然后就没有然后了
总结一下大家的看法,也是我会去反驳的理由:
- node其实是很稳定的,有双十一这种巨量级的产品也是用的node,足以说明稳定性,好像你也没有真实数据表明node不稳定在哪里,处理能力差在哪里
- node对于ssr有很好的技术支持,能解决浏览器性能不足运行初始JS卡顿的技术问题
- node处理json、代码变动成本更低
- golang的奔溃不比node少,还真的没有高低之分
@LiuWeiMr nodejs作为中间层能够利用其异步,并发来聚合后端多个接口,同时能够解决一些后端做还是前端做的扯皮问题。 稳定性差的问题,虽然不是nodejs本身的问题,但也确实有这样的表现,主要原因是有两方面吧
- 很多非专业的前端来开发nodejs,写出来的程序确实不合格。
- nodejs上投入的资源少。有专人做架构吗?有完善的基础设施吗?分配的人力占比是多少?
@yakczh 黑golang 就服你,哈哈哈哈
@ganshiqingyuan 就事论事 有论点还要有论据支撑 同样写的高并发网站,为什么nodejs码农没有瘁死的, 就算写nodejs 乱写一气也写不到让码农瘁死的地步,你好好想想这里面的技术原理
@yakczh 你说的很对,