[erlang-questions] Why have a supervisor behaviour?

Jesper Louis Andersen jesper.louis.andersen@REDACTED
Thu May 21 17:58:39 CEST 2015


On Thu, May 21, 2015 at 5:00 PM, Roger Lipscombe <roger@REDACTED>
wrote:

> I need delayed _restart_. Is this what Jesper refers to when he talks
> about "a delay_manager"? Such that init queries that and then
> might/might not delay?
>

%% The delay manager decouples delay policy from a worker by tracking
delays in one place.
%% As such, it has global knowledge and can opt to delay registered
processes more or less
%% depending on current load.
-module(delay_mgr).
-behaviour(gen_server).

[..]

%% Call this from a newly started worker, but not in it's init/1 callback
since that blocks the supervisor
%% Send the process itself a message in init/1 and do it in that state.
delay(Reg) ->
    gen_server:call(?MODULE, {delay, Reg}, infinity).

[..]

handle_call({delay, Reg}, From, #state { conf = Conf }) ->
    Delay = maps:get(Reg, Conf),
    erlang:send_after(Delay, self(), {go, From}),
    {noreply, State};

handle_info({go, Reg}, State) ->
    gen_server:reply(From, ok),
    {noreply, State};

[..]

This is static skeleton, but:

* Add monitoring of delayed processes. Increase the delay for processes
that respawn too often
* Decay delays for processes which operates as they should
* Add metrics and stats

-- 
J.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150521/31d6f33d/attachment.htm>


More information about the erlang-questions mailing list