Bonjour,
Je suis à la recherche d'avis ou retours d'expérience sur les approches "modernes" dans le développement d'applications web. On voit émerger pas mal de solutions qui s'éloignent de l'approche "Servlets" soit généralement 1 socket servi par 1 thread en mode bloquant pour se diriger vers des architectures asynchrones construites autour d'un modèle évenementiel...
Je cite entre autres parmi les noms qu'on entend : vert.x, ratpack, ou plus généralement netty sur laquelle les 2 précédents s'appuient. Je me suis intéressé à vert.x principalement, les arguments avancés par cette solutions sont assez séduisants, moins de threads nécessaires, d'où moins de ressources consommées, moins de changement de contexte et par conséquent un plus grand nombre de connexions clientes servies et une meilleure scalabilité. La gestion de la concurrence se trouve simplifiée car au lieu d'avoir un grand nombre de threads qui exécutent simultanément le même code (typiquement la même servlet), on a ici un petit nombre de threads qui exécutent le code en isolation les uns les autres, garantissant même que cette portion de code (ici appelée verticle) n'est exécutée que par un seul thread à la fois et mieux encore, toujours le même! En sommes, un petit nombre de threads dont le nombre correspondrait au nombre de coeurs) isolés les uns des autres pour gérer les requêtes sur le serveurs.
Cependant, lorsqu'on lit la documentation, on se rend compte que le rêve d'un monde merveilleux et sans compromis s'effrite quelque peu dès qu'il est question de réaliser des opérations bloquantes sur lesquels les threads doivent attendre, en gros : interdiction formelle de bloquer un verticle! Parmi les opérations bloquantes qu'on peut avoir côté serveur, la palette est plutôt large: la majorité de ce qui est opération sur les Streams, fichiers, sockets, mais aussi inévitablement tout ce qui est JDBC . On peut facilement le comprendre, si vous n'avez que 4 threads et que les 4 attendent sur le retour d'une requête vers une base de donnée, votre serveur est bloqué!
J'ai passé la matinée à chercher comment on devait s'y prendre pour créer une application orientée données type à l'aide de vert.x. Il est bien question d'un type de verticles spécial destiné aux longues opérations et à l'utilisation d'API bloquante :
http://vertx.io/manual.html#worker-verticles
Mais de façon surprenante, l'approche n'est pas très détaillée et assez peu reprise sur le net. Je suis tombé sur des dizaines d'articles de blog vantant les mérites de cette plateforme, son aspect polyglotte, son modèle d'évènement si élégant etc... mais extrêmement peu d'informations concrètes au final sur la façon de créer une application reposant fortement sur des IO? Pourtant, je pense pas que la majorité des applications web en java soient des web chats ou des services stateless qui se contentent de servir des ressources uniquement en mémoire? Donc qu'est-ce qu'on fait lorsque ce n'est pas possible de se passer d'une source de données (et donc "généralement" d'opérations bloquantes)?
Est-ce que la réponse à cette question est simplement d'admettre que c'est pas fait pour ça, d'oublier tout ce bazar et d'utiliser un bon vieux conteneur de servlets? Je ne sais pas si certains ici se sont penchés sur la question?
Partager