什么时候使用 golang 而不是 nodeJs? - Reddit


对于几乎所有NodeJS也能工作的项目来说,Go都是更好的,因为Go的实际并发原语是内置的,而且容易使用。

Node仍然有(据我所知,如果我过时了,有人会纠正我)一个集中的事件循环结构,没有真正的多线程并发,JS代码无法同时在多个CPU核心上运行。当然,Node还是非常快,异步代码运行良好,而且一个Node服务器可能可以处理数以万计的请求。但是,如果你发现自己需要做一些非常重的CPU任务,会锁定线程很长一段时间,整个服务器进程就会被锁定,那么就无法为其他连接的用户提供服务,因为只有一个线程和一个事件循环,很难在你的异步任务之间分割时间共享。
(Node 已经有大约 5 年的工作线程了(Node v10),这些将用于 CPU 绑定操作。异步编程的事件循环样式仍然用于 I/O 绑定工作。)

在Go中,你可以在后台抛出一个goroutine,它可以有自己的CPU核心来运行,并将服务器的其他部分留给其他连接使用。

对于大多数简单的网络应用(RESTful APIs,简单的websocket服务器,只是快速转发消息,不涉及太多的CPU工作),你可以使用Go或NodeJS或Python甚至可能是PHP。所以你要选择最适合你的开发人员的语言--如果他们都知道JavaScript而不是Go,那么就用NodeJS来构建。

但大型规模时,如果你有足够多的用户在使用你的应用程序,在Node(或Python或其他)中,你需要开始在你的池中添加更多的服务器--多个服务器进程运行你的应用程序的副本,以解决单线程的问题。Go的并发性可以让你在一台机器上只运行一个进程就能获得大量的收益。

出于以下几个原因,我慢慢地将我所有的 nodejs 项目移出 node:

  • 1. 如果不定期维护,复杂的依赖树和脆弱性。
  • 2.缺乏类型安全和需要处理的复杂的运行时错误,从长远来看会有点痛苦。
  • 3. 缺乏文档时难以通过库包阅读。
  • 4. 回调地狱,就我个人而言,我觉得在精神上跟踪这件事非常烦人。虽然它可以产生优雅的递归代码块,但我个人认为它们在可读性方面很糟糕。

然而,这里有优点:

  • 1. 库包——库包的绝对财富绝对是惊人的
  • 2. 异步很容易,通常可以用相对较少的努力实现新颖的想法和独特的基础设施
  • 3. 管道,尽管我讨厌管道地狱,管道启用通过回调在 nodejs 中非常简单