1.1. 高并发
1.进程
- Erlang的最小执行单元是进程,进程的最大特点是隔离性好,(有自己的独立内存空间,Crash不会影响其他工作单元)。
- Erlang的进程特点
2. 协程
- 自己控制执行切换
- 高效。由于不频繁切换系统上下文(页表等),效率比直接使用OS的高。
3. 成本极低
- 一个Erlang进程,默认开销2K多一点(主要是栈和默认堆)
- 对应的一个OS线程,一般栈空间都不少于512K
- 由于是协程,进程切换直接成本极低
4. CPU亲和性
- 协程,当然可以自己控制ERLANG进程绑定在特定的OS线程之上
- 这个特性大大避免了锁开销
5. 零锁编程
- 函数式编程本身理念就是无需锁的
- 没有全局变量,进程本身状态也只有自己可以访问,因此找不到锁的用武之地
- 不是绝对的,比如依赖外部异构资源,这个语言本身无法解决
- Erlang的进程成本如此之低,因此我们可以以同步的方式来构建我们的异步系统。它的实现也是如此的,对耗时操作都会引起当前进程的trap.
1.2. 容错性
1.内置的容错性
- 基于进程的,隔离性好
- 支持异常捕获
- 进程直接可以建立关系
发生了Link关系的两个进程可以感知另外一个进程的结束,不处理默认就是一起exit了
2. 进程和节点监控
- 有内置的监控机制去监控某个进程或者节点,可以感知他们down
- 内置支持失败重启以-heart Cmd 标志启动,当前节点crash可以自动重启。这样你无须自己去写监控脚本。
- OTP的Supervisor模式
Supervisor可以把根据依赖关系,把进程搭建成树状结构,高层的节点或者叶节点被低层监控。
监控节点可以根据参数决定子节点的重启策略
- 当前进程挂掉了重启间隔时间
- 指定时间内重启最大频率
- 重启时是重启自己 || 所有的进程 || 配置时排在当前进程之后
1.3. 分布式支持
1. 节点位置透明
根据节点名可以连到节点,无需指定具体的端口号
2. 自动连接
发生通讯的进程,如果处于两个节点上,这两个节点可以自动连接
3. 连接协议可配置
节点之间的连接协议是可以配置的,内置支持TCP和SSL,也可以开发自己的协议
4. 全联通
A连接了B,如果A在连接了C,这时B和C之间也可以互相感知了(nodes()和monitor都可以感知到)
5. 透明路由
进程之间的通讯不论是同一节点上,跨节点,或者跨机器,都可以以统一的Pid!Message的方式进行通讯。
因此,我们可以以统一的方式来构建我们的系统。
6. TakeOver
可以配置多个节点来运行指定应用,系统会根据顺序选定当前服务节点。如果节点挂了,后面的依次被选择。那些优先节点恢复后会抢夺运行权,重新由它提供服务
7. 代码中心
可以指定在指定机器运行代码。
它的具体实现是通过ssh在指定机器上运行erlang并把要运行的代码复制过去,然后执行。
1.4. 代码热升级
由于没有变量,而且都是基于函数式的实现,因而可以实现代码热升级。(执行的入口改了,所有的状态都在进程上下文中,下次调用时携带到参数里就行了)
1.5. Port管道
Erlang是DSL,不适合构建太复杂业务的系统。他提供了一种异构系统互通的机制,就是Port管道。
可以直接调用外部应用,跟外部应用stdin和stdout对接。也可以开发自己driver(可以做更加精细的控制,比如常驻内存select输入,输出,不同阶段有不同的回调)
本文介绍Erlang语言如何通过轻量级进程、零锁编程、内置容错机制及分布式支持等特性实现高并发处理和系统容错。Erlang利用其独特的进程模型简化了异步编程,并提供了强大的故障恢复能力。
291

被折叠的 条评论
为什么被折叠?



