Sans serveur avec Java


L’idée du « sans serveur » n’est pas nouvelle, mais elle est de plus en plus populaire. La possibilité de déléguer la mise en place et la maintenance de l’infrastructure à un fournisseur de cloud computing et de se concentrer uniquement sur le code qui gère la logique commerciale semble très attrayante. Mais que faire si vous voulez passer à un système sans serveur mais que vos systèmes actuels sont écrits en Java et que vous ne voulez pas introduire d’autres langages comme Node.JS ou Python ? La bonne nouvelle est que vous pouvez construire des solutions sans serveur avec le langage Java qui est entièrement pris en charge par les principaux fournisseurs de cloud computing comme Azure ou AWS. Veuillez noter, cependant, que ce n’est pas toujours la meilleure idée d’utiliser Java ou même de construire une solution sans serveur du tout. En tant que développeurs et architectes logiciels expérimentés chez Future Processing, nous sommes toujours concentrés sur les besoins de nos clients. Il est crucial de construire des solutions optimales, plutôt que celles qui incluent autant de mots à la mode que possible (bien que beaucoup de ces mots à la mode, comme « sans serveur », soient liés à de grands avantages qui pourraient être obtenus dans certains cas).

Pourquoi est-il logique de se passer de serveur ?

Un modèle sans serveur est très simple : vous téléchargez un code qui fait quelque chose et déclenche son exécution en réponse à un événement choisi – généré par le système ou par l’utilisateur final (par exemple via une requête http). En d’autres termes : il existe une ou plusieurs fonction(s) en tant que service (FaaS) intégrée(s) à d’autres services en nuage utilisant des événements. Par exemple, dans AWS, nous pouvons utiliser API Gateway (qui sert la requête http), Lambda (FaaS qui gère la logique d’entreprise) et DynamoDB (qui stocke nos données) pour créer des points de repos (nous pouvons considérer cette solution comme un simple micro ou nanoservice).

Simplification de la fourniture de logiciels

La mise en place d’un système utilisant des services en nuage et l’écriture d’une quantité de code aussi réduite que possible est très efficace. Vous ne voulez pas que vos développeurs « réinventent la roue » en créant du code passe-partout, de l’administration, de la sécurité, de la surveillance (…). Les solutions disponibles dans le nuage dans ces domaines sont à la fois fiables et rentables. Grâce à l’approche sans serveur, votre équipe de développement peut se concentrer sur le code qui répond aux besoins de votre entreprise.

Une maintenance plus facile

Non seulement la mise en place d’une solution sans serveur pourrait être plus facile que dans l’approche traditionnelle, mais sa maintenance nécessite moins d’efforts. Vous ne gérez pas l’infrastructure manuellement. Vous pouvez compter sur des services dont l’évolutivité et la surveillance sont intégrées.

Réduction des coûts

Un développement plus rapide et une maintenance plus aisée signifient que les coûts globaux du système sont moins élevés. En outre, le modèle de tarification de services comme Azure Function ou AWS Lambda semble très attrayant : vous n’êtes facturé que lorsque votre code est en cours d’exécution (le prix dépend du temps d’exécution et de l’utilisation des ressources). Il est parfait lorsque votre système ou ses parties sont utilisés de manière irrégulière. En revanche, pour un système dont la charge de travail est élevée et stable, une solution sans serveur pourrait être plus coûteuse. L’absence de serveur n’est pas toujours une solution parfaite.

Un prototypage plus facile

Grâce à l’approche sans serveur, les développeurs peuvent préparer des prototypes en douceur et vérifier quelle est la solution optimale.

Temps de mise sur le marché

Enfin, grâce à cette approche légère, votre solution pourrait être prête à être produite rapidement. Dans de nombreux cas, cela fait une grande différence à la fois lorsque vous essayez de battre la concurrence dans l’espace de marché existant et lorsque vous créez un avant vos concurrents. Le temps, c’est de l’argent et l’absence de serveur pourrait être très efficace.

Des améliorations constantes

Les solutions de cloud computing sont sans cesse améliorées par leurs fournisseurs. Grâce aux services gérés dans les nuages, vous bénéficiez de toutes ces améliorations sans avoir à investir votre temps et votre argent.

L’absence de serveur n’est pas toujours un choix parfait

A ce moment, vous vous demandez peut-être : « Si l’absence de serveur est si parfaite, alors pourquoi tout n’est pas sans serveur ? Eh bien, sans serveur, ce n’est pas parfait. C’est un excellent outil, mais il doit être utilisé dans les cas appropriés par des professionnels expérimentés.

Pas rentable

J’ai déjà mentionné que les solutions sans serveur pouvaient ne pas être rentables. Avant de proposer une approche sans serveur à notre partenaire, nous faisons toujours un calcul basé sur les statistiques ou les prévisions du client. Les différences de coût entre une solution traditionnelle et une solution sans serveur pourraient être importantes.

Les grands systèmes comme défi

Il est facile de configurer et de développer de petites applications sans serveur. Il est beaucoup plus difficile de fournir un grand système en utilisant cette approche. Vous avez probablement entendu parler de la dépendance ou de l’enfer des événements. Dans une approche sans serveur, vous pouvez en avoir une autre : l’enfer des fonctions. Mais avec l’approche Infrastructure as a Code (IaaS), il est possible de mettre en place une stratégie de versionnement et de test appropriée dans des équipes expérimentées de grands systèmes.

Durée limitée

Dans certains nuages, le temps d’exécution des fonctions est limité (par exemple à 15 minutes), alors que dans d’autres, il n’y a pas de limites. Mais en général, les fonctions doivent être exécutées rapidement sans trop d’entrées/sorties. Si vous avez des calculs de longue durée dans votre système ou beaucoup d’opérations d’entrée/sortie lourdes, alors probablement que l’absence de serveur n’est pas pour vous. L’application conteneurisée traditionnelle devrait être plus rapide et moins coûteuse.

Un vendeur enfermé

Même dans un exemple de solution sans serveur la plus simple, nous avons utilisé 3 services spécifiques à AWS : Passerelle API, Lambda, DynamoDB. Bien sûr, nous trouverons des nuages similaires dans d’autres nuages (en azur : API Management, Functions, CosmosDB). Similaire, mais pas identique. La migration potentielle ne sera pas gratuite. Heureusement, il existe des outils comme le cadre sans serveur qui vous permettent de déployer votre solution sans serveur dans différents nuages.

Démarrage à froid

Sans serveur ne signifie pas que les serveurs ont disparu. Les machines et conteneurs virtuels sont toujours là, mais soigneusement cachés et gérés par les fournisseurs de services en nuage. Avant d’exécuter votre code pour la première fois, de nombreuses opérations doivent être effectuées, notamment

  • Allocation au serveur avec des ressources gratuites
  • Téléchargement de votre fonction
  • Récipient de départ
  • Démarrage de l’environnement d’exécution (par exemple JVM)

Juste après avoir effectué ces lourdes opérations, votre code est exécuté. C’est un début difficile. Les appels suivants pourraient réutiliser cette instance déjà réchauffée (le code est exécuté en une fois) jusqu’à ce qu’il soit nécessaire d’en préparer une autre (en raison d’une charge de travail importante ou parce que la première instance est devenue inactive après être restée inactive pendant une longue période).

Il existe de nombreuses façons de traiter ce problème : le masquer par une conception appropriée d’une application, préchauffer les instances de fonctions, ne pas exposer les fonctions à l’interface utilisateur, utiliser des instances dédiées (MS Azure). En outre, les fournisseurs de services en nuage continuent d’améliorer leurs services afin de minimiser l’impact des démarrages à froid.

Pourquoi Java n’est-il pas un langage parfait pour le sans serveur ?

Bien que Java soit pris en charge par les fournisseurs de services en nuage, ce n’est pas la solution de premier choix lorsqu’on pense à un système sans serveur. Néanmoins, il est peu probable que Java soit un jour aussi performant que des langages interprétés comme JS (Node.JS) ou Python dans des solutions sans serveur.

Démarrage à froid

Le démarrage à froid des fonctions Java prend plus de temps que le démarrage à froid des fonctions écrites dans des langues interprétées. Les paquets Java sont généralement plus gros. L’environnement d’exécution est plus lourd. En cas d’application backend, une demi-seconde ou même une seconde de latence ne pose pas de problème. En cas d’interaction avec un utilisateur, cela peut poser problème.

Performance globale

Après un démarrage à froid, une différence de performance entre les langages compilés et interprétés n’est généralement pas très visible, mais, néanmoins, Java n’est certainement pas le leader. Ainsi, si vous voulez créer votre système à partir de zéro, vous devriez envisager des langues plus performantes.

Facturation

Les applications Java utilisent généralement au moins un peu plus de mémoire que leurs concurrents. Par conséquent, vous pourriez être obligé d’allouer plus de mémoire à votre fonction. Si vous êtes facturé à la fois pour la consommation de temps et de mémoire, alors vos factures pourraient être plus élevées.

Quand devons-nous envisager de ne pas utiliser de serveur avec Java ?

Ne vous inquiétez pas si vous avez des logiciels existants écrits en Java et que vous voulez passer en mode sans serveur. Il n’est pas nécessaire de tout réécrire en JavaScript. Vous pouvez créer un système robuste sans serveur en Java. Dans certaines situations, ce sera la meilleure solution.

Bibliothèques

Java est un langage logiciel largement utilisé. Dans certains domaines, comme dans le secteur financier, la plupart des applications sont créées en Java. Il est possible que votre logiciel utilise des bibliothèques qui ne sont disponibles qu’en Java. Dans ce cas, la meilleure solution est probablement de rester avec Java tout en restant sans serveur.

Code existant (équipe)

Si vous avez un logiciel écrit en Java et une équipe qui le développe et le soutient, alors l’introduction d’un autre langage ne pourrait pas être optimale. Il est plus facile de tout avoir à Java. Vous pouvez réutiliser le code existant. Les mêmes développeurs pourraient facilement travailler avec les solutions sans serveur existantes et nouvelles. Le passage à un système sans serveur n’est généralement pas facile pour l’équipe. Ses membres doivent apprendre de nouvelles approches et de nouveaux outils. Ce n’est pas un problème dans une grande entreprise comme Future Processing, où chaque équipe ou membre de l’équipe pourrait compter sur le soutien de conseillers techniques expérimentés. Mais il s’agit tout de même d’un défi et il n’est pas nécessaire de le rendre encore plus difficile en introduisant un nouveau langage de programmation.

Solutions partielles

Les migrations vers l’approche sans serveur pourraient se faire par petites étapes. Il ne s’agit pas d’une décision « tout ou rien ». Les applications conteneurisées pourraient bien fonctionner avec une fonction dédiée à la gestion de certains événements (envoi de courriers électroniques, vérification des modifications, purge des données, exécution de certaines tâches en arrière-plan, etc.)

GraalVM et l’avenir

Aujourd’hui, il est possible d’utiliser GraalVM pour transformer le bytecode Java en un exécutable natif qui pourrait ensuite être exécuté comme une fonction dans le nuage. Le principal avantage de cette approche est une réduction notable du temps de démarrage à froid et de l’empreinte mémoire. Bien que ce concept semble simple en théorie, il est assez lourd en pratique. Néanmoins, GraalVM est un outil qui pourrait rendre les solutions Java sans serveur beaucoup plus performantes à l’avenir.

De bonnes décisions et de bons logiciels

Lorsque vous envisagez une solution sans serveur, vous avez besoin d’un partenaire qui a suffisamment d’expérience pour vous conseiller sur le choix d’une solution sans serveur, la langue et les outils à utiliser. Et puis, il faut des développeurs ayant les compétences adéquates pour bien l’appliquer. Si vous souhaitez en savoir plus sur les solutions sans serveur ou Java, veuillez nous contacter. Nous pouvons vous aider.