Comment déployer des services Kotlin sans réveiller la prod à 3 heures du matin
Imaginez : vous déployez une mise à jour de votre microservice Kotlin, et soudain — boum ! — les utilisateurs voient une erreur 502, et les logs rougissent de StackTrace. Familier ? Si votre équipe pratique le déploiement avec un arrêt de service de 30 secondes, chaque release est une loterie. Mais il y a une bonne nouvelle : le déploiement zero-downtime Kotlin résout ce problème une fois pour toutes.
Dans cet article, je vais vous montrer trois stratégies réelles utilisées en production : rolling update, blue-green deployment et graceful shutdown. Vous obtiendrez des exemples de code prêts à l'emploi en Kotlin pour Ktor et Spring Boot, que vous pouvez implémenter dès aujourd'hui. C'est parti.
Pourquoi le déploiement zero-downtime n'est pas un luxe, mais une nécessité
Lorsque votre service cesse de répondre ne serait-ce que 10 secondes, ce n'est pas simplement un incident technique. C'est une perte de clients, une baisse de conversion et un coup porté à la réputation. Les utilisateurs modernes ne pardonnent pas les retards. Et si vous travaillez avec des transactions financières ou des données en flux continu, un temps d'arrêt peut coûter des millions.
Le déploiement zero-downtime (ou déploiement transparent) permet de mettre à jour le code sans interrompre les connexions. Les utilisateurs ne remarquent même pas que le service vient de redémarrer. Pour les développeurs Kotlin, c'est particulièrement pertinent car les applications JVM ne démarrent pas instantanément — et chaque seconde d'arrêt est perceptible.
Examinons les principales stratégies, de la plus simple à la plus complexe.
Stratégie 1 : Graceful shutdown — la base indispensable
Avant de passer aux orchestrations complexes, assurez-vous que votre service Kotlin sait s'arrêter correctement. Le graceful shutdown est la capacité de l'application à terminer le traitement des requêtes en cours avant de s'éteindre. Sans cela, même un rolling update ne sauvera rien : vous tuerez simplement les connexions actives.
Implémentation du graceful shutdown dans Ktor
Ktor supporte nativement le graceful shutdown. Mais par défaut, il n'attend que 5 secondes. Pour la production, c'est insuffisant. Configurons-le :
fun Application.module() { install(Shutdown) { timeout = 30.seconds // On attend jusqu'à 30 secondes onShutdown = { log.info("Hook d'arrêt : finalisation des requêtes actives") closeResources() } }
routing { get("/") { call.respondText("Bonjour, Zero-Downtime !") } }}
fun closeResources() { // Fermeture du pool de connexions, du consumer Kafka, etc. println("Ressources libérées")}Point clé : le timeout doit être supérieur au temps de traitement maximal d'une seule requête. Si votre endpoint répond parfois en 15 secondes, définissez un timeout de 20 à 25 secondes.
Graceful shutdown dans Spring Boot avec Kotlin
Dans Spring Boot 2.3+, le graceful shutdown se configure avec une seule ligne dans application.yml :
server: shutdown: graceful
spring: lifecycle: timeout-per-shutdown-phase: 30sEt dans le code, vous pouvez ajouter un hook pour libérer les ressources :
@Componentclass GracefulShutdownListener : ApplicationListener<ContextClosedEvent>() {
override fun onApplicationEvent(event: ContextClosedEvent) { println("Spring Boot : début du graceful shutdown") // Fermeture des sessions WebSocket, RabbitMQ, etc. }}Maintenant, à la réception du signal SIGTERM (envoyé par Kubernetes ou Docker), votre service ne tuera pas les requêtes, mais les laissera se terminer. C'est la première étape vers un déploiement zero-downtime.
Stratégie 2 : Rolling update — une mise à jour en douceur sans explosions
Le rolling update consiste à mettre à jour les pods (ou conteneurs) non pas tous en même temps, mais progressivement. Un ancien pod s'éteint — un nouveau démarre. Et ainsi de suite, jusqu'à ce que tout soit mis à jour. C'est l'approche standard dans Kubernetes.
Mais il y a un détail : si votre Kot