Qu’est-ce que le Cold Start ?

Dans l’architecture Serverless, il n’y a plus de notion d’infrastructure en tant que telle. Tout est pris en charge par le fournisseur Cloud.

Le développeur n’a donc pas besoin de se soucier de la puissance des serveurs ni même du système sous-jacent.

Le serverless apporte de nombreux bénéfices pour le déploiement d’applications web comme la scalabilité, la disponibilité, le fait d’avoir une granularité très fine sur les coûts et bien entendu l’absence de gestion des serveurs.

Cela implique de structurer votre application sous forme de fonctions FaaS.

Le FaaS permet de faire des économies puisqu’il n’est pas nécessaire de payer un serveur de façon permanente mais en fonction de l’exécution, une fois par jour, une fois par semaine, une fois par mois…. De même, le FaaS est idéal pour exécuter un morceau de code spécifique à une date planifiée.

Les principaux fournisseurs de services Cloud proposent tous une solution FaaS. Ainsi, Amazon Web Services propose AWS Lambda, et Microsoft Azure propose Azure Functions.

Cependant, les fonctions étant exécutées à la demande et pas forcément régulièrement ni souvent, il y a un temps d’attente pour l’exécution, le temps que le container se mette en place, c’est ce que l’on appelle le ‘Cold Start’.

Pourquoi impacte-t-il le code FaaS ?

Les fonctions en tant que services peuvent avoir une grande variété de cas d’usage. Ce type de service Cloud convient particulièrement pour le développement de microservices.

Les Faas sont « déclenchées » par un type d’événement spécifique : requête http, événement de base de données, événement de bus de service, alerte ou encore tâche planifiée.

On peut aussi s’en servir pour traiter des files de messages, ou pour des exécutions manuelles. Ces fonctions peuvent même être combinées : une requête web peut construire un message envoyé dans une file qui sera traité par une autre fonction…

Cependant, la mise en place d’applications Serverless avec une structure sous forme de fonctions ‘Stateless’ induit presque systématiquement un temps d’attente au premier appel de l’utilisateur. Ce fameux ‘Cold Start’ a un impact non négligeable qui est vécu comme un inconvénient.

Comme l’explique Ange Guyader, Team Leader et expert Microservices

Le plus gros changement architecturel auquel doit se confronter l’équipe technique est que dans l’architecture Serverless toute l’application doit être structurée sous forme de fonctions, de plus ces fonctions sont Stateless (Sans état). Il faut prendre en compte que les fonctions étant exécutées à la demande il y aura toujours une latence dans l’exécution, ce qui est encore plus vrai quand une fonction n’est pas appelée régulièrement

Comment optimiser mon code pour améliorer le Cold Start ?

Avec Azure Functions, plusieurs possibilités s’offrent à vous pour minimiser les effets du Cold Start.

Bien choisir le langage

Tout d’abord, privilégiez les langages pris en charge tels que C#, F# et JavaScript. Les langages qui ne sont pas entièrement optimisés lancent, pour la plupart d’entre eux, un nouveau processus à chaque exécution, ce qui a un impact considérable sur le temps de latence.

Alléger le code et les dépendances

Lorsque vous déployez votre code, les dépendances sont ajoutées sous forme de fichiers à votre application. Le code nécessaire à votre application est stocké en mémoire, et plus l’application est volumineuse, plus il y a de dépendances, et plus cela prend du temps de chargement. Non seulement cela augmente la taille de votre application, mais augmente également le nombre de fichiers qu’Azure Files doit gérer, ce qui entraîne un ralentissement supplémentaire. Pour ce scénario en particulier, il existe l’outil Funcpack.

L’import de dépendances peut également entraîner une augmentation des temps de chargement et donc les délais d’attente, qu’elles soient chargées de manière explicite ou implicite. Un seul module chargé par votre code peut potentiellement charger plusieurs autres modules supplémentaires.

Ecrire un code efficace

C’est-à-dire un code qui ne consomme pas trop de CPU mais aussi avec des traitements asynchrones. Un simple appel synchrone lourd nuit au bon déroulé des fonctions. Application Insight peut vous aider à identifier les applications qui ralentissent le fonctionnement de la plateforme.

Privilégiez le plan premium dans Azure Functions

Cela vous permet de spécifier un nombre d’instances préparées à l’utilisation qui sont toujours en ligne et prêtes à répondre immédiatement ainsi le runtime functions est toujours en cours d’exécution et opérationnel à tout moment. C’est ce que l’on appelle aussi le Warm Call.

Optez pour Durable Functions

Microsoft a implémenté, sur sa plateforme Azure, une fonctionnalité qui permet de résoudre la problématique liée au Serverless, le Stateless. Il s’agit de Durable Functions, une extension permettant d’écrire des fonctions avec état.

L’extension gère l’état, les points de contrôle et les redémarrages à votre place. Vous n’avez pas besoin d’implémenter votre propre mécanisme de suivi de l’état, ce qui vous permet de vous concentrer sur votre logique métier.

Selon Ange Guyader

Durable Functions propose des API HTTP intégrées qui gèrent les orchestrations à exécution longue. Vous pouvez également implémenter ce modèle vous-même à l’aide de vos propres déclencheurs de fonction (HTTP, file d’attente ou Azure Event Hubs). Ainsi, vous pouvez utiliser un message de file d’attente pour déclencher l’arrêt ou encore un déclencheur HTTP protégé par une stratégie d’authentification Azure Active Directory …