erl_0014 《硝烟中的erlang》 读书笔记001 “绪论”
1、大家听说Erlang,往往是因为其对高并发的良好支持。其实,Erlang的核心特征是容错,从某种程度上讲,并发只是容错这个约束下的一个副产品。容错是Erlang语言的DNA,也是和其他所有编程语言的本质区别所在。
2、从某种意义上讲,Erlang不仅是一门编程语言,更是一个系统平台。它不仅提供了开发阶段需要的支持,更提供了其他语言所没有的运行阶段的强大支持。其实,在静态检查和测试阶段发现的问题往往都是些“不那么有趣”的问题,那些逃逸出来的bug才是真正难对付的。特别是对于涉及并发和分布式的bug,往往难以通过静态检查和测试发现,并且传统的调试1 借助操作系统的进程也可以做到运行时的错误隔离,不过粒度太大,也过于重量。 2 为了能够做到跨OS的高效调度,Erlang放弃了基于时间片,采用了基于reduction的方式。几乎在系统的每个地方都会进行reduction计数,来达到公平调度的目的。手段也无法奏效3。而Erlang则提供了强大的运行时问题诊断、调试、解决手段。使用Erlang的remote shell、tracing、自省机制以及强大的并发和容错支持,我们可以在系统工作时,深入到系统内部,进行问题诊断、跟踪和修正。甚至在需要时在线对其进行“高侵入性”的外科手术。
3、对于Erlang存在的问题5,提得最多的有两个:一个是缺乏静态类型支持,另一个是性能问题。Erlang是动态类型语言,往往会被认为不适合构架大型的系统。我自己也非常喜欢静态类型。一个强大的静态类型系统不但能够大大提升代码的可读性,而且还为我们提供了一个在逻辑层面进行思考、设计的强大框架,另外还可以让编译器、IDE等获取更深入的代码结构和语义信息从而提供更高级的静态分析支持。
4、不过,在构建大型系统方面,我有些不同看法6。如果说互联网是目前最庞大的系统,相信没有人会反对。那么这个如此庞大的系统能构建起来的原因是什么呢?显然不是因为静态类型,根本原因在于系统的组织和交互方式。互联网中的每个部件都是彼此间隔离的实体,通过定义良好的协议相互通信,一个部件的失效不会导致其他部件出现问题。这种方式和Erlang的设计哲学是同构的。每个Erlang系统都是一个小型的互联网系统,每个进程对应一台主机,进程间的消息对应协议,一个进程的崩溃不会影响其他进程……。Erlang所推崇的设计哲学:crash‐oriented以及protocol‐oriented,是架构大型系统的最佳方式7。当然现在,你鱼和熊掌可以兼得,Erlang已经支持丰富的静态类型定义和标注功能8,并且可以通过Dialyzer工具进行类型推导和静态检查。
5、再来说说性能问题。在计算密集型领域,Erlang确实性能不高9。因此,如果你要编写的是需要大量计算的工具程序,那么Erlang是不适合的。不过,如果说涉及计算的部分只是系统中的一个局部模块,而亟需解决的是一些更困难的系统层面的设计问题:并发、分布式、伸缩、容错、短响应时间、在线升级以及调试运维等等,那么Erlang则是最佳选择。此时,可以用Erlang作为工具来解决这些系统层面的难题,局部的计算热点可以用其他语言(比如C语言)甚至硬件来完成。Erlang提供了多种和其他语言以及硬件集成的方法,非常方便,可以根据自己的需要(安全性、性能)进行选择
6、和大多数编程语言相比,Erlang在如何处理错误方面显得非常独特。我们一般会认为,语言、编程环境以及方法论都应该尽其所能来防止错误出现。所有会导致运行时错误的东西都要被避免,如果无法避免,那么这些东西就会被置于解决方案之外,不予考虑。程序编写完成,会被部署到情况多变的生产环境中。如果在生产环境中出现错误,就会发布新的程序版本。Erlang则采取了与此不同的方法,Erlang认为,错误一定会发生,这些错误可能是开发人员,运维人员引起的,也可能是硬件相关的。要想根除掉程序或者系统中的所有错误,是不实际的,甚至是不可能的14。如果不用千方百计地阻止错误发生,而是能够在错误发生时去处理它们,那么我们就可以用这种方式应对几乎所有的程序未定义行为。
7、Erlang编程环境采取了和人体免疫系统一样的方法,在这个类比下,其他编程语言则只关心“卫生”情况,以防止细菌侵入人体。对我来讲,这两种方式都非常重要。几乎所有的编程环境都提供了卫生保证机制(程度可能不同)。基本上没有其他任何编程环境提供了免疫系统:可以在运行时处理错误,并视此为一种生存能力。 当刚刚出现问题时,系统并不会立即垮掉,因此Erlang/OTP 也可以使我们成为一名医生。我们可以在生产环境中直接进入到系统内部,在系统运行时仔细地观察内部的所有情况,甚至以交互式的方式修复系统。继续沿用前面的类比,在Erlang中,我们可以施行大量的测试来进行诊断,可以实施各种程度的外科手术(甚至是高侵入性的),而此时,病人却无需坐在我们边上,也无需中断自己的日常生活。
erl_0014 《硝烟中的erlang》 读书笔记001 “绪论”的更多相关文章
- erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"
对一个运行中的Erlang系统来说,进程绝对是重要的组成部分.正因为进程是所有运行实体的基础,因此会想去了解它们的更多信息.幸运的是,VM提供了大量的可用信息,其中有些可以安全使用,有些在生产环境中使 ...
- erl_0016 《硝烟中的erlang》 读书笔记003 “error_logger 爆炸”
error_logger 爆炸 具有讽刺意味的是,负责错误日志的进程竟然是最为脆弱的之一.在Erlang的缺省安装中,error_logger39负责记录日志(写入磁盘或者发送到网络上),它的速度要比 ...
- erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”
为过载做计划 到目前为止,我在实际工作中所碰到最常见的错误,基本上都是节点内存耗尽.而且通常都和过长的消息队列有关37.解决这类问题的方法有很多,不过只有在深入.全面的理解系统后,才能做出正确的选择. ...
- erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”
如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...
- .Net中的AOP读书笔记系列之AOP介绍
返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...
- erl_0020 《面对软件错误构建可靠的分布式系统》读书笔记001 “面向并发COPL”
在现实世界中,顺序化的(sequential)活动非常罕见.当我们走在大街上的时候,如果只看到一件事情发生的话我们一定会感到不可思议,我们期望碰到许多同时进行的活动. 如果我们不能对同时发生的众多事件 ...
- 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)
1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算 估算生产率/实际生产率 看看团队的历史,看看他们在过去几个sprint里的生产率是多少 然后假定在下一个sp ...
- PRML读书笔记_绪论
一.基本名词 泛化(generalization) 训练集所训练的模型对新数据的适用程度. 监督学习(supervised learning) 训练数据的样本包含输入向量以及对应的目标向量. 分类( ...
- PRML读书笔记_绪论曲线拟合部分
一.最小化误差函数拟合 正则化( regularization )技术涉及到给误差函数增加一个惩罚项,使得系数不会达到很大的值.这种惩罚项最简单的形式采用所有系数的平方和的形式.这推导出了误差函数的修 ...
随机推荐
- detectron——test 错误集锦
一.测试错误,运行如下代码 python2 tools/test_net.py --cfg experiments/e2e_faster_rcnn_resnet--FPN_pascal2007.yam ...
- Python学习札记(十七) 高级特性3 列表生成式
参考:列表生成式 Note 1.List Comprehensions,即列表生成式,是Python中内置的非常强大的list生成式. eg.生成一个列表:[1*1, 2*2, ..., 10*10] ...
- Spring boot 外部资源配置
tomcat配置访问图片路径映射到磁盘路径 首先,我在调试页面的时候发现,图片路径为: 1 /webapps/pic_son/img/1234565456.jpg 但是,tomcat中webapp ...
- spring MVC 及 AOP 原理
SpringMVC工作原理https://www.cnblogs.com/xiaoxi/p/6164383.htmlspring MVC 原理https://blog.csdn.net/y199108 ...
- 监控控制台是否运行的bat
@echo offrem set secs=5set srvname="TRS.Export.Scheduler.exe" echo.echo ================== ...
- java的时间获取
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...
- [sping]xml配置文件中factory-bean与factory-method(spring使用工厂方法注入bean)
public class CarFactory { //非静态方法 public Car createCar(){ Car car = new Car(); car.setBrand("BM ...
- 《Think in Java》(十四)类型信息
简介 RTTI,RunTime Type Information,运行时类型信息.Java 在运行时识别对象和类的信息主要有两种方式:一种是"传统的"RTTI,它假定我们在编译时已 ...
- Java 基于javaMail的邮件发送(支持附件)
基于JavaMail的Java邮件发送Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户 ...
- Oracle中 如何用一个表的数据更新另一个表中的数据
准备阶段 1.建表语句: create table table1( idd varchar2(10) , val varchar2(20) ); create table table2( idd va ...