文档章节

OTP应用与监督机制

nao
 nao
发布于 2015/02/27 15:23
字数 1620
阅读 125
收藏 0
点赞 0
评论 0

OTP应用的组织形式:

应用目录的名字 <application-name>[-Version] 以及 应用目录下的子目录


为应用添加元数据:

{application, static_world, [
         {description, "Cowboy static file handler example."},
         {vsn, "1"},
         {modules, []},
         {registered, [static_world_sup]},
         {applications, [
                   kernel,
                   stdlib,
                   cowboy
         ]},
         {mod, {static_world_app, []}},
         {env, []}
]}.

这个.app文件的作用在于告诉OTP如何启动应用,以及该应用如何与系统中的其他应用相融合。再重复一遍,我们的首要目的并不是在于打包发布,而在于组装更大的可启动,停止,监督和升级的功能单元。

.app文件的格式很简单。除去注释,只剩下一个由句号结尾的Erlang项式:三元组{applications,…,….}. 。第二个元素是应用名称所对应的原子,此处即是static_world。第三个元素是一个参数列表,其中每个参数都是{key, Value}对的形式,有些是必需的,有些是可选的。

.app文件中的主要参数

    建立好了应用的目录结构,元数据,整个引用还远未完工。Mod的描述中曾提到,你的应用还需要一个启动入口,它必须是application行为模式的一个实现模块。


应用行为模式:

每个主动应用都配有一个application行为模式的实现模块。该模块用于实现系统启动逻辑。它至少要负责根监督者的启动,该监督者将成为应用中其他所有应用进程的鼻祖。根据系统需要,应用行为模式模块还可以完成一些其他任务。

应用行为模式的命名:

         应用行为模式的实现模块通常被命名为<application-name>_app

%% @private
-module(static_world_app).
-behaviour(application).           %%行为模式声明
%% API                             %%引用行为模式的回调函数
-export([start/2]).
-export([stop/1]).
 
%% API
start(_Type, _Args) ->
         Dispatch = cowboy_router:compile([
                   {'_',[
                            {"/[...]", cowboy_static, {priv_dir, static_world, ""}}
                   ]}
                   ]),
{ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [
                            {env, [{dispatch, Dispatch}]
                      ]),
         static_world_sup:start_link().    %%启动根监督者
 
stop( _State) ->
         ok.

总结一下:建立一个OTP应用要做3件事情:

(1)       遵循标准目录结构

(2)       添加用于存在应用的元数据的.app文件

(3)       创建一个application行为模式实现模块,负责启动应用。


实现监督者:

根监督者行为模式模块的命名

         根监督者行为模式的实现模块通常被命名为<application-name>_sup

%% @private
-module(static_world_sup).
-behaviour(supervisor).

%%API
-export([start_link/0]).

%%supervisor
-export([init/1]).

%% API
start_link() ->
	supervisor:start_link({local, ?MODULE}, ?MODULE, []).  %%启动监督者


%% supervisor

init([]) ->
	Procs = [],
	{ok, {{one_for_one, 10, 10}, Procs}}.

监督者启动策略:

{one_for_one, 10, 10} ,它是一个三元组{How, Max, Within},这里的How取值为one_for_one, 表示一旦有子进程退出,监督者就针对该进程,且针对该进程进行重启。该重启操作不会影响同时运行的其他进程。

Max和Within这两个值(此处分别取10和10)是相互关联的:它们共同确定了重启频率, 第一个值指定的是最大重启次数,第二个值指定的是时间片。表示监督者最多可以在10秒内重启子进程10次。一旦超过限制,监督者就会在终止所有子进程后自我了断,并顺着监督者向上汇报故障信息。这些数值的取值最大程度上取决于应用本身。因此无法在此给出一个普适的推荐值。


编写子进程规范:

    子进程规范是一个用于描述监督者管理的进程的元组。对于大多数监督者而言,子进程会随监督者的启动而启动并在监督者的生命周期结束时退出。对于单个需要监督的进程,

在cowboy_sup中的子进程规范的编写如下:

Procs = [{cowboy_clock, {cowboy_clock, start_link, []},
		permanent, 5000, worker, [cowboy_clock]}],

子进程规范由6个元素组成:{ID, start, Restart, Shutdown, Type, Modules}。

  • 第一个元素ID,是一个用于在系统内部标识各规范的项式。简单起见,采用的模块名,即原子cowboy_colock。

  • 第二项Start, 是一个用于启动进程的三元组{Module, Function, Arguments}。与调用内置函数spawn/3时一样,其中第一个元素时模块名,第二个元素时函数名,第三个元素是函数的调用参数列表。在这个例子中,监督者应调用cowboy_clock:start_link来启动子进程。

  • 第三个参数Restart,用于指明子进程发生故障时是否需要重启。此处指定为permanent,因为你搭建的是一个需要长期运行的服务,无论出于任何原因导致进程终止都应该重启进程。(该选项还可取值为表示永不重启进程的temporary),以及仅在进程意外终止时重启进程的transient。

  • 第四个参数Shutdown,用于指明如何终止进程。此处取值为一个整数(5000),表示终止进程时应采用软关闭策略,给进程留出一段自我了断的时间(以毫秒为单位),如果进程未能在指定时间内自行退出,将被无条件终止。该选项还可取值为brutal_kill,表示在关闭监督进程时立即终止子进程;以及infinity,主要用于子进程本身也同为监督者的情况,表示应给予子进程充分的时间进行自行退出。

  • 第五个值Type,用于表示进程是监督者(supervisor)还是工作者(worker)。在整个监督树中,除了实现了supervisor行为模式的监督者进程以外,剩下的都是工作进程。随着应用的复杂度的提升,你可以按自己的喜好组织监督进程进而形成层级结构,以提供更细粒度的控制。监督者可以通过Type字段识别子进程是否同为监督者。显然此处的服务器进程是工作进程。

  • 第六个选项列出了该进程所依赖的模块。这部分信息仅用于在代码热升级时告知系统改以何种顺序升级整个模块。一般来说,只需列出子进程的主模块,在这里是cowboy_clock。

这样一步步来,OTP简单的应用框架就形成了。似乎还缺少自己的一些思考和整理……



© 著作权归作者所有

共有 人打赏支持
nao

nao

粉丝 28
博文 147
码字总数 107499
作品 0
徐汇
elixir官方入门教程 学习资料

下一步该去哪 构建你的第一个Elixir项目 元编程 社区与其它资源 Erlang基础 想要学习更多?继续阅读! 构建你的第一个Elixir项目 为了开始你的第一个项目,Elixir装载了一个叫做Mix的构建工具....

ljzn ⋅ 2016/08/06 ⋅ 0

Erlang/OTP 18.1.4 发布

Erlang/OTP 18.1.4 发布,此版本主要是更新了一些应用: 修改的应用- inets-6.0.3 未修改应用- asn1-4.0- common_test-1.11- compiler-6.0.1- cosEvent-2.2- cosEventDomain-1.2- cosFileTr......

oschina ⋅ 2015/11/14 ⋅ 7

Erlang/OTP 18.2.2 发布下载

Erlang/OTP 18.2.2 发布下载,暂未有相关说明,请关注官方 News。 详细改进内容请看 commits: src="https://github.com/erlang/otp/compare/OTP-18.2.2...maint" href="https://github.com/......

oschina ⋅ 2016/01/12 ⋅ 14

Erlang 18.0.2/17.5.6.2 发布

Erlang 18.0.2 和 Erlang 17.5.6.2 发布,包括一些应用更新和小修复。 Erlang 18.0.2 改进的应用: - erts-7.0.2 - runtimetools-1.9.1 Erlang 17.5.6.2 改进的应用: - erts-6.4.1.2 - run...

oschina ⋅ 2015/07/10 ⋅ 3

Erlang/OTP 17.0-rc2 发布

Erlang/OTP 17.0-rc2 发布,Erlang/OTP 17.0 是个新的重大版本发布,包括了许多新特性,很小一部分的改进和修复了一些兼容性问题。此版本主要是把默认编码从 ISO-8859-1 修改为 UTF-8,xml 文...

oschina ⋅ 2014/03/01 ⋅ 6

Erlang 18.0.1/17.5.6.1 发布

Erlang 18.0.1 和 Erlang 17.5.6.1 发布,主要是 bug 修复:Fix race in poller thread wake up 。 下载: src="https://github.com/erlang/otp/archive/OTP-18.0.1.zip" href="https://git......

oschina ⋅ 2015/07/06 ⋅ 5

Erlang/OTP 18.1 发布

Erlang/OTP 18.1 发布,此版本主要是 bug 修复,也包含一些新特性和改进。 值得关注的改进: ssl: Add possibility to downgrade an SSL/TLS connection to a tcpconnection, and give back ...

oschina ⋅ 2015/09/27 ⋅ 4

Erlang/OTP 18.1.5 发布下载

Erlang/OTP 18.1.5 发布,此版本把 ssh 升级到 ssh 4.1.3 版本。 下载: https://github.com/erlang/otp/archive/OTP-18.1.5.zip Erlang是一个结构化,动态类型编程语言,内建并行计算支持。...

oschina ⋅ 2015/11/28 ⋅ 9

Erlang/OTP 18.1.3 发布,应用更新版本

Erlang/OTP 18.1.3 发布,此版本更新内容如下: Changed Applications:- ssh-4.1.2 Unchanged Applications:- asn1-4.0- common_test-1.11- compiler-6.0.1- cosEvent-2.2- cosEventDomain-1......

oschina ⋅ 2015/10/18 ⋅ 5

编程语言 Erlang/OTP 18 RC1 和 17.5 发布

Erlang/OTP 18 RC1 发布,此版本是个 Alpha 版本,5 月份将会发布 Beta 版本,最终的 OTP 18.0 会在 2015 年 6 月份发布! Erlang/OTP 18.0 包括重要的新特性(Dialyzer, Maps),大量的改进(...

oschina ⋅ 2015/04/03 ⋅ 13

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 6分钟前 ⋅ 0

MySQL 内核深度优化

MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务...

OSC_cnhwTY ⋅ 13分钟前 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 15分钟前 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 23分钟前 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 24分钟前 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 53分钟前 ⋅ 0

Linux(CentOS)下配置php运行环境及nginx解析php

【part1:搭建php环境】 1.选在自己需要安装的安装包版本,wget命令下载到服务器响应目录 http://php.net/releases/ 2.解压安装包 tar zxf php-x.x.x 3.cd到解压目录执行如下操作 cd ../php-...

硅谷课堂 ⋅ 今天 ⋅ 0

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部