Eralng 学习笔记第七天, 分布式编程 , OTP , 并发

Erlang 分布式编程

 在Erlang中,分布式编程是一种常见的方式,用于构建可靠、高可用、高并发的分布式系统。Erlang提供了强大的原语和工具来支持分布式编程。以下是一些关键概念和方法:

  1. 节点(Node):Erlang分布式系统中的基本单元。一个节点是一个运行Erlang运行时系统(ERTS)的独立实例,可以在网络上的任何位置运行。

  2. 节点之间通信:Erlang节点可以通过网络相互通信,发送和接收消息。节点之间的通信基于Erlang的消息传递模型,可以使用net_kernel模块建立节点之间的连接。

  3. 节点标识:每个节点都有一个唯一的名称,通常是一个原子或者是一个本地IP地址。节点之间的通信可以使用节点名称来标识接收方。

  4. 分布式应用架构:在分布式系统中,Erlang应用程序通常被设计成由多个节点组成的分布式集群。每个节点可以运行一个或多个Erlang进程,这些进程可以在集群中的不同节点上相互通信。

  5. 全局进程注册表:Erlang提供了全局进程注册表(Global Process Registry),可以让进程在整个分布式系统中注册和查找。这使得进程可以通过名称而不是PID来通信,从而简化了分布式系统中进程之间的通信。

  6. 分布式数据存储:在分布式系统中,数据通常需要在多个节点之间进行共享和同步。Erlang提供了多种分布式数据存储解决方案,包括ETS表、Mnesia数据库和基于第三方存储服务的集成。

  7. 容错性: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”
  1. 节点连接: 在 Erlang 中,分布式编程的第一步是建立节点之间的连接。节点是运行 Erlang 虚拟机的实例,可以是同一台计算机上的不同进程,也可以是不同计算机上的进程。通过 net_kernel:start/1net_adm:ping/1 等函数可以建立节点之间的连接。

  2. 节点注册: 每个节点都有一个全局唯一的名称,称为节点名称。节点可以通过 net_kernel:connect_node/1net_kernel:connect_node/2 函数注册自己的名称。这样,其他节点就可以使用节点名称来识别和访问它。

  3. 远程过程调用(RPC): Erlang 允许在不同节点上调用远程函数,这被称为远程过程调用(RPC)。使用 rpc:call/4 函数可以在目标节点上调用指定模块中的函数,并获取返回结果。

  4. 消息传递: 在 Erlang 中,进程之间的主要通信方式是通过消息传递。进程可以发送和接收消息,无论这些进程是在同一个节点上还是不同的节点上。使用 ! 操作符可以发送消息,而 receive 表达式可以接收消息。

  5. 分布式数据存储: Erlang 提供了分布式数据存储机制,例如 Mnesia 数据库和 dets 模块,可以在分布式系统中方便地存储和检索数据。

  6. 监视和链接: Erlang 提供了监视和链接功能,用于监控节点和进程的状态,并在需要时进行处理。通过 erlang:monitor_node/2erlang:monitor/2erlang:link/1 等函数可以实现监视和链接功能。

    通过这些机制,Erlang 提供了一种灵活而强大的方式来构建分布式系统,使得开发人员可以轻松地实现高可用性、高并发性和容错性。

 

Erlang OTP

它是一个应用程序操作系统,以及一组用于构建大规模、容错和分布式应用程序的库和过程。如果你想使用 OTP 编写你自己的程序,

那么你会发现 OTP 行为是非常有用的核心概念。行为封装了常见的行为模式ーー可以把它看作是一个由回调模块参数化的应用程序框架。

OTP 的强大功能来自于它的容错性、可伸缩性、动态代码升级等特性,这些特性可以通过行为本身来提供。因此,第一个基本概念是创建一个模仿 OTP 环境基础的服务器组件,让我们看看下面这个相同的示例。

 

OTP 设计原则:

  1. 可伸缩性(Scalability): OTP 提供了一种可伸缩的编程模型,使得系统能够轻松地适应不同的负载和需求。它支持并发编程和分布式架构,可以有效地利用多核和分布式环境的优势。

  2. 容错性(Fault Tolerance): Erlang 的 OTP 框架具有强大的容错能力,能够在系统中处理错误和故障,并保持系统的稳定性和可用性。它采用了“让进程崩溃”的哲学,并提供了监督树和代码热更新等机制来管理和恢复故障。

  3. 热代码加载(Hot Code Loading): OTP 允许在不停机的情况下动态加载新的代码和模块,从而实现系统的热升级和无缝更新。这使得系统能够持续运行,并提供了更高的可用性和灵活性。

  4. 标准化和模块化(Standardization and Modularity): OTP 提供了一套标准的模块和设计模式,使得开发人员能够更快速、更一致地构建应用程序。它提供了一系列通用的库和工具,如并发原语、进程监督和消息传递,以帮助开发人员更轻松地构建可靠和高效的系统。

OTP 核心模块:

  1. 应用(Application): OTP 应用是 Erlang 系统的基本单元,通常由一组相关的模块组成,用于实现特定的功能或服务。每个应用都有自己的生命周期和状态,可以独立地启动、停止和管理。

  2. 进程(Process): 进程是 Erlang 的基本执行单元,由轻量级的 Erlang 虚拟机管理。OTP 提供了一种通用的进程模型,使得开发人员能够轻松创建和管理大量的并发进程,并通过消息传递进行通信。

  3. 监督(Supervision): OTP 提供了监督树的概念,用于管理和监控应用程序中的进程。监督树是一种层次结构,其中每个节点都是一个监督进程,负责监督和管理其子进程。这种层次结构可以有效地处理故障和错误,保证系统的稳定性和可靠性。

  4. 注册(Registry): OTP 提供了注册表机制,用于管理和查找全局命名的进程和资源。注册表允许进程在全局范围内注册自己的名称,并提供了一种快速查找进程和通信的方法。

  5. 事件(Event): OTP 提供了事件处理的机制,用于处理和响应系统中的事件和消息。事件可以是内部的或外部的,如进程状态改变、消息到达等,开发人员可以通过订阅和处理事件来实现特定的功能和逻辑。

Erlang 并发

Erlang 是一种并发编程语言,它通过轻量级进程和消息传递实现并发。每个 Erlang 进程都是独立的,它们之间不共享内存,只能通过消息传递进行通信。

posted @ 2024-02-05 16:31  d-w  阅读(58)  评论(0编辑  收藏  举报