20 november 2022
Comment fonctionne le serverless
La dernière fois, nous avons compris comment fonctionne le cloud au niveau le plus bas. Et maintenant, je vous suggère de regarder à l'intérieur du nuage de l'autre côté. Je pense que tout le monde sait ce que sont les fonctions serverless (ceux qui ne le savent pas, allez quand même à l'article - vous le découvrirez là-bas :). Un exemple de telles technologies serverless est Azure Functions, l'un des outils les plus puissants qui vous permet de résoudre facilement et avec élégance de nombreux problèmes de calcul. Voyons donc comment fonctionnent les fonctions serverless et il n'y a vraiment pas de serveurs là-bas...
L'informatique sans serveur est un exemple de services PaaS (Platform as a Service). L'idée de l'approche sans serveur est que le fournisseur de services, sans l'implication de l'utilisateur, contrôle et configure le fonctionnement de l'infrastructure physique, des machines virtuelles, des systèmes de stockage et de l'environnement pour exécuter le code du client.

L'utilisateur bénéficie également d'une mise à l'échelle automatique et d'une tolérance aux pannes. Les services serverless sont conçus pour que votre code s'exécute même en cas de défaillance d'un ou même de plusieurs centres de données. Si votre code est appelé plus fréquemment avec le temps, le service prendra en charge le redimensionnement de l'infrastructure sur laquelle le code s'exécutera.

Prenons l'exemple d'une entreprise qui loue des scooters électriques. Dans son système, les données de télémétrie des stations de location doivent être collectées. En pratique, les stations peuvent tomber en panne, et leur nombre augmentera avec le temps. Cela signifie que le trafic des stations sera toujours différent. La quantité de données sera parfois grande, parfois petite, mais en moyenne, elle augmentera avec le temps. Lors de l'utilisation de fonctions sans serveur, le système réagira automatiquement à tous ces changements et appellera moins ou plus de fonctions en fonction du volume de trafic. L'entreprise n'a pas besoin de faire quoi que ce soit pour cela - tout se fera automatiquement.

L'entreprise n'aura même pas à se soucier des pannes de serveur car la structure interne des fonctions est tolérante à cela. L'entreprise peut être certaine que son système s'adaptera aux changements dans le flux de données et que toutes les données seront traitées. Lors de l'utilisation d'IaaS, de nombreuses tâches telles que l'ajustement du système aux charges changeantes, la gestion des erreurs logicielles ou les défaillances matérielles seraient confiées aux employés de l'entreprise.

Le concept d'serverless est utile lorsque vous devez rapidement créer une API REST, écrire un chatbot, traiter une file d'attente de messages, traiter des données provenant d'un appareil, etc. L'approche vous permet de ne pas vous soucier des machines virtuelles, des systèmes d'exploitation, des paramètres d'exécution, de la mise à l'échelle et de la tolérance aux pannes - toutes les tâches sont résolues par le service. En même temps, la solution est moins chère que l'utilisation de machines virtuelles, car vous ne payez que pour le temps d'exécution de votre code.

Cependant, le concept impose deux restrictions importantes sur le code de l'utilisateur:

  • La fonction doit avoir des limites de temps. Elle ne peut pas être conçue pour un travail infini dans une boucle.
  • La fonction ne peut pas stocker d'états entre les exécutions. Chaque fois que la fonction est lancée, elle n'aura aucune information sur le travail précédent.

Azure Functions est un exemple classique de service sans serveur, combinant tous les avantages de cette approche.

Lorsque vous utilisez le service Azure Functions, vous choisissez l'environnement d'exécution (essentiellement le langage de programmation), le déclencheur qui lancera la fonction, et ajoutez le code de la fonction elle-même. C'est suffisant pour exécuter votre code. Cela semble très facile, n'est-ce pas ? Vous pouvez trouver ici un guide pas à pas sur la création d'une simple fonction Python.

Mais revenons enfin à notre sujet principal. Jetons un coup d'œil à la structure interne des fonctions.

Une fonction est un conteneur logique avec un ensemble de paramètres. Quelque chose de similaire au Docker familier, mais plus simple et plus petit. Et ce conteneur doit être exécuté quelque part.

Alors, le serveur existe-t-il après tout ? Bien sûr que oui. Il est simplement invisible pour l'utilisateur, c'est pourquoi il porte le nom de "serverless".

L'architecture du service ressemble à ceci :

Le service utilise des machines virtuelles en interne, mais cela est caché à l'utilisateur. Les parties importantes du service sont des routeurs et des ordonnanceurs spéciaux. Ils déterminent le nombre de machines virtuelles nécessaires pour exécuter le code de l'utilisateur et sélectionnent une machine pour exécuter la fonction à chaque appel. Ce sont ces composants qui permettent aux utilisateurs de tirer parti du serverless et de résoudre de nombreuses tâches d'application associées à l'exécution du code, telles que:

  • Sélectionner les paramètres de la machine virtuelle et la créer en fonction de la complexité du code.
  • Installer le système d'exploitation et le configurer, comme Ubuntu.
  • Installer des logiciels supplémentaires, comme l'environnement d'exécution Python.
  • Configurer le logiciel pour exécuter le code utilisateur, comme définir des variables système ou télécharger des bibliothèques supplémentaires, comme la bibliothèque boto3 pour travailler avec le service de file d'attente.
  • Exécuter le code en se connectant à la machine virtuelle et en le démarrant manuellement ou en écrivant un script pour le faire automatiquement.


Toutes les demandes internes et externes pour appeler des fonctions arrivent à un load balancer, qui redirige la demande vers l'une des zones de disponibilité dans le routeur (qui a probablement également plusieurs zones et un load balancer local devant elles), qui interroge ensuite l'ordonnanceur (également plusieurs dans une zone) et demande sur quel travailleur exécuter la fonction. Un travailleur est une machine virtuelle avec un environnement d'exécution isolé pour chaque fonction. Après que le routeur reçoit l'adresse du travailleur de l'ordonnanceur, il envoie une commande pour exécuter la fonction avec certains paramètres sur ce travailleur.

D'où vient le travailleur ? Grâce à l'ordonnanceur. Les ordonnanceurs analysent le nombre et la durée des exécutions de fonctions, démarrer et arrêter des machines virtuelles avec différents environnements d'exécution. S'il existe déjà un travailleur pour la demande entrante, la fonction sera lancée sur celui-ci. S'il n'y a pas de travailleur, un nouveau travailleur sera lancé pour traiter cette demande.

Il y a deux points importants à noter ici:

  • Les fonctions doivent s'exécuter aussi rapidement que possible. La plupart du temps est consacré au démarrage de la machine virtuelle et à sa configuration. Mais même dans ce cas, il faut quelques centaines de millisecondes pour exécuter la fonction.
  • Les fonctions de différents utilisateurs peuvent s'exécuter sur la même machine virtuelle. Il est donc extrêmement important de les isoler les unes des autres.

La seule chose qui reste est de comprendre comment appeler une fonction. Habituellement, il existe de nombreuses intégrations avec des services cloud à cette fin.

Dans le cas des Azure Functions, la liste ressemble à ceci:


Les appels HTTP et les minuteries sont les plus simples et les plus accessibles.

Dans le cas des appels HTTP, vous devez envoyer une requête HTTP avec certains paramètres à un point de terminaison, et le système appellera automatiquement votre fonction.

Dans le cas des minuteries, vous pouvez configurer un appel de fonction périodique à des intervalles de temps spécifiés.

Bien sûr, la fonction peut également être appelée "manuellement" en cliquant sur le bouton dans l'interface utilisateur cloud.

J'espère que maintenant vous comprenez pourquoi les fonctions sans serveur ont ce nom et comment elles fonctionnent.