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 “绪论”的更多相关文章

  1. erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"

    对一个运行中的Erlang系统来说,进程绝对是重要的组成部分.正因为进程是所有运行实体的基础,因此会想去了解它们的更多信息.幸运的是,VM提供了大量的可用信息,其中有些可以安全使用,有些在生产环境中使 ...

  2. erl_0016 《硝烟中的erlang》 读书笔记003 “error_logger 爆炸”

    error_logger 爆炸 具有讽刺意味的是,负责错误日志的进程竟然是最为脆弱的之一.在Erlang的缺省安装中,error_logger39负责记录日志(写入磁盘或者发送到网络上),它的速度要比 ...

  3. erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”

    为过载做计划 到目前为止,我在实际工作中所碰到最常见的错误,基本上都是节点内存耗尽.而且通常都和过长的消息队列有关37.解决这类问题的方法有很多,不过只有在深入.全面的理解系统后,才能做出正确的选择. ...

  4. erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”

    如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...

  5. .Net中的AOP读书笔记系列之AOP介绍

    返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...

  6. erl_0020 《面对软件错误构建可靠的分布式系统》读书笔记001 “面向并发COPL”

    在现实世界中,顺序化的(sequential)活动非常罕见.当我们走在大街上的时候,如果只看到一件事情发生的话我们一定会感到不可思议,我们期望碰到许多同时进行的活动. 如果我们不能对同时发生的众多事件 ...

  7. 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)

    1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算  估算生产率/实际生产率  看看团队的历史,看看他们在过去几个sprint里的生产率是多少  然后假定在下一个sp ...

  8. PRML读书笔记_绪论

    一.基本名词 泛化(generalization) 训练集所训练的模型对新数据的适用程度. 监督学习(supervised learning) 训练数据的样本包含输入向量以及对应的目标向量. 分类( ...

  9. PRML读书笔记_绪论曲线拟合部分

    一.最小化误差函数拟合 正则化( regularization )技术涉及到给误差函数增加一个惩罚项,使得系数不会达到很大的值.这种惩罚项最简单的形式采用所有系数的平方和的形式.这推导出了误差函数的修 ...

随机推荐

  1. [Network Architecture]Xception 论文笔记(转)

    文章来源 论文:Xception: Deep Learning with Depthwise Separable Convolutions 论文链接:https://arxiv.org/abs/161 ...

  2. Asp.Net将Session保存在数据库中

    1.由于项目dll文件变动比较频繁,而保存登陆的状态又保存在Session中,所以导致用户经常无故掉线.(dll变动的时候导致Session丢失) 2.有一种方法可以长期保存session,那就是se ...

  3. Linux系统用户及用户组管理

    目录一.新增/删除用户和用户组二.创建/修改密码三.用户身份切换--su和sudo 一.新增/删除用户和用户组1.用户组 命令 : groupadd 语法 : groupadd [-g GID] gr ...

  4. jsplumb 的初次使用

    最近的项目要能创建流程, 流程配置什么的就找了 jsplumb 来做流程的显示配置.经过两天的研究成果已经很明显了 参考了以下一些大神们的博客: jsplumb 中文教程 连线绘图工具库介绍 附简单在 ...

  5. 定时模块app_timer用法及常见问题—nRF5 SDK模块系列二

    app_timer是大家经常用到的一个库,app_timer的功能就是定时,也就是说,你在某一时刻启动一个app timer并设定超时时间,超时时间一到,app_timer就会回调timeout ha ...

  6. springmvc的@Validated/@Valid注解使用和BindingResult bindingResult

    关于@Valid和Validated的比较 @Valid是使用hibernate validation的时候使用 @Validated 是只用spring  Validator 校验机制使用 一:@V ...

  7. jmeter-02 JMeter 生成HTML性能报告

    Report Dashboard: JMeter3.0 后提供的扩展模块,支持从测试计划中获取图形和统计数据,生成HTML页面格式图形化报告. 快速入门演示 一.准备测试计划 mock_api .jm ...

  8. 这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)

    1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. ...

  9. IOS-OC 编码建议

    “神在细节之中” Objective-C 是 C 语言的扩展,增加了动态类型和面对对象的特性.它被设计成具有易读易用的,支持复杂的面向对象设计的编程语言.它是 Mac OS X 以及 iPhone 的 ...

  10. LeetCode OJ:Number of 1 Bits(比特1的位数)

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...