Состояние копирования стратегии перезапуска gen_server? - PullRequest
0 голосов
/ 06 ноября 2018

Мир Erlang не использует try-catch как обычно. Я хочу знать, как насчет производительности при перезапуске процесса против try-catch на основном языке.

У процесса Erlang есть небольшая концепция стека и кучи, которая фактически выделяется в куче ОС. Почему эффективно перезапустить его?

Надеюсь, кто-нибудь подробно расскажет мне о Beam, что делать при запуске операции перезапуска процесса.

Кроме того, как насчет использования gen_server, которые поддерживают состояние в своем процессе. Будет ли работать состояние копирования при перезапуске gen_server?

Спасибо

1 Ответ

0 голосов
/ 07 ноября 2018

Я рекомендую прочитать https://ferd.ca/the-zen-of-erlang.html

Вот мое понимание: рестарт эффективен для исправления «Heisenbug», который происходит только тогда, когда процесс (Erlang) находится в каком-то странном состоянии и / или пытается обработать «странное» сообщение.

Предполагается, что вы вернетесь в известное исправное состояние (путем перезапуска), которое должно правильно обрабатывать все обычные сообщения. Перезапуск не предназначен для «устранения всех проблем» и, конечно, не для таких вещей, как плохая конфигурация или отсутствие интернет-соединения. По этому определению мы можем видеть, что очень опасно копировать состояние, когда произошел сбой, и пытаться восстановиться после него, потому что это разрушает весь смысл возврата к известному состоянию.

Второй момент заключается в том, что этот процесс вызывает сбой только при обработке действия, которое на самом деле используют только 0,001% (или любой процент, который считается незначительным) от всех ваших пользователей, и это не очень важно (например, мелкие детали пользовательского интерфейса), тогда это вполне нормально просто дать ему вылететь и перезапуститься, и не нужно это исправлять . Я думаю, что это может способствовать повышению производительности в этих случаях.


Что касается ваших вопросов в комментарии OP: да, независимо от того, что возвращает ваш обратный вызов init, вы можете либо построить все начальное состояние там, либо источник из других мест, полностью зависеть от варианта использования.

...