Utilisez le motif expand and contract. D'abord l'expansion : ajoutez la nouvelle colonne ou la nouvelle table de façon rétrocompatible pour que le code déployé actuellement continue de marcher. Puis déployez du code qui écrit à la fois dans l'ancien et le nouveau, remplissez les lignes existantes par petits lots, basculez les lectures vers la nouvelle forme, et ne supprimez l'ancienne colonne que dans une release ultérieure. Gardez chaque migration compatible avec la version de l'application qui tourne avant et après elle.
Pourquoi les recruteurs posent cette question
Le recruteur veut savoir si vous avez livré des changements de schéma face à du trafic réel ou seulement en développement. Il écoute le motif expand and contract, le remplissage par lots pour éviter les verrous longs et le retard de réplication, et le découplage de la migration et du déploiement. Mentionner des risques de verrouillage précis, comme la création d'index, montre une vraie expérience de production plutôt que de la théorie.
Comment structurer votre réponse
- Nommez le motif et l'invariant : chaque étape est rétrocompatible.
- Déroulez les phases dans l'ordre : expansion, double écriture, remplissage, bascule, contraction.
- Couvrez les risques de verrous et de réplication et comment vous les évitez.
- Dites comment vous vérifiez et comment vous revenez en arrière à chaque phase.
Exemple de réponse
La règle à laquelle je me tiens, c'est que tout schéma déployé doit fonctionner avec la version précédente et la suivante du code, parce que pendant un déploiement progressif les deux tournent en même temps. Donc je ne renomme jamais une colonne, je fais expand and contract. Disons qu'on découpe un champ nom. Première migration : ajouter les nouvelles colonnes nullable, ce qui coûte peu et ne touche aucune ligne existante. Puis une release où l'application écrit à la fois l'ancienne et la nouvelle forme mais lit encore l'ancienne, donc rien côté utilisateur ne dépend encore des nouvelles données. Ensuite un remplissage qui tourne par lots de quelques milliers avec une pause entre chaque, pour ne pas tenir une longue transaction ni faire exploser le retard de réplication sur les réplicas. Puis une release qui lit les nouvelles colonnes, les anciennes étant toujours écrites comme filet de sécurité. Une fois que c'est stable depuis une release ou deux, seulement alors j'arrête la double écriture et je supprime les anciennes colonnes. Je garde aussi les migrations hors du chemin de déploiement lui-même, et tout ce qui prend un verrou lourd, comme la construction d'un index, tourne en mode concurrent et hors des heures de pointe.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment vérifiez-vous que le remplissage est complet et correct ?
- Quel est votre plan de retour arrière si la bascule des lectures se passe mal ?
- Comment géreriez-vous ça sur une table d'un demi-milliard de lignes ?
Autres questions pour Ingénieur DevOps
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions