这篇文档是erlang创始者之一的Joe Armstrong所编写的博士论文,由段先德翻译、邓辉审校,感兴趣的同学可以从以下地址下载:
http://erlang-china.org/study/joe-armstrong_thesis_cn.html
Erlang在业界已经引起了不小的轰动,通读了下这篇博士论文,翻译的质量很高,:),所以读起来非常的顺畅,论文的内容对于erlang初学者而言绝对是堪称经典,写的非常的不错,点出了erlang的强项并详细的进行了解释。
Erlang以天生的支持并发、分布式和容错而闻名,由于erlang的诞生是为交换机而服务的,因此在并发、分布式、容错、动态代码升级等方面是实现的非常好的,其目前主要是应用在erission的交换机上,这对于erlang的那些天生的特性也是个很好的证明。
通过阅读这篇博士论文,让我对了erlang有了部分的认识,由于目前尚未实践过,只能根据论文本身对自己理解的erlang做个阐述。
Erlang采用的是虚拟机的方式,这个虚拟机和java的虚拟机类似的地方在于隔离了和操作系统相关的语言运行环境,也就是说基于erlang编写的程序是可以在所有操作系统中运行的,不同的地方在于erlang在这个虚拟机中还实现了进程管理、进程通讯等非常核心的技术,erlang的进程采用的并不是操作系统的进程,因此基于erlang编写的程序并不会因为每种操作系统的进程、进程通讯实现的机制不同而改动,正是因为这些,使得基于erlang可以很容易的编写跨操作系统的高并发、容错、可靠的分布式系统,来看看erlang对于这几个关键字是怎么支撑和理解的:
1、分布式
分布式的支持对于所有的大型系统而言都是非常重要的,分布式涉及到的问题主要是远程通讯,Erlang本身已很好的实现了这个部分,在erlang中通讯的单位是进程,erlang已很好的透明化的处理了本地进程通讯和远程进程通讯,也就是说你可以像本地进程通讯一样的方式去进行远程进程通讯,在erlang中进程的通讯基于消息的方式,有点像MQ之类的东西。
2、高并发
高并发这块通常采取的支撑方法是多进程的并行处理,在erlang中非常强调的一个原则就是进程的创建和销毁要非常容易,也就是说是不耗多少资源的,由于erlang中的进程并不是操作系统的进程,因此在支持高并发时就比较容易了,例如webserver,可以每接收一个请求就创建一个进程来进行并行处理,而同时由于erlang会合理的去分配这些进程对于CPU的抢占,避免出现某进程耗住CPU的现象。
3、容错
容错首先要做到的是错误的隔离,erlang强调每个处理的单元都是进程,同时erlang要求进程间不共享任何资源,例如共享内存等,进程间仅通过消息来进行交互,因此某个进程出错自然是不会造成其他进程错误的,在进程出错时,erlang推荐的是采用速错(fast on fail)的方式,也就是迅速停止这个进程的运行,这样做是为了避免这个进程错误的执行造成更多的错误。
容错方面,erlang推荐的实践方法是专门编写一个监督进程,这个进程负责接收被监督进程发出的错误的消息,并根据错误的情况来进行纠错,重启进程,或者将该进程恢复至其他的机器上去执行。
4、可靠
可靠的分布式系统,这部分对于我的触动比较大,因为之前一直做这方面的事情,在论文中说到了很关键的一点,目前在基于面向对象的语言实现可靠的分布式系统时,多数是基于类似MQ的东西来实现的,在基于这个实现时,要做到可靠,基于的基础是消息的传递是可靠的,当然,erlang也是基于消息传递来实现分布式通讯的,但它的思路不同,它不认为消息的传递是可靠的,那么它是怎么来做到可靠的呢,是基于进程调用时构建的一个进程链的方式,进程链上的任意进程的错误都可通知到相关的进程,这样的话消息是否传递到相应的目的进程其实是很容易判断的,:),这个思路一定程度上颠覆了MQ中一直采用的发送--回执的方式,不过不同的也仅在于现在不用按通讯的方式去发回执,但事实上这个回执还是存在的。
从上面这几个特性可以看出,erlang确实挺吸引人,可以试用试用,不要告诉我用c也可以实现这些,何必冒出一种新语言去学习呢,没错,你是可以用c去实现,但那不是要自己写吗,除非你觉得自己在高并发、容错、分布式这些的理解上比这些博士还强,呵呵,不过就像论文中说的,erlang也还有很多需要发展的方面,例如如何更好的与其他语言的程序通讯。
在这篇erlang博士论文中还能学到的东西有很多,如构建并发式系统时应将并发、持久存储、进程消息传递、进程错误处理这些和应用系统的实现交由两组不同的人来实现,使得开发应用的人可以无需关注程序该怎么去支持高并发、怎么去和别的进程通讯什么的,和spring的pojo enhanced的概念是相同的。
和OSGi一样,也不一定就用erlang去实现实际的系统,但它为我们提供的这几点的最佳实践是值得学习的。
分享到:
相关推荐
本论文所描述的成果源于1981年开始的一个研究项目,该项目的目的是探索更好的编写电信应用软件的方法。...我们假设这些程序不可避免地会含有错误,进而寻求在软件包含错误的情况下构建可靠系统的方法。
系统存在不完善的环节,但是我们希望我们的系统可靠,矛盾的要求,满足的条件两种解决方案,语言本身或者是方法库 在ERLANG中,对于上述的问题的解决方式采用语言+库一起作用的方式来解决,满足在程序有错误的情况下...
提供的文档,如"面对软件错误构建可靠的分布式系统.pdf"和"armstrong_thesis_2003(面对软件错误构建可靠的分布式系统)英文原文.pdf",将为读者提供深入理解Erlang及其在构建高可用系统中的应用的宝贵资源。
标题和描述中所提及的知识点聚焦于如何在存在软件错误的情况下构建可靠的分布式系统,这是一个深奥且关键的领域,尤其在当前多核、分布式计算、集群计算和高并发处理成为主流技术的时代背景下更为显著。文章深入探讨...
7. **错误处理和容错**:由于网络环境的不稳定,分布式系统需要有强大的错误处理和恢复机制。这可能包括重试策略、超时检测、心跳机制等,以确保系统的稳定运行。 8. **设计模式**:在实现这样的系统时,设计模式如...
### 软件工程原理与分布式系统教程 #### 第1章 软件工程概述 **软件工程定义:** 软件工程是一门集成了计算机科学、项目管理及工程原则的综合性学科,其目标是以工程化的方法来开发和维护软件系统,从而提高软件...
分布式系统通信是构建大规模、高可用、高性能应用的基础,它涉及到多个层次的协议和技术。本文主要探讨了四个关键方面:分层协议、基本网络模型、通信类型以及远程过程调用。 首先,分布式系统的通信通常基于分层...
### 软件工程中的网络通信与分布式系统设计 #### 第一章:软件工程与网络通信 - **软件工程概述**: - 软件工程是一门将工程学原理应用于软件开发领域的学科,旨在提高软件产品的质量和开发效率。 - 它涵盖了从...
- **分布式系统设计考虑因素**: - **数据分片**:根据数据类型或属性将数据分成多个部分。 - **负载均衡**:合理分配任务到不同的节点以避免某些节点过载。 - **数据冗余**:复制数据到多个节点以提高容错性和...
根据提供的文件信息,我们可以从标题、描述以及标签中提炼出的...总之,这份视频教程旨在帮助开发者深入理解Dubbo的工作原理及其在构建分布式系统中的应用,通过实际案例的学习,提升开发者解决复杂分布式问题的能力。
此外,书中还涵盖了错误处理、容错机制和性能优化等方面的模式,这些都是构建可靠、高效网络化软件的关键。 书中每个模式都包括了问题描述、解决方案、效果分析和相关的实现细节,这使得读者能够深入理解每个模式的...
Java 分布式系统是构建大型、可扩展网络应用的关键技术,它允许分布在不同计算机上的对象协同工作,共同完成复杂的任务。在Java中,RMI(Remote Method Invocation)和CORBA(Common Object Request Broker ...
2. **分布式系统的面向**:分布式系统并非通用系统,而是根据不同需求进行定制的特化系统。数据系统和运算系统是分布式系统两大类别。数据系统主要依赖分区(Partition)和复制(Replication)技术,而运算系统侧重...
3. **Web服务**:PB11.5支持创建和消费Web服务,这对于构建分布式系统至关重要,因为它允许不同平台和语言的应用程序之间交换数据和功能。 4. **对象序列化**:在分布式环境中,对象需要在网络间传输,PB提供了对象...
3. **并发与并行处理**:C#提供了Task、async/await关键字以及并发集合等工具,用于处理多线程和异步编程,这是构建高性能分布式系统的基础。 4. **服务注册与发现**:了解服务注册与发现机制,如Consul、Eureka或...
在IT行业中,日志管理系统是不可或缺的工具,特别是在分布式系统中。日志管理涉及收集、存储、查询、分析以及监控应用程序和系统产生的日志数据。本文将深入探讨面向分布式日志管理系统开发的日志管理系统,主要关注...
它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如...
面向模式的软件架构(POSA,Pattern-Oriented Software Architecture)是软件开发领域的一个重要概念,它由一系列的模式组成,这些模式是经过实践验证的设计解决方案,可应用于各种软件问题。这一系列书籍由一系列...