如何看待许式伟谈Go Erlang并发编程差异?

《再谈CERL:详论GO与ERLANG的并发编程模型差异》-许式伟 [ECUG专题回顾]《再谈CERL:详论Go与Erlang的并发编程模型差异》
关注者
1,020
被浏览
192,185

34 个回答

这次的 ECUG 我有参加做了分享

weibo.com/5140853887/BE

现在的 ECUG 有多人都是推崇 Go 的,但是我们 云巴 目前后端主要用 Erlang,本想到 ECUG 想跟大家分享下我们采用 Erlang 的心得,为什么暂时没有大量用 Go,但是没有实现。

  • 不执迷

首先说明下,我本人不执迷于任何东西,包括语言。现在 云巴 之所以采用 Erlang 我们同样是基于很多现实的考虑。

  • 什么语言/平台好?

几乎所有的语言都是为了解决一些特定场景的问题而被发明的。除了 汇编语言、C 这两种最基本的系统级别的语言,它们主要用来编写操作系统、其他语言。

所以讨论一个 语言/平台 好与不好,要针对具体的场景。

  • 云巴 的场景

云巴 主要是为了解决跨平台的实时数据交换的问题,包括手机 App、Web、PC、智能设备等。定位为一个大并发、软实时、高可靠系统。

具体我们的系统架构我在 InfoQ 的活动上做过演讲:

实时系统架构与实践

我们需要同时处理大量并发,处理过程涉及到多个模块的 IO 通信。这个场景目前能用的解决方案大致可以有:

  1. 异步 IO。比如 libev,node.js
  2. 轻量级线程、进程平台。比如 Erlang, Akka, Go

我们团队基于 libev 开发过东西,效果很不错,但是涉及到多个模块 IO 做起来工作量非常巨大。

系统的第一个版本我们采用的 node.js,node.js 开发效率很不错,但是在处理海量并发时, javascript 语言本身还是太沉重,后来我们决定切换到轻量级进程的平台。

  • 为什么用 Erlang/OTP

我们最先从比较 Go、Erlang 开始,基于一些具体考量选择了 Erlang,我的博客有介绍:

Go vs Erlang

简单的总结促成我们现在选择 Erlang 的具体原因:

  1. OTP 的容错能力。Supervisor, Worker 的架构,Go 目前没有。
  2. Erlang 的 process 有独立状态。有没有独立状态本身无所谓好与不好,只是我们大部分场景需要每个 process 维护一个状态。
  3. Erlang 的 process 有独立身份。对于我们这个需要长时间不间断运行的系统,可以随时探测某一个 process 的运行情况很重要,Erlang 可以很方便通过 Pid,registered name 跟具体 process 通信。
  4. Erlang process 有独立 GC。Go/Java 的全局 GC 在系统压力巨大时,都会造成抖动,在我们的场景可能会造成很多请求超时。Erlang 每一个 process 有独立 的 GC,一个 process 发生 GC 时不会造成其他 process 挂起。
  5. Erlang/OTP 的网络能力。我们很方便通过 process pool 把海量任务动态分配给不同服务器处理。Go 在这方面完全没有涉及。

当然 Erlang 是动态语言,它在执行效率、内存用量上对比 Go 有明显劣势。对于大型系统,编写代码时,动态类型也带来诸多不便。

总体来说,Go 目前除了有 goroutine 解决同时处理大量任务的问题,在一个高可用、大并发、软实时、基于集群的实际产品里需要面临的诸多问题,不像 Erlang 那样试图去解决。

感觉 Go 更多还是定位为一个类似 C++ 的通用语言,而 Erlang 是专为编写大并发的通讯系统设计的。

  • Erlang 的 IO 问题

演讲中老许提到了多次 Erlang 还是需要用到异步 IO。以我们 云巴 的实际情况,我们会用 process pool 去处理,每个 process 都是采用的同步 IO,没有使用异步 IO。依赖 Erlang 的调度器有效分配 CPU 时间。

先吐槽:许大牛别天天光cerl这个那个模型了,都7年时间了,不开源代码,不讲数据,还把它拉到erlang和go层面比较。从我对erlang和go语言实现层面的理解,cerl实在不在一个层上,甚至难听点就是一坨狗屎。输了我余字倒着写。理由是erlang单进程调度实现至少有二万行c代码,从第一版发布到现在超过9年,还在大规模完善调整,时不时还爆出bug。我自己早年也做了很多这样的狗屎,深有体会做类似基础框架的难度。

大家做技术的,show me the code 才是最真的,一堆云里雾里东西确实没看懂,从文章对Erlang消息和调度工作原理的表述离谱到到想纠正都不知道从何入手,照理说许大牛不应该犯这种错误的。

再,语言和系统存在的目的是为了解决问题,都可以找到最适合自己的场景。erlang存在20多年继续往前持续改进,有自己鲜明的特点,会走他自己的路。我们能做的是在路上一起完善系统,而不是费时在这口水。事实上我们很多工具类的系统也是用go实现的。

另:我们开源了erlang多pollset模块,对网络密集型的后端服务器性能提升很大:

github.com/alibaba/erla