Я рекомендую прочитать https://ferd.ca/the-zen-of-erlang.html
Вот мое понимание: рестарт эффективен для исправления «Heisenbug», который происходит только тогда, когда процесс (Erlang) находится в каком-то странном состоянии и / или пытается обработать «странное» сообщение.
Предполагается, что вы вернетесь в известное исправное состояние (путем перезапуска), которое должно правильно обрабатывать все обычные сообщения. Перезапуск не предназначен для «устранения всех проблем» и, конечно, не для таких вещей, как плохая конфигурация или отсутствие интернет-соединения. По этому определению мы можем видеть, что очень опасно копировать состояние, когда произошел сбой, и пытаться восстановиться после него, потому что это разрушает весь смысл возврата к известному состоянию.
Второй момент заключается в том, что этот процесс вызывает сбой только при обработке действия, которое на самом деле используют только 0,001% (или любой процент, который считается незначительным) от всех ваших пользователей, и это не очень важно (например, мелкие детали пользовательского интерфейса), тогда это вполне нормально просто дать ему вылететь и перезапуститься, и не нужно это исправлять . Я думаю, что это может способствовать повышению производительности в этих случаях.
Что касается ваших вопросов в комментарии OP: да, независимо от того, что возвращает ваш обратный вызов init
, вы можете либо построить все начальное состояние там, либо источник из других мест, полностью зависеть от варианта использования.