[erlang-questions] patterns or best practices to shut applications down?

Ryan Stewart zzantozz@REDACTED
Sat Dec 23 22:00:57 CET 2017


Specifically for web applications, and more specifically for a webapp that
can have long-running requests (measured in minutes), I've found it
extremely convenient to have a supervised gen_server that simply tracks the
start and end of each http request. It traps exits so that when it's told
to shut down, it can enter a "terminate loop", and it doesn't terminate
until all requests have completed or a timeout elapses. This is
complemented by a shutdown timeout in its supervisor, which will hard kill
it eventually, in the case that something goes terribly wrong. After that,
it's just a matter of getting your supervisor/process start/stop in the
correct order.

On Sat, Dec 23, 2017 at 9:07 AM PAILLEAU Eric <eric.pailleau@REDACTED>
wrote:

> Hi,
> in addition to other answers, it is worth noting that you can set
> a maximum time to VM to stop.
>
> http://erlang.org/doc/man/init.html
>
> "To limit the shutdown time, the time init is allowed to spend taking
> down applications, command-line flag -shutdown_time is to be used."
>
> this can be very useful when some processes are stuck in abnormal
> terminate work. But using this you can loose data obviously.
> Restart time is sometime more important than loosing some cleanup.
>
> Regards
>
>
>
>
> Le 23/12/2017 à 15:41, Fred Hebert a écrit :
> > On 12/23, Xavier Noria wrote:
> >>
> >> But there's something that bugs me and prevents me from imagining
> >> complete
> >> and round solutions, which is shutting down. When shutting down (think
> >> autoescaling, deploys, etc.). I have a live system that needs to stop
> >> orderly.
> >>
> >> Are there patterns or best practises about how to design this aspect
> >> of the
> >> system?
> >
> > Good news! You already have this covered with OTP.
> >
> > When shutting down a supervision tree, the supervisor will send down a
> > `shutdown` exit signal to each of its children in order. A child
> > supervisor will trap exit on this, and forward it to its own children
> > first.
> >
> > If your worker has nothing special to do, just let it die. If it needs
> > some special cleanup, trap exit in the worker and `terminate` will be
> > called.
> >
> > So the supervision structure you have that tells how the program boots
> > also tells how it shuts down. You do have to be careful about the
> > handling of timeouts though (or brutal_kill will catch you up).
> > _______________________________________________
> > erlang-questions mailing list
> > erlang-questions@REDACTED
> > http://erlang.org/mailman/listinfo/erlang-questions
> >
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20171223/08c9ea17/attachment.htm>


More information about the erlang-questions mailing list