黄小华的个人网站
熬过无人问津的日子才有诗和远方!
学习笔记

Erlang的出现是为了实现一套容错,可伸缩,软实时的高可用系统。如电话系统能够在流量高峰期时,监督和确保紧急服务正常, 避免设备故障导致中断。
可伸缩:指系统可以适应负载和可用资源的变化,如平滑处理峰值流量而不丢失请求。
分布式:指系统组成集群并相互交互协作。 在单台机器上,通过多个节点实例能更好地利用多核处理器的效能。
容错:指在其环境存在故障的情况下仍可以可预期的方式运转。确保错误的请求或者故障不会导致进程崩溃。
软实时:指响应和延迟的可预测性,保字在可接受的时间内做出响应。无论同一时刻有多少请求,吞吐量都不能因为负载太重而下降。
高可用: 指由于各种问题导致的停机时间降至最低,
构建系统时需认真考虑需求和拥有的资源,确保选择正确的库和设计模式。

OTP三大组成部分:
Erlang:Erlang自身, 语言和虚拟机。
工具和库:工具 库 面向其他语言的接口 编程环境 数据库 数据库驱动 标准组件及协议栈等各方面的应用。
系统设计原则:主要是一系列抽象原则,设计规则,和行为模式组成。
Erlang基础:
递归模式匹配
使用递归来迭代或者重复某种行为,通过递归和匹配的方式可以维持进程的存活 列表推导:
是一种能够生成元素并对生成的元素做测试的表达式。
[{X,Y}||X <- L1, true, Y <- L2, true].
进程与消息传递:
进程间是不共享内存的,是通过消息来通信的,消息从发送进程的栈上复制到接收进程的堆上。erlang的进程是轻量级的,创建它们只需要花费微不足道的时间和内存。不共享内存,单个进程发生错误不会影响其他进程或者任务的运行。

链接和监视器:
系统内多个进程同时运行可能相互依赖,通过链接,其中一个进程中止时将发送exit给另一方,使其也终止。
通过监视器进程可以单向式观察其他进程的终止。
记录(record):
记录提供便捷访问任意元素,元组管理的项数不宜超过五项,因为元组需要担心各处的位置匹配是否正确,记录解决了元组在各方面的不足。
映射组(map):
是一种键值集合,它的字段数量不会在编译期确定。 使用场景:记录的速度很快,所以如果字段数量固定,在编译期能确定,就用记录,在运行时需要动态增加字段就使用映射组。 宏:
由epp实现, 每当把源代码编译为beam代码前都会调用它,把宏定义的代码编译进去。
模块升级(旧版本和新版本):
能在运行中升级代码,而无需关闭系统。模块的新版本的加入,要么是在shell中编译了该模块,要么是在外面编译好了直接加载进来。 当新的beam模块加载进来时, 进程当前运行的该模块就变为旧版本了,只有当进程下一次使用全限定名调用该模块时才运行到新版本上。
行为模式:
不同进程解决不同问题,但它们都有某些相似的设计, 其中常用的模式被抽象出来,封装为一组通用化的库模块,这种被称为OTP三部分之一的行为模式。 5种行为模式(behavior)

  1. gen_server, 通用Server:用于建立C/S行为模式
  2. gen_fsm, 有限状态机: 用于有限状态机编程
  3. gen_event, 通用事件处理:用于编写事件处理器
  4. supervisor, 监督者: 用于构建具备容错能力的监督树
  5. application, 应用: 用于整合资源与功能