erlang浅谈(3)-Erlang系统特点

来源:互联网 发布:树莓派ubuntu系统 ssh 编辑:程序博客网 时间:2024/06/06 02:16

1. Erlang系统特点

Erlang本身内置支持分布式应用里边的,高并发,分布式,代码热替换,容错性。

1.1. 高并发

a) 进程

i. Erlang的最小执行单元是进程,进程的最大特点是隔离性好,(有自己的独立内存空间,Crash不会影响其他工作单元)。

ii. Erlang的进程特点

1. 协程

a) 自己控制执行切换

b) 高效。由于不频繁切换系统上下文(页表等),效率比直接使用OS的高。

2. 成本极低

a) 一个Erlang进程,默认开销2K多一点(主要是栈和默认堆)

b) 对应的一个OS线程,一般栈空间都不少于512K

c) 由于是协程,进程切换直接成本极低


3. CPU亲和性

a) 协程,当然可以自己控制ERLANG进程绑定在特定的OS线程之上

b) 这个特性大大避免了锁开销


4. 零锁编程

a) 函数式编程本身理念就是无需锁的

b) 没有全局变量,进程本身状态也只有自己可以访问,因此找不到锁的用武之地

c) 不是绝对的,比如依赖外部异构资源,这个语言本身无法解决

b) Erlang的进程成本如此之低,因此我们可以以同步的方式来构建我们的异步系统。它的实现也是如此的,对耗时操作都会引起当前进程的trap.

1.2. 容错性

a) 内置的容错性

i. 基于进程的,隔离性好

ii. 支持异常捕获

iii. 进程直接可以建立关系

发生了Link关系的两个进程可以感知另外一个进程的结束,不处理默认就是一起exit

iv. 进程和节点监控

有内置的监控机制去监控某个进程或者节点,可以感知他们down

b) 内置支持失败重启

-heart Cmd 标志启动,当前节点crash可以自动重启。这样你无须自己去写监控脚本。

c) OTPSupervisor模式

Supervisor可以把根据依赖关系,把进程搭建成树状结构,高层的节点或者叶节点被低层监控。

监控节点可以根据参数决定子节点的重启策略

  • Restart: permanent | transient | temporary  永远重启|异常退出才重启|永远不重启
  • 监控节点退出子进程的shutdown 策略
       子进程的返回中控制:

  • l 当前进程挂掉了重启间隔时间
  • l 指定时间内重启最大频率
  • RestarStrategy: l 重启时是重启自己 || 所有的进程 || 配置时排在当前进程之后

1.3. 分布式支持

1. 节点位置透明

根据节点名可以连到节点,无需指定具体的端口号

2. 自动连接

发生通讯的进程,如果处于两个节点上,这两个节点可以自动连接

3. 连接协议可配置

节点之间的连接协议是可以配置的,内置支持TCPSSL,也可以开发自己的协议

4. 全联通

A连接了B,如果A在连接了C,这时BC之间也可以互相感知了(nodes()monitor都可以感知到)

5. 透明路由

进程之间的通讯不论是同一节点上,跨节点,或者跨机器,都可以以统一的Pid!Message的方式进行通讯。

因此,我们可以以统一的方式来构建我们的系统。

6. TakeOver

可以配置多个节点来运行指定应用,系统会根据顺序选定当前服务节点。如果节点挂了,后面的依次被选择。那些优先节点恢复后会抢夺运行权,重新由它提供服务

7. 代码中心

可以指定在指定机器运行代码。

它的具体实现是通过ssh在指定机器上运行erlang并把要运行的代码复制过去,然后执行。

1.4. 代码热升级

由于没有变量,而且都是基于函数式的实现,因而可以实现代码热升级。(执行的入口改了,所有的状态都在进程上下文中,下次调用时携带到参数里就行了)

1.5. Port管道

ErlangDSL,不适合构建太复杂业务的系统。他提供了一种异构系统互通的机制,就是Port管道。

可以直接调用外部应用,跟外部应用stdinstdout对接。也可以开发自己driver(可以做更加精细的控制,比如常驻内存select输入,输出,不同阶段有不同的回调)

原创粉丝点击