У каждого приложения свой супервизор, который следит за всем тем, что происходит в этом приложении.
Приложение гарантирует, что оно всеми силами будет пытаться предоставить заявленную функциональность.
То есть, приложение-зависимость следует рассматривать как import в питоне или require в руби. Перед стартом вашего приложения запускаются все зависимости, после этого каждая зависимость предоставляет свой API.
Приложение должно быть написано так, чтобы оно не могло упасть. Запуск приложения – это инициализация окружения. В процессе запуска создается дерево супервизоров, в которое будут вставляться инстансы, создаются таблицы, запускаются менеджеры (таблицы и менеджеры не работают с данными других приложений, а занимаются исключительно координацией инстансов этого приложения).
Например:
Ваше приложение super_chat зависит от приложения super_http_server .
Приложение super_http_server зависит от приложения super_tcp_acceptor.
Что должно происходить на запуске:
1. Запускается super_tcp_acceptor, который создает пустой супервизор.
2. Запускается super_http_server, который создает пустой супервизор.
3. Запускается super_chat
3.1 Создается инстанс сервера super_http_server, который попадает в супервизор этого приложения
3.2 Создается инстанс акцептора super_tcp_acceptor, который попадает в супервизор этого приложения
При принятии соединения акцептор добавляет ребенка в свой внутренний супервизор (не коренной всего приложения, а где-то в глубинах инстанса), ребенок связывается с инстансом http-сервера, который говорит ему, как связаться с главным приложением.
В этой схеме если что-то и может упасть, то это всего лишь инстансы в зависимых приложениях. Сами приложения продолжат работать, а главное приложение или получит уведомление о сломавшемся инстансе http-сервера, или умрет вместе с ним.