- 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 :
- 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
- 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
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.
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.
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
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
/tmppuis utiliserCode.compilefournit de meilleurs messages d’erreurDans 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
Les mises à niveau de code à chaud sont utilisées avec succès chez kosmi.io
Nerves et le rechargement de code à chaud ont suscité un intérêt pour Erlang
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 sessionElixir est déployé sur Linux embarqué, où Nerves remplace
systemdet démarre la VM BEAM comme processus 1Par 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 mises à jour de code à chaud sont avantageuses lorsqu’il faut modifier du code alors que de nombreux clients sont connectés