Erlang Hot Code Swapping против переведенных языков
Функция, широко рекламируемая в Erlang, - это возможность горячей замены модулей кода во время работы приложения, которая отображается как уникальная функция-убийца, недоступная на других языках.
Вот цитата из книги Джо Армстронга:
Большинство серверов выполняют фиксированную программу, и если вы хотите изменить поведение сервера, вам нужно остановить сервер, а затем перезапустить его с измененным кодом.
Хотя в контексте веб-разработки большинство языков поддерживают так называемую горячую замену кода, даже не называя его таковым. Это просто обновление кода и его публикация в сети с помощью git или решения для непрерывной интеграции.
Я знаю, что у Erlang много приложений в других областях, кроме веб, поэтому я уверен, что в этих случаях это имеет смысл.
Но имеет ли эта функция преимущества по сравнению с динамическими языками, используемыми в сети, такими как Python, Ruby, JavaScript? В каких случаях веб-разработка превосходит популярные веб-ориентированные языки?
2 ответа
Горячая замена кода в erlang предлагает больше, чем возможность обновить код (я не буду сравнивать с python, ruby или javascript, у меня очень ограниченные знания о них):
- Вы можете решить, для каждого узла, когда вы будете загружать новую версию кода
- Тогда 2 версии кода будут присутствовать в ВМ, все запущенные процессы будут использовать старую версию каждого модуля, пока не произойдет следующий полный вызов этого модуля (Mod:Func/arity)
- Если вы используете OTP-поведение, сначала будет вызван сервер (или fsm или gen_event) с их code_change call_back, получающий в параметрах старую версию модуля. Таким образом, можно проверить, есть ли возможность управления обновлением или нет, и выполнить любую необходимую операцию с состоянием Data, ETS, синхронизацией процесса... прежде чем действительно перейти к новому коду.
- если вы не используете поведение OTP, все еще возможно получать сообщения в форме
{system, From, Req}
а затем позвонитеsys:handle_system_msg/6
который в свою очередь вызовет code_change call_back.
Эта функция не предназначена для веб-разработки, так как сам Erlang не был создан специально для веб-разработки.
Одной из возможных областей, где эта функция превосходит модель, используемую в общих динамических языках, используемых для веб, является точный контроль над тем, как обновляется код.
- Код можно обновлять не только между вызовами, но и во время разговора
- Вы можете предоставить явный путь обновления для состояния, связанного с вызовом