因为 云巴 系统对高并发、低延迟的需求,我们对各个语言、平台做了很多的调研比较工作。这自然就包括致力于开发高并发应用的 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 的每一个进程都有 进程 ID (PID),同时也可以给进程注册名字,也就是说每一个进程都有独立的身份,可以有效的监控每一个进程的状态。进程异常退出时,可以捕捉到退出事件,并重启进程(参见 otp 的 supervisor/worker)。
Go 的 goroutine 没有身份识别,goroutine 的状态没办法监控。
动态反射
Erlang 动态语言的特点,使它天然支持 REPL,另外 Erlang 支持 remote shell,我们可以在 Erlang 运行时,连接到 remote shell 与任何一个进程交互。这些特性对一个需要长期运行的复杂系统的维护带来了极大的便利。开发阶段也能有一些便利。
Go 是静态语言,不支持 REPL。
静态编译
Erlang 是动态语言,有所有动态语言的所有缺点:
运行速度慢
不能做早期错误检查,需要依赖全覆盖单元测试
代码规模大了,给编写带来困扰
Erlang 现在也引入了 spec,对函数的参数返回值在编译时做类型检查,但是跟静态语言比起来效果差的很远。
不过正是因为是动态语言,Erlang 实现了运行时代码替换,这个特性对一个需要长时间运行的工业级产品,是一个非常重要的功能。
Go 是静态语言,运行速度快,编译时做严格的类型检查,可以避免很多隐患。
框架
Erlang 的 OTP 框架支持服务器端开发常见的几种模式(applications, supervisors, wokers),方便代码的组织。
Go 暂时没看到类似的框架。
第三方库支持
Go 是一个相对比较新的语言,虽说现在很多项目都开始支持 Go,但很多第三方库的成熟度暂时不如 Erlang。
总结
对于要求低延迟、高并发的后端服务,我们近期还是采用 Erlang 为主。但使用 Erlang 的过程中,Erlang 缺乏静态检查的手段,也是一个很麻烦的问题,目前的做法是要求大家都使用 IntelliJ IDEA 编写代码,可以通过 IDE 提前发现部分语言问题。
同时我们会持续关注 Go 的发展。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
【基于Erlang VM的语言】 Erlang虚拟机(Erlang VM,也称为BEAM虚拟机)是Erlang编程语言的核心组成部分,它为Erlang提供了强大的并发特性和故障容错能力。基于Erlang VM的语言充分利用了这些优势,同时也引入了...
Erlang语言开发包 windows版本 安装rabbitmq必备 提供一个便利的途径,官网最新23版本,下载后需要配置环境变量
Erlang语言安装包,RibbitMQ消息服务器支持,20.0 64bit位
Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心...
Erlang是一种高级编程语言,特别适用于并发、分布式和实时系统。它由瑞典电信设备制造商Ericsson开发,用于构建大规模、高可用性的电信系统。在本文中,我们将深入探讨如何在 CentOS 7 64位操作系统上安装和配置...
Erlang语言安装包,RibbitMQ消息处理所需支持语言,20.0 32bit
根据描述中的信息,Erlang语言被认为是“当今最有前途的程序设计语言之一”,这主要归功于其独特的设计哲学和高效的并发模型。 #### 二、Erlang语言的设计理念 Erlang的设计核心是面向并发世界。正如书中引用Joe ...
在Windows环境下安装RabbitMQ,你需要先安装Erlang环境,因为RabbitMQ是用Erlang编程语言编写的。Erlang是一种面向并发的、函数式的编程语言,特别适合构建高可用、容错性强的分布式系统。文件“otp_win64_22.1.exe...
**Erlang编程语言** Erlang是一种专为构建大规模并发服务系统而设计的编程语言,尤其在电信和云计算领域有着广泛的应用。由于其独特的设计理念和能力,它在处理高并发、分布式计算以及容错性方面表现出色,使得它...
erlang windows安装包,官网被墙无法访问,亲测可用.....
Erlang采用actor模型,每个进程(在Erlang中称为进程,而非操作系统级的进程)都是独立的,通过消息传递进行通信,这种设计使得系统在处理大量并发任务时表现出色。 在"Erlang23_3"这个压缩包中,我们可以推测这...
Go语言适合构建高性能的后端服务,Python则在数据处理和学习教育上具有天然的优势,Erlang非常适合构建分布式、高并发的系统。了解这些语言的特点,将有助于我们在不同场景下选择最适合的编程语言。
linux 安装rabbitmq必备erlang环境,资源中海油windows版本,需要的话自行下载,区分好版本
在Golang中实现Erlang / OTP。 速度是原始Erlang / OTP的x5倍。 群集中热节点的最简单的直接替换。 目的 该项目的目标是利用Erlang / OTP经验和Golang性能。 Ergo Framework实现了诸如GenServer / Supervisor / ...
ErlPort 是一个Erlang 库,用来帮助连接 Erlang 与其他编程语言。目前支持的是 Python 和 Ruby。Erlang 库使用 Erlang 端口协议 来简化Erlang 语言和 Erlang 外部术语格式 的连接,设置良好的数据类型映射。 ...
这是《 Erlang编程语言》的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请再次检查此页面!!!
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。Erlang以其强大的并行处理能力、容错性和易于构建大规模分布式系统的特点,在电信、金融和互联网等...
Erlang是一种高级编程语言,特别适用于并发、分布式和实时系统。它由Ericsson公司开发,主要用于构建高可用性、容错性和可扩展性的软实时系统。Erlang的25.0版本是该语言的一个更新,针对Windows操作系统进行了优化...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入...