使用Go语言代替node.js实践

  使用Go语言到生产环境已有半年,其优秀的性能,内存管理及便利的Goroutine让人爱不释手。Go在语法上比较保守严谨,因此代码的正确性有很大的提升,但也使得其代码量上远远多于nodejs+CoffeeScript组合。

  之所以使用Go语言,直接原因是node.js在一个日1亿多次ajax请求同时1万websocket长连接的HTTPS服务端在内存上有类似泄漏的表现。debug发现是在启用SSL后,废弃数组中大量faye-websocket对象积压,究其原因,可能是使用不当,也可能是应用设计上的缺陷使得Javascript无法及时回收内存。由于修复无果便尝试寻找一种高速且容易使用的语言,Golang似乎非常符合,特别是Goroutine特性更是超出了期望。使用Golang重写了服务后,内存使用降低了70%,由12G缩减至4G,且非常稳定,同时性能提升了40%。唯一美中不足的是Golang的HTTPS工作不理想,用标准库http.ListenAndServeTLS直接使CPU满载,接nginx前端转发后问题改善,虽然多了层转发,性能与内存还是让人满意。

CPU使用情况:
3月底改用Golang后由16%降至10%
localhost.cpu-year

内存使用情况:
3月18日之前内存存在缓慢增长现象,但尚可接受。
3月18日切换至HTTPS,内存增长速度大幅提升,一天即可消耗20G以上内存。
3月底改用Golang内存降至4G,且长期稳定在4G~5G范围内。
localhost.memory-year

小结:
  Golang的诞生有着很强的目的性,所以根基显得非常的沉稳,语言未来针对高性能,高并发的优化也更得心应手。更主要Golang可以切实的解决实际问题,并在内存与CPU使用上大幅优于node。为此,针对有大量请求的服务端,Golang是个不错的选择。

  再反观昨日之星node,作为node的深度用户,也想为其说点好话,但对比Golang,却找不出绝对优势,似乎只剩下Javascript的灵活性,前后端通用,CoffeeScript的语法糖,以及丰富的包积累。站在Golang角度,其严谨也有其道理,代码质量确实高很多,各有优劣,Golang的包也正在丰富中,常用包该有的也都有,有时甚至可以直接拿C的来用,也难分高下。

  综上,Golang在与node的竞争中具有一定的优势,node的的地位和应用范围势必都将受到了不小的冲击。而Golang能走多远,让人拭目以待。

共3条评论
  1. kaicui @ 2014-09-05 08:44:15 回复

    个人也是从node.js转到golang。我觉得node.js最大的劣势是其缺少profiling的工具和资料,而javascript的灵活性又导致程序员极容易写出有问题的代码而不自知。
    golang在profiling这方面做得好一些,至少有工具去分析

    • JiangMiao @ 2014-09-06 17:40:51

      我倒觉得node的profiling还行,v8提供的profiling可以满足基本需求。由于异步回调打散代码,比起Go的直接输出树状调用链要弱一些。

  2. Jason Livesay @ 2014-12-17 10:29:38 回复

    Hello, Go is one of my favorite new systems programming languages. But as far as syntax and ease if operation with C, have you tried the Nim language? It is quite amazing.

发表评论

电子邮件地址不会被公开。 必填项已用*标注