- Una de las funciones más potentes del ecosistema de Erlang son las actualizaciones de código en caliente
- Esta función es casi imposible en otros runtimes y resulta muy singular
- Elixir está construido sobre Erlang y admite la misma capacidad
Aplicación de actualizaciones de código en caliente en Elixir
- La forma estándar de releases de Elixir (
mix release) no admite por defecto las actualizaciones de código en caliente de Erlang
- Para implementar actualizaciones de código en caliente, hay que consultar varias publicaciones de blog o estudiar en detalle la documentación oficial de Erlang
- Material relacionado:
Casos reales de uso de las actualizaciones de código en caliente
- En la práctica, las actualizaciones de código en caliente se dividen en dos grandes categorías:
- Recarga simple de código
- Ejemplo: ejecutar el comando
r MyModule o recompile en IEx durante el desarrollo
- Esto es simple y útil, aunque se siente más como parte de un nuevo compilador o builder
- Aplicaciones más complejas
- En el proyecto Nerves se usan con frecuencia las actualizaciones de código en caliente:
- Al ajustar valores numéricos o modificar módulos en dispositivos Elixir embebidos, se actualiza con
IEx en lugar de esperar la carga del firmware y el reinicio
- Se puede iniciar o detener partes específicas de la aplicación, o terminar un
GenServer para reiniciar su estado
- Aplicación de actualizaciones de código en caliente en dispositivos remotos a través de NervesHub:
- Ejemplo: al depurar un reloj en tiempo real, ejecutar directamente llamadas I2C para identificar el problema rápidamente
Herramientas y precauciones para las actualizaciones de código en caliente
- Se espera que sigan aumentando las herramientas que admiten actualizaciones de código en caliente sobre
mix release de Elixir o la herramienta existente distillery
- Las actualizaciones de código en caliente requieren tanto cuidado como una migración de base de datos:
- Hay que entender cómo reaccionan las dependencias ante las actualizaciones de código en caliente
- Existen muchos otros temas adicionales a considerar
3 comentarios
Este contenido también está explicado en detalle en Aprendiendo Programación en Elixir por Primera Vez, el único libro de traducción de Elixir publicado en Corea.
Es una función genial y potente,
pero creo que es mejor usarla solo para depuración y verificación en tiempo real.
Comentarios en Hacker News
En Discord usaron la carga de código en caliente de BEAM para acortar ciclos de despliegue largos y aplicarla en actualizaciones urgentes
La recarga de código es útil en dispositivos Nerves, y como permite probar cambios en tiempo real, es buena para pruebas de integración
/tmpy luego usarCode.compileofrece mejores mensajes de errorNo pudieron usar actualizaciones de código en caliente en un proyecto de Elixir, pero creen que habría ayudado a los clientes
En kosmi.io están usando con éxito hot code upgrades
Se interesaron en Erlang gracias a Nerves y a la recarga de código en caliente
Hay que tener muchísimo cuidado al preparar un relup, y en Linux también existe la opción de levantar un servidor nuevo y transferir los datos de sesión
Despliegan Elixir en Linux embebido, donde Nerves reemplaza a systemd e inicia la VM de BEAM como proceso 1
En el pasado, WhatsApp usó scripts por SSH para hacer recarga en caliente en todos los nodos
Las actualizaciones de código en caliente son útiles, pero pueden inducir errores con facilidad y tienen poco soporte
Las actualizaciones de código en caliente son ventajosas al hacer cambios de código mientras hay muchos clientes conectados