• 分布式监控树


     Erlang中有不同的监督策略,包括一对一监督(one-for-one)、一对多监督(one-for-all)和简单监督(simple-one-for-one)。不同的监督策略适用于不同的故障处理场景。

    one-for-one 

    如果一个子进程终止了,仅该进程被重启

    one-for-all

    如果一个子进程终止了,那么所有其他的子进程都被终止然后,所有的子进程都被重启,包括原来被终止的那个。

    rest_for_one

    如果一个子进程终止了,那么后面的子进程——即在启动顺序上在这个终止了的进程后面的子进程——都被终止。然后该终止的进程和后面的子进程都被重启。

    1. -module(sellaprime_supervisor).
    2. -behaviour(supervisor). % see erl -man supervisor
    3. -export([start/0, start_in_shell_for_testing/0, start_link/1, init/1]).
    4. start() ->
    5. spawn(fun() ->
    6. supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = [])
    7. end).
    8. start_in_shell_for_testing() ->
    9. {ok, Pid} = supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []),
    10. unlink(Pid).
    11. start_link(Args) ->
    12. supervisor:start_link({local, ?MODULE}, ?MODULE, Args).
    13. init([]) ->
    14. gen_event:swap_handler(alarm_handler,
    15. {alarm_handler, swap},
    16. {my_alarm_handler, xyz}),
    17. {ok, {{one_for_all, 3, 10},
    18. [
    19. {tag1,
    20. {tcp_server, start, []},
    21. permanent,
    22. 10000,
    23. worker,
    24. [area_server]},
    25. {tag2,
    26. {start_tcp_client, start_link, []},
    27. permanent,
    28. 10000,
    29. worker,
    30. [prime_server]}
    31. ]}}.
    1. -module(tcp_server).
    2. -author("chen").
    3. -behaviour(gen_server).
    4. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3, start/0]).
    5. -define(PORT,8003).
    6. -record(state, {socket}).
    7. start() ->
    8. gen_server:start_link({local, ?MODULE}, ?MODULE, ?PORT, []).
    9. init(Port) ->
    10. {ok, LSocket} = gen_tcp:listen(Port, [binary, {packet, 4}, {active, true}, {reuseaddr, true}]),
    11. self() ! {to_accept, LSocket},
    12. io:format("start tcp_server ~n"),
    13. {ok, #state{socket = LSocket}}.
    14. do_accept(LSocket) ->
    15. {ok, Socket} = gen_tcp:accept(LSocket),
    16. io:fwrite("Socket connected: ~w ~n", [Socket]),
    17. {ok, Pid} = gen_server:start_link(server_rec, Socket, []),
    18. gen_tcp:controlling_process(Socket, Pid),
    19. do_accept(LSocket).
    20. handle_info({to_accept, LSocket}, State) ->
    21. do_accept(LSocket),
    22. {noreply, State}.
    23. handle_call(stop, _From, Tab) ->
    24. {stop, normal, stopped, Tab}.
    25. handle_cast(_Msg, State) ->
    26. {noreply, State}.
    27. terminate(_Reason, _State) ->
    28. ok.
    29. code_change(_OldVsn, State, _Extra) ->
    30. {ok, State}.

     

     通过启动一个监督程序,同时启动了两个进程,

     

     客户端发送消息,tcp接收消息,崩溃。

     服务重新启动。

  • 相关阅读:
    【Python学习笔记】Python中的heapq
    HUDI概述
    【Java SE】面向对象三大特性之封装
    粒子群算法(PSO)优化双向长短期记忆神经网络的数据分类预测,PSO-BiLSTM分类预测,多输入单输出模型
    单向环形链表介绍以及约瑟夫问题分析
    Python字符串—String
    Leetcode 1619. 删除某些元素后的数组均值
    LeetCode --- 1952. Three Divisors 解题报告
    virtualbox 下载安装
    知识图谱增强的KG-RAG框架
  • 原文地址:https://blog.csdn.net/weixin_48283045/article/details/133849891