1.概述

OTP设计原则是针对如何根据进程、模块和目录组织Erlang代码的一系列原则。

监督树

在Erlang/OTP中有一个基本概念叫监督树。这是一种建立在督程佣程思想上的进程结构化模型。
  • 佣程(worker)是进行计算的进程,也就是说,它们进行实际的工作。
  • 督程(supervisor)是监视工作者行为的进程。监督者可以重启工作者如果出现了什么问题.
  • 监督树是一种将代码分成监督者和工作者的层次安排,这样才能设计和编写可容错的软件。

上图中,方框提供监督,圆圈是工作者。

行为

在监督树中,很多进程有着相似结构,遵循类似的模式。例如,督程的结构都很相 似。他们之间的唯一区别在于所监督的子进程。此外,很多佣程都是处于服务器-客户端关系中的服务器,有限状态机或者诸如错误日志这样的事件处理器。

行为是对这些常见模式的形式化。其思想是将一个进程的代码划分为一个通用的部分(行为模块)和一个特定的部分(回调模块)。

行为模块是Erlang/OTP的一部分。要实现一个督程,用户只需要实现回调模块,导出预定义集合中的函数—— 回调函数 。

一个例子可以用来说明代码是如何被划分成为通用和特定部分的:考虑下面的代码(普通Erlang编写),一个简单的服务器,用于保持跟踪一些“频道”。其他进程可以通过调用 alloc/0 和 free/1 函数来相应地分配和释放一个频道。

-module(ch1).
-export([start/0]).
-export([alloc/0, free/1]).
-export([init/0]).
start() ->
    spawn(ch1, init, []).
alloc() ->
    ch1 ! {self(), alloc},
    receive
        {ch1, Res} ->
            Res
    end.
free(Ch) ->
    ch1 ! {free, Ch},
    ok.
init() ->
    register(ch1, self()),
    Chs = channels(),
    loop(Chs).
loop(Chs) ->
    receive
        {From, alloc} ->
            {Ch, Chs2} = alloc(Chs),
            From ! {ch1, Ch},
            loop(Chs2);
        {free, Ch} ->
            Chs2 = free(Ch, Chs),
            loop(Chs2)
    end.

服务器的代码可以重写为一个通用的部分 server.erl:

-module(server).
-export([start/1]).
-export([call/2, cast/2]).
-export([init/1]).
start(Mod) ->
    spawn(server, init, [Mod]).
call(Name, Req) ->
    Name ! {call, self(), Req},
    receive
        {Name, Res} ->
            Res
    end.
cast(Name, Req) ->
    Name ! {cast, Req},
    ok.
init(Mod) ->
    register(Mod, self()),
    State = Mod:init(),
    loop(Mod, State).
loop(Mod, State) ->
    receive
        {call, From, Req} ->
            {Res, State2} = Mod:handle_call(Req, State),
            From ! {Mod, Res},
            loop(Mod, State2);
        {cast, Req} ->
            State2 = Mod:handle_cast(Req, State),
            loop(Mod, State2)
    end.

还有一个回调模块 ch2.erl:

-module(ch2).
-export([start/0]).
-export([alloc/0, free/1]).
-export([init/0, handle_call/2, handle_cast/2]).

start() ->
    server:start(ch2).

alloc() ->
    server:call(ch2, alloc).

free(Ch) ->
    server:cast(ch2, {free, Ch}).

init() ->
    channels().

handle_call(alloc, Chs) ->
    alloc(Chs). % => {Ch,Chs2}

handle_cast({free, Ch}, Chs) ->
    free(Ch, Chs). % => Chs2
注意以下几点:
  • server 中的代码可以被重用于建立很多不同的服务器端。
  • 服务器的名字——这个例子中为原子 ch2 ——对于客户端函数的用户而言是隐藏的。这意味无须影响客户端就可以改变名字。
  • 协议(发给服务器和从服务器接收到的消息)也是隐藏的。这是很好的编程实践,让我们可以在不改变接口函数的代码的情况下改变协议。
  • 我们可以扩展服务器 server 的功能,而不用改变 ch2 或任何其它的回调模块。

(在上面的 ch1.erl 和 ch2.erl 中, channels/0 、 alloc/1 、 free/2 的实现被特意省略了,因为和这个例子无关。为了完整起见,下面会给出这些函数的一种写法。注意这只是个例子,实际的实现必须能够处理一些特殊情况,如频道用光无法分配等)

channels() ->
   {_Allocated = [], _Free = lists:seq(1,100)}.

alloc({Allocated, [H|T] = _Free}) ->
   {H, {[H|Allocated], T}}.

free(Ch, {Alloc, Free} = Channels) ->
   case lists:member(Ch, Alloc) of
      true ->
         {lists:delete(Ch, Alloc), [Ch|Free]};
      false ->
         Channels
   end.

不用行为来写的代码可能会更快些,但是所提高的效率是要付出通用性上的代价。对系统中以一致的方式管理所有应用的能力是非常重要的。

使用行为也可以使得由其他程序员所写的代码更容易阅读和理解。专门的编程结构,可能会更高效,但是往往更加难于理解。

模块 server 对应的是极大简化了的Erlang/OTP中的 gen_server 行为。

标准 Erlang/OTP 行为有:

gen_server
用于实现 C/S 结构中的服务端。
gen_fsm
用于实现有限状态机。
gen_event
用于实现事件处理功能。
supervisor
用于实现监督树中的督程。

编译器看到模块属性 -behaviour(Behaviour). 后会提出缺少的回调函数的警告。例如:

-module(chs3).
-behaviour(gen_server).
...

3> c(chs3).
./chs3.erl:10: Warning: undefined call-back function handle_call/3
{ok,chs3}

应用

Erlang/OTP还提供了一系列组件,每个实现一些特定的功能。这种组件用Erlang/OTP的术语来说,叫做应用(application)。Erlang/OTP应用的例子有:Mnesia,具备了所有数据库服务编程所需的东西;Debugger,用于调试Erlang程序。基于Erlang/OTP的最精简的系统由应用KERNEL和STDLIB组成。

使用标准行为可以很简单地将一个带有进程的应用程序实现为监督树。

如何编写应用将在 应用 一节进行描述。

发布

一个发布(release)是一个由Erlang/OTP应用的子集和一系列用户定义的应用组成的完整系统。

如何编写应用将在发布 <releases>一节中进行描述。

发布处理

发布处理是在一个(可能)运行中的系统上,对一个发布的不同版本之间进行升级和降级的操作。在 发布处理 一节中会描述怎么做。

时间: 2024-10-13 00:52:33

1.概述的相关文章

《大型站点技术架构》1:概述

參考自<大型站点技术架构>第1~3章 1.大型站点架构演化发展历程 (1)初始阶段的站点架构:一台server分别作为应用.数据.文件server (2)应用服务和数据服务分离:三台server分别承担上述三项工作,当中应用server要求CPU强大.数据库server需求更快的硬盘和内存,文件server须要较大的硬盘. (3)使用缓存改善站点性能:分为本地缓存以及缓存在专门的分布式server上的远程缓存. (4)使用应用server集群改善站点的并发处理能力. (5)数据库读写分离. (

大型站点技术架构(六)--站点的伸缩性架构

大型站点技术架构(一)--大型站点架构演化 大型站点技术架构(二)--架构模式 大型站点技术架构(三)--架构核心要素 大型站点技术架构(四)--站点的高性能架构 大型站点技术架构(五)--站点高可用架构 站点系统的伸缩性架构最重要的技术手段就是使用server集群功能.通过不断地向集群中加入server来增强整个集群的处理能力. "伸"即站点的规模和server的规模总是在不断扩大. 1.站点架构的伸缩性设计 站点的伸缩性设计能够分成两类,一类是依据功能进行物理分离实现伸缩.一类是单

大型站点技术架构(七)--站点的可扩展性架构

大型站点技术架构(一)--大型站点架构演化 大型站点技术架构(二)--架构模式 大型站点技术架构(三)--架构核心要素 大型站点技术架构(四)--站点的高性能架构 大型站点技术架构(五)--站点高可用架构 大型站点技术架构(六)--站点的伸缩性架构 扩展性是指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力. 设计站点可扩展架构的核心思想是模块化,并在此基础上,减少模块间的耦合性,提供模块的复用性.模块通过分布式部署,独立的模块部署在独立的server上(集群)从物理上分离模块之间的耦

大型站点技术架构(二)--架构模式

大型站点技术架构(一)--大型站点架构演化 每个模式描写叙述了一个在我们周围不断反复发生的问题及该问题解决方式的核心. 这样,你就能一次重新地使用该方案而不必做反复工作. 所谓站点架构模式即为了解决大型站点面临的高并发訪问.海量数据.高可靠执行灯一系列问题与挑战.为此.在实践中提出了很多解决方式,以实现站点高性能.高可靠性.易伸缩.可扩展.安全等各种技术架构目标. 1.分层 分词是企业应用系统中最常见的一种架构牧师,将系统在横向维度上切分成几个部分,每一个部分负责一部分相对简单并比較单一的职责,

大型站点技术架构(八)--站点的安全架构

大型站点技术架构(一)--大型站点架构演化 大型站点技术架构(二)--架构模式 大型站点技术架构(三)--架构核心要素 大型站点技术架构(四)--站点的高性能架构 大型站点技术架构(五)--站点高可用架构 大型站点技术架构(六)--站点的伸缩性架构 大型站点技术架构(七)--站点的可扩展性架构 从互联网诞生起,安全威胁就一直伴随着站点的发展,各种Web攻击和信息泄露也从未停止.常见的攻击手段有XSS攻击.SQL注入.CSRF.Session劫持等. 1.XSS攻击 XSS攻击即跨网站脚本攻击(C

大型站点技术架构PDF阅读笔记(一):

1.数据库读写分离: 2.系统吞吐量和系统并发数以及系统响应时间之间的关系: 3.系统负载的概念: 4.反向代理的概念: 5.使用缓存来读取数据: 6.利用cookie来记录session: 利用cookie记录session的缺点: 7.站点应用公布流程: 8.使用消息队列 9.异步调用: 10.应用的无状态性: 11.CDN的概念: 利用CDN的站点架构: 12.Hash表是怎样存储的: 13.memcache缓存:

大型站点技术架构阅读笔记(二)

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 原文地址:https://www.cnblogs.com/llguanli/p/8653205.html

大型站点系统架构的演化

原文:http://www.cnblogs.com/leefreeman/p/3993449.html 前言 一个成熟的大型站点(如淘宝.京东等)的系统架构并非開始设计就具备完整的高性能.高可用.安全等特性.它总是随着用户量的添加.业务功能的扩展逐渐演变完好的.在这个过程中,开发模式.技术架构.设计思想也发生了非常大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线.所以成熟的系统架构是随业务扩展而完好出来的.并非一蹴而就:不同业务特征的系统.会有各自的側重点,比如淘宝,要解决海量的商品

《大型网站技术架构》1:概述

参考自<大型网站技术架构>第1~3章 1.大型网站架构演化发展历程 (1)初始阶段的网站架构:一台服务器分别作为应用.数据.文件服务器 (2)应用服务和数据服务分离:三台服务器分别承担上述三项工作,其中应用服务器要求CPU强大.数据库服务器需求更快的硬盘和内存,文件服务器需要较大的硬盘. (3)使用缓存改善网站性能:分为本地缓存以及缓存在专门的分布式服务器上的远程缓存. (4)使用应用服务器集群改善网站的并发处理能力. (5)数据库读写分离. (6)使用反向代理和CDN加速网站响应.二者的基本

《大型网站技术架构核心原理与案例分析》阅读笔记-01

通过阅读该书籍我们能够更加清楚的树立大型网站的的技术发展历程,剖析大型网站技术架构模式,深入的讲述大型互联网架构核心原理,并通过一些典型的技术案例来讲述大型网站开发全景视图,该书籍深入的阐述了各种大型网站面临的各种架构问题及解决方案. 在第一章第一篇大型网站架构演化中了解到与传统企业应用系统相比,大型互联网应用系统具有高并发大流量.高可用性.海量数据.用户分布广泛,网络情况复杂.安全环境恶劣.需求快速变更,发布频繁.渐进式发展等特点:大型网站架构演化发展历程经历了初始阶段的网络架构它的应用程序.