您的位置:首页 > 其它

面对软件错误构建可靠的分布式系统_笔记10

2009-02-01 22:27 423 查看
6构建应用

一个监督者+三个工作进程(gen_server, gen_event, gen_fsm)

6.1 behavior库

前三个是工作者+监督者+打包安装

gen_server:构建客户/服务器模型中的服务器

gen_event:构建事件处理程序,

gen_fsm:构建有限状态机

supervisor:构建监督树

application:整个应用程序打包的容器

6.1.1 behaviour库怎么写

eg: 创建module(xyz)

-module(xyz).

-behaviour(gen_server).

-export([init/1,handle_call/3, handl_cast/2,handle_info/2,terminate/2,change_code/3]).

至少要有上面的6个函数

6.2通用服务器

6.2.1通用服务器的API

(1)gen_server:start(Name1, Mod, Arg, Options) -> Result.

Name1:Mod.init(Arg) -> Result.

Name1:服务器名称,可以为{local, Name2}或{global, Name2},前者在单个节点上创建服务器,后者在一个透明的远端节点创建服务器

Mod:模块名称

Arg: 传递给Mod:init/1参数

Options:控制服务器的一组选项

Result:Mod:init/1返回值

(2)gen_server:call(Name2,Term) -> Result

Name2:Mod.handle_call(Term) -> Result.

Name2:服务器的名字,见上面说明

Term:传递给Mod:handle_call/3的参数

Result:Mod:handle_call/1的返回值

(3)gen_server:cast(Name2,Term) -> ok

Name2:Mod.handle_cast(Term) -> ok

Name2:服务器的名字

Term:传递给Mod:handle_cast/3的参数

(4)Mod:init(Arg) -> {ok, State} | {stop, Reason}

启动服务器gen_server:start/4

Arg:传递给gen_server:start/4的参数

{ok, State}启动成功, gen_start:start返回{ok, Pid}

{stop, Reason}启动失败,gen_start:start返回{error, Reason}.

(5)Mod:handle_call(Term, From, State) -> {reply, R, S1}

gen_server:call(Name, Term)被调用

Term:用户定义的参数

From:标示客户

State:服务器当前状态

{reply,R,S1}使gen_server:call/2返回值为R,服务器新状态为S1

(6)Mod:handle_cast(Term, State) -> {noreply,S1} | {stop, R, S1}

被gen_server:cast(Name, Term)

Term:任意项式,作为参数

State:服务器当前参数

{noreply,S1}服务器新状态S1

{stop, R, S1}服务器停止,停止时调用Mod:terminate(R,S1).

(7)Mod:terminate(R,S) -> void

停止时调用,返回空

R:服务器停止原因

State:服务器当前状态

6.2.2通用服务器例子

通过gen_server实现Key_Value服务器

eg:

-module(thesis_kv).
-behaviour(gen_server).

-export([init/1, start/0, stop/0, terminate/2, handle_call/3,handle_cast/2]).
-export([lookup/1, store/2]).

start() -> gen_server:start_link({local, thesis_kv}, thesis_kv, arg1, []).

stop() -> gen_server:cast(thesis_kv, stop).

init(arg1) ->
io:format("Key-Value server starting~n"),
{ok, dict:new()}.

store(Key, Val) ->
gen_server:call(thesis_kv, {store,Key, Val}).

lookup(Key) -> gen_server:call(thesis_kv, {lookup, Key}).

handle_call({store,Key,Val}, From, Dict) ->
Dict1 = dict:store(Key, Val, Dict),
{reply, ack, Dict1};
handle_call({lookup, Key}, From, Dict) ->
{reply, dict:find(Key, Dict), Dict}.

handle_cast(stop,Dict) -> {stop, normal, Dict}.

terminate(Reason, Dict) ->
io:format("Key-Value server terminate~n").
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: