12 puntos por GN⁺ 2024-11-21 | 3 comentarios | Compartir por WhatsApp
  • 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:
    1. 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
    2. 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

 
bus710 2024-11-22

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.

 
papillon 2024-11-21

Es una función genial y potente,
pero creo que es mejor usarla solo para depuración y verificación en tiempo real.

 
GN⁺ 2024-11-21
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

    • Desarrollaron una herramienta para parchear varios módulos al mismo tiempo y propagar actualizaciones al clúster
    • Distribuyeron hot patches mediante la funcionalidad de distribución integrada de Erlang
  • 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

    • Probar y actualizar firmware nuevo de forma remota dejó satisfechos a los clientes
    • Copiar archivos a /tmp y luego usar Code.compile ofrece mejores mensajes de error
    • Es sencillo escribir una función auxiliar que compile y elimine todo el código
  • No pudieron usar actualizaciones de código en caliente en un proyecto de Elixir, pero creen que habría ayudado a los clientes

    • En cambios complejos, las actualizaciones de código en caliente pueden causar más problemas
    • Para cambios simples, conviene minimizar el impacto
  • En kosmi.io están usando con éxito hot code upgrades

    • Permite desarrollo rápido, correcciones y despliegue de actualizaciones
    • Usan Distillery y scripts personalizados, pero les gustaría que estuviera estandarizado
  • Se interesaron en Erlang gracias a Nerves y a la recarga de código en caliente

    • No es práctico en entornos de producción, pero es una herramienta útil para construir sistemas confiables
  • 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

    • El hot patching puede no resultar satisfactorio porque mantiene corriendo la misma VM
  • Despliegan Elixir en Linux embebido, donde Nerves reemplaza a systemd e inicia la VM de BEAM como proceso 1

    • Esto acerca Elixir más al hardware
  • 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

    • Los beneficios de las actualizaciones de código en caliente también pueden obtenerse con reinicios rolling cuidadosamente planificados
    • Se puede aprovechar la recarga de código de Erlang para crear herramientas de diagnóstico de problemas en tiempo real
  • Las actualizaciones de código en caliente son ventajosas al hacer cambios de código mientras hay muchos clientes conectados

    • Usaron GNU Make para sincronizar el código a producción y cargaron módulos mediante un shell de depuración