12 points par GN⁺ 2024-11-21 | 3 commentaires | Partager sur WhatsApp
  • L’une des fonctionnalités les plus puissantes de l’écosystème Erlang est la mise à jour de code à chaud
  • Cette fonctionnalité est quasiment impossible à trouver dans d’autres runtimes et reste très singulière
  • Elixir est construit au-dessus d’Erlang et prend en charge la même fonctionnalité

Appliquer les mises à jour de code à chaud dans Elixir

  • La méthode standard de release Elixir (mix release) ne prend pas en charge par défaut les mises à jour de code à chaud d’Erlang
  • Pour les mettre en œuvre, il faut consulter plusieurs articles de blog ou étudier en détail la documentation officielle d’Erlang
  • Ressources associées :

Cas d’usage réels des mises à jour de code à chaud

  • En pratique, les mises à jour de code à chaud se divisent largement en deux catégories :
    1. Rechargement de code simple
      • Exemple : exécuter les commandes r MyModule ou recompile dans IEx pendant le développement
      • C’est simple et utile, mais cela ressemble davantage à une partie d’un nouveau compilateur ou d’un nouveau builder
    2. Applications plus complexes
      • Le projet Nerves utilise souvent les mises à jour de code à chaud :
        • Lorsqu’on ajuste des valeurs numériques ou modifie des modules sur un appareil Elixir embarqué, on met à jour via IEx au lieu d’attendre l’envoi du firmware et le redémarrage
        • On peut démarrer/arrêter certaines parties de l’application, ou terminer un GenServer pour réinitialiser son état
      • Application des mises à jour de code à chaud sur des appareils distants via NervesHub :
        • Exemple : lors du débogage d’une horloge temps réel, exécuter directement des appels I2C permet d’identifier rapidement le problème

Outils et points d’attention pour les mises à jour de code à chaud

  • On espère voir davantage d’outillage prenant en charge les mises à jour de code à chaud par-dessus mix release d’Elixir ou l’outil historique distillery
  • Les mises à jour de code à chaud demandent une grande vigilance, comme les migrations de base de données :
    • Il faut comprendre comment les dépendances réagissent aux mises à jour de code à chaud
    • Il existe aussi divers autres points à prendre en compte

3 commentaires

 
bus710 2024-11-22

Ce sujet est également présenté en détail dans Premiers pas avec la programmation Elixir, le seul ouvrage de traduction sur Elixir publié en Corée.

 
papillon 2024-11-21

C’est une fonctionnalité élégante et puissante, mais il vaudrait mieux l’utiliser uniquement pour le débogage et la vérification en temps réel.

 
GN⁺ 2024-11-21
Avis Hacker News
  • Chez Discord, le chargement à chaud du code BEAM a été utilisé pour raccourcir les longs cycles de déploiement et pour appliquer des mises à jour urgentes

    • Un outil a été développé pour pouvoir corriger plusieurs modules simultanément et propager les mises à jour au cluster
    • Les hot patches ont été déployés via les fonctionnalités de distribution intégrées d’Erlang
  • Sur les appareils Nerves, le rechargement de code est utile et permet de tester les modifications en temps réel, ce qui est bien pour les tests d’intégration

    • Tester et mettre à jour à distance un nouveau firmware a permis de satisfaire les clients
    • Copier les fichiers dans /tmp puis utiliser Code.compile fournit de meilleurs messages d’erreur
    • Il est simple d’écrire une fonction utilitaire qui compile puis supprime tout le code
  • Dans un projet Elixir, il n’a pas été possible d’utiliser les mises à jour de code à chaud, mais cela aurait sans doute été utile pour les clients

    • Pour les changements complexes, les mises à jour de code à chaud peuvent créer encore plus de problèmes
    • Pour les changements simples, mieux vaut viser un impact minimal
  • Les mises à niveau de code à chaud sont utilisées avec succès chez kosmi.io

    • Elles permettent de développer, corriger et déployer rapidement des mises à jour
    • Distillery et des scripts personnalisés sont utilisés, mais une solution standardisée serait souhaitable
  • Nerves et le rechargement de code à chaud ont suscité un intérêt pour Erlang

    • Ce n’est pas forcément pratique en production, mais c’est un outil utile pour construire des systèmes fiables
  • Il faut être très prudent lors de la préparation d’un relup, et sous Linux il existe aussi une méthode consistant à lancer un nouveau serveur puis à transférer les données de session

    • Le hot patching peut être peu satisfaisant puisqu’il consiste à faire tourner en continu la même VM
  • Elixir est déployé sur Linux embarqué, où Nerves remplace systemd et démarre la VM BEAM comme processus 1

    • Cela place Elixir plus près du matériel
  • Par le passé, WhatsApp utilisait des scripts SSH pour effectuer le rechargement à chaud sur tous les nœuds

  • Les mises à jour de code à chaud sont utiles, mais elles favorisent facilement les erreurs et le support manque

    • Les avantages des mises à jour de code à chaud peuvent être obtenus via des redémarrages progressifs soigneusement menés
    • Il est possible de tirer parti du rechargement de code d’Erlang pour créer des outils de diagnostic des problèmes en temps réel
  • Les mises à jour de code à chaud sont avantageuses lorsqu’il faut modifier du code alors que de nombreux clients sont connectés

    • GNU Make a été utilisé pour synchroniser le code en production et charger les modules via un shell de débogage