Oracle不是言语之争–Go vs Erlang

因为 云巴 系统对高产出、低顺延的需要,大家对各类语言、平台做了广大的调研相比工作。那本来就回顾从业于开发高并发应用的
Go 和 Erlang。

并发

Go 对高产出的支撑通过 goroutine 完毕。goroutine 可以驾驭为轻量级的
线程(thread)。同八个 Go 应用创立的 goroutine 共享地址空间。

Erlang 的高并发通过轻量级
进度(process)达成,每叁个历程都有单独的情景记录。

其余,使用 goroutine 要小心,goroutine
运维实现后,占用的内部存款和储蓄器放回内部存款和储蓄器池备用,不会放出。

对于每多少个职分都亟需有独立状态的风貌,Erlang 的 process 更有优势。

抢占式调度

Erlang 的职责调度器有三个 reduction budget
的概念。进度的其余操作都会促成预算消耗,包含 函数调用、调用
BIF、进度堆垃圾回收、ETS
读写、发音信(指标邮箱堆积的音讯愈多,消耗越大)。Erlang 的 正则表明式库
也被做了修改以协助reductions。所以只要经过在长日子实施正则表明式匹配,也同等会开支reductions,也会被吞没。

Go 在此之前的调度器只在 syscall
发生时调度,优化后得以在别的函数调用时调度。可是要留意,若是在 goroutine
里写三个死循环,Go 的调度器无法使得抢占,同三个调度器的 其余 goroutine
会被挂起。

垃圾回收

像 Java 一样,Go 的垃圾堆回收是大局的,那表示一旦垃圾回收被触发,全体的
goroutine 都会被暂停,造成一段时间的事务延迟。

Erlang 的垃圾堆回收是 进程级别的,每二个经过都有和好独立的废料回收器,叁个历程的废品回收被触发,不会导致任何进度被挂起。相对来说带来的政工延迟小。

错误处理

Erlang 的每1个进程都有 进度 ID
(PID),同时也可以给进度注册名字,也便是说每一个历程都有单独的地位,能够使得的监察每三个进度的气象。进程格外退出时,能够捕捉到退出事件,同等对待启进度(参见
otp 的 supervisor/worker)。

Go 的 goroutine 没有身份辨别,goroutine 的事态不能够监察和控制。

动态反射

Erlang 动态语言的风味,使它天生协理 REPL,此外 Erlang 援助 remote
shell,大家能够在 Erlang 运转时,连接受 remote shell
与别的二个经过并行。这么些特色对三个亟需长久运行的错综复杂系统的保卫安全带来了大幅的便宜。开发阶段也能有部分福利。

Go 是静态语言,不辅助 REPL。

静态编写翻译

Erlang 是动态语言,有全数动态语言的享有缺点:

  • 运营速度慢
  • 不能够做先前时代错误检查,必要依靠全覆盖单元测试
  • 代码规模大了,给编制带来麻烦

Erlang 未来也引入了
spec,对函数的参数再次回到值在编写翻译时做项目检查,然则跟静态语言比起来效果差的很远。

不过还好因为是动态语言,Erlang
实现了运营时期码替换,这几个特点对三个需求长日子运作的工业级产品,是3个不胜首要的意义。

Go 是静态语言,运营速度快,编译时做严谨的种类检查,可以制止过多隐患。

框架

Erlang 的 OTP 框架援助服务器端开发常见的二种格局(applications,
supervisors, wokers),方便代码的团伙。

Go 暂且没看到类似的框架。

其三方库协助

Go 是二个针锋绝相比较新的语言,虽说今后众多体系都初始接济Go,但不少第1方库的成熟度近日不如 Erlang。

总结

对于供给低顺延、高并发的后端服务,大家近年来依然采取 Erlang 为主。但运用
Erlang 的进度中,Erlang
缺少静态检查的手腕,也是一个很麻烦的难点,近日的做法是讲求大家都接纳AMDliJ IDEA 编写代码,能够通过 IDE 提前意识有个别语言难点。

而且大家会没完没了关切 Go 的发展。

 

关于笔者

Tiger

weibo: @Tiger_张虎, 云巴 (yunba.io) 创办者,yunba.io 云后端服务。
JPush 创办者,原CTO。 Oracle VM 创始团队成员。

相关文章