Eralng 学习笔记第七天, 分布式编程 , OTP , 并发
Erlang 分布式编程
在Erlang中,分布式编程是一种常见的方式,用于构建可靠、高可用、高并发的分布式系统。Erlang提供了强大的原语和工具来支持分布式编程。以下是一些关键概念和方法:
-
节点(Node):Erlang分布式系统中的基本单元。一个节点是一个运行Erlang运行时系统(ERTS)的独立实例,可以在网络上的任何位置运行。
-
节点之间通信:Erlang节点可以通过网络相互通信,发送和接收消息。节点之间的通信基于Erlang的消息传递模型,可以使用
net_kernel
模块建立节点之间的连接。 -
节点标识:每个节点都有一个唯一的名称,通常是一个原子或者是一个本地IP地址。节点之间的通信可以使用节点名称来标识接收方。
-
分布式应用架构:在分布式系统中,Erlang应用程序通常被设计成由多个节点组成的分布式集群。每个节点可以运行一个或多个Erlang进程,这些进程可以在集群中的不同节点上相互通信。
-
全局进程注册表:Erlang提供了全局进程注册表(Global Process Registry),可以让进程在整个分布式系统中注册和查找。这使得进程可以通过名称而不是PID来通信,从而简化了分布式系统中进程之间的通信。
-
分布式数据存储:在分布式系统中,数据通常需要在多个节点之间进行共享和同步。Erlang提供了多种分布式数据存储解决方案,包括ETS表、Mnesia数据库和基于第三方存储服务的集成。
-
容错性:Erlang的分布式系统具有强大的容错性。通过监督树、进程监控和动态代码更新等机制,Erlang可以自动检测和恢复节点和进程的故障,保证系统的稳定性和可靠性。
例子 : rpc:call(Node, Module, Function, Arguments)
Node
是目标节点的名称或地址。Module
是要调用的函数所在的模块的名称。Function
是要调用的函数的名称。Arguments
是传递给函数的参数列表。
示例: spawn 这用于创建新进程并对其进行初始化
-module(helloworld).
-export([start/0]).
start() ->
spawn(fun() -> server("Hello") end).
server(Message) ->
io:fwrite("~p",[Message]).
输出 : hello
示例: node 这用于确定进程需要在其上运行的节点的值
-module(helloworld).
-export([start/0]).
start() ->
io:fwrite("~p",[node()]).
这将返回本地节点的名称。nonode@nohost如果节点未分布,则返回。 输出: nonode@nohost
示例: spawn 节点 这用于在节点上创建新进程 ; 此方法返回一个进程ID。
-module(helloworld).
-export([start/0]).
start() ->
spawn(node(),fun() -> server("Hello") end).
server(Message) ->
io:fwrite("~p",[Message]).
输出 : “Hello”
Erlang OTP
它是一个应用程序操作系统,以及一组用于构建大规模、容错和分布式应用程序的库和过程。如果你想使用 OTP 编写你自己的程序,
那么你会发现 OTP 行为是非常有用的核心概念。行为封装了常见的行为模式ーー可以把它看作是一个由回调模块参数化的应用程序框架。
OTP 的强大功能来自于它的容错性、可伸缩性、动态代码升级等特性,这些特性可以通过行为本身来提供。因此,第一个基本概念是创建一个模仿 OTP 环境基础的服务器组件,让我们看看下面这个相同的示例。
OTP 设计原则:
-
可伸缩性(Scalability): OTP 提供了一种可伸缩的编程模型,使得系统能够轻松地适应不同的负载和需求。它支持并发编程和分布式架构,可以有效地利用多核和分布式环境的优势。
-
容错性(Fault Tolerance): Erlang 的 OTP 框架具有强大的容错能力,能够在系统中处理错误和故障,并保持系统的稳定性和可用性。它采用了“让进程崩溃”的哲学,并提供了监督树和代码热更新等机制来管理和恢复故障。
-
热代码加载(Hot Code Loading): OTP 允许在不停机的情况下动态加载新的代码和模块,从而实现系统的热升级和无缝更新。这使得系统能够持续运行,并提供了更高的可用性和灵活性。
-
标准化和模块化(Standardization and Modularity): OTP 提供了一套标准的模块和设计模式,使得开发人员能够更快速、更一致地构建应用程序。它提供了一系列通用的库和工具,如并发原语、进程监督和消息传递,以帮助开发人员更轻松地构建可靠和高效的系统。
OTP 核心模块:
-
应用(Application): OTP 应用是 Erlang 系统的基本单元,通常由一组相关的模块组成,用于实现特定的功能或服务。每个应用都有自己的生命周期和状态,可以独立地启动、停止和管理。
-
进程(Process): 进程是 Erlang 的基本执行单元,由轻量级的 Erlang 虚拟机管理。OTP 提供了一种通用的进程模型,使得开发人员能够轻松创建和管理大量的并发进程,并通过消息传递进行通信。
-
监督(Supervision): OTP 提供了监督树的概念,用于管理和监控应用程序中的进程。监督树是一种层次结构,其中每个节点都是一个监督进程,负责监督和管理其子进程。这种层次结构可以有效地处理故障和错误,保证系统的稳定性和可靠性。
-
注册(Registry): OTP 提供了注册表机制,用于管理和查找全局命名的进程和资源。注册表允许进程在全局范围内注册自己的名称,并提供了一种快速查找进程和通信的方法。
-
事件(Event): OTP 提供了事件处理的机制,用于处理和响应系统中的事件和消息。事件可以是内部的或外部的,如进程状态改变、消息到达等,开发人员可以通过订阅和处理事件来实现特定的功能和逻辑。
Erlang 并发
Erlang 是一种并发编程语言,它通过轻量级进程和消息传递实现并发。每个 Erlang 进程都是独立的,它们之间不共享内存,只能通过消息传递进行通信。