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

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").  

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值