这篇文档是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去实现实际的系统,但它为我们提供的这几点的最佳实践是值得学习的。
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去实现实际的系统,但它为我们提供的这几点的最佳实践是值得学习的。