面对软件错误构建可靠的分布式系统_笔记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").
一个监督者+三个工作进程(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").
相关文章推荐
- 面对软件错误构建可靠的分布式系统_笔记09
- 面对软件错误构建可靠的分布式系统_笔记03
- 面对软件错误构建可靠的分布式系统_笔记04
- 面对软件错误构建可靠的分布式系统_笔记05
- 面对软件错误构建可靠的分布式系统_笔记11
- 面对软件错误构建可靠的分布式系统_笔记06
- 面对软件错误构建可靠的分布式系统_笔记12
- 面对软件错误构建可靠的分布式系统_笔记13
- 面对软件错误构建可靠的分布式系统_笔记01
- 面对软件错误构建可靠的分布式系统_笔记07
- 面对软件错误构建可靠的分布式系统_笔记14
- 面对软件错误构建可靠的分布式系统_笔记02
- 面对软件错误构建可靠的分布式系统_笔记08
- 面对软件错误构建可靠的分布式系统-2绪论
- 面对软件错误构建可靠的分布式系统-7构建应用
- 面对软件错误构建可靠的分布式系统-8OTP介绍
- 面对软件错误构建可靠的分布式系统-3架构模型
- 面对软件错误构建可靠的分布式系统-9案例研究
- 面对软件错误构建可靠的分布式系统-4Erlang
- 面对软件错误构建可靠的分布式系统-10API与协议