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

4.2 Erlang世界观

一切皆进程

web服务器的架构

server(Client) ->

    receive

        {Client, close} ->

            true;

        {Client, Request} ->

            Response = generate_response(Request),

            Client ! {self(), Response},

            server(Client);

        after 10000 ->

            Client ! {self(), close}

    end.

 

 

 

web服务器代码

relay(Socket, Server, State) ->

    receive

        {tcp, Socket, Data} ->

            case parse_request(State, Data) of

                {completed, Request, Stat1} ->

                    Server ! {self(), {request, Request}},

                    relay(Socket, Server, State1);

                {more, State1}  ->

                     relay(Socket, Server, State1)

                     end;

                {tcp_closed, Socket} ->

                    Server ! {self(), close};

                {Server, close} ->

                    gen_tcp:close(Socket);

                {Server, Response} ->

                    Data = format_response(Response),

                    gen_tcp:send(Socket, Data),

                    relay(Socket, Server, State);

                {'EXIT', Server, _} ->

                    gen_tcp:close(Socket)

        end.

全部http代码:

http://www.sics.se/~joe/tutorials/web_server/http_driver.erl

 

4.3错误处理

原则:

(1)让其它进程修复错误

(2)要么成功,要么死掉

(3)任其崩溃

(4)不用防御式编程

 

4.3.1其它进程修复错误

Pid1如果错误,向Pid2发送消息: {'EXIT',Pid, Why}, 不论Pid1和Pid2是否在一个机器上

如果是Pid1的机器死掉,则发送:{'EXIT', Pid, machine_died} ,

 

4.3.2工作者和监督者

工作者执行正常工作

监督者检查工作者,负责错误处理等

 

4.4任它崩溃

由于有监督进程负责修复错误,因此对工作进程是任它崩溃。

这里的错误,只意料之外的错误,如果是正常工作流程的一种情况,则不算错误

 

4.5显意

保证一个函数处理一个问题,要显而易见

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值