r n m a s t e r | - w o r k e r [ 0 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - . . . | - w o r k e r [ n ] . 16 / 38
licorne ! ( o l d ) u n i c o r n m a s t e r < - - - s i g n a l U S R 2 | - w o r k e r [ 0 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - . . . | - w o r k e r [ n ] u n i c o r n m a s t e r | - w o r k e r [ 0 ] | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 17 / 38
requêtes en cours ( o l d ) u n i c o r n m a s t e r | - w o r k e r [ 0 ] * < - - - f i n d e r e q u ê t e s u r l ' a n c i e n c o d e | - ( t e r m i n é ) | - ( t e r m i n é ) | - ( t e r m i n é ) < - - - l e w o r k e r s ' e s t t e r m i n é à l a f i n d e l a r e q u ê t e | - . . . | - ( t e r m i n é ) u n i c o r n m a s t e r | - w o r k e r [ 0 ] * < - - - n o u v e l l e r e q u ê t e e n t r a n t e s u r l e n o u v e a u c o d e | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 18 / 38
la place au nouveau ( o l d ) u n i c o r n m a s t e r < - - - s i g n a l Q U I T u n i c o r n m a s t e r | - w o r k e r [ 0 ] * < - - - t r a i t e m e n t d e l a r e q u ê t e s u r l e n o u v e a u c o d e | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 19 / 38
version du code u n i c o r n m a s t e r | - w o r k e r [ 0 ] | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] * < - - - n o u v e l l e r e q u ê t e | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 20 / 38
protection du code non-threadsafe isolation des crashs de workers Inconvénients frontal web supplémentaire obligatoire (apache/nginx) consommation mémoire 22 / 38
en 2 étapes préciser à l'ORM d'ignorer la colonne ex. ActiveRecord c l a s s U s e r d e f s e l f . c o l u m n s s u p e r . r e j e c t { | c o l u m n | c o l u m n . n a m e = = " n o t e s " } e n d e n d déployer cette version du code 29 / 38
en 2 étapes préciser à l'ORM d'ignorer la colonne ex. ActiveRecord c l a s s U s e r d e f s e l f . c o l u m n s s u p e r . r e j e c t { | c o l u m n | c o l u m n . n a m e = = " n o t e s " } e n d e n d déployer cette version du code supprimer la colonne de la DB 30 / 38
déployer une version qui lit et écrit les données sur les 2 colonnes à la fois ex. ActiveRecord c l a s s O r d e r d e f a m o u n t = ( v a l u e ) s u p e r s e l f . n e w _ a m o u n t = v a l u e e n d d e f a m o u n t n e w _ a m o u n t e n d e n d 32 / 38
déployer une version qui lit et écrit les données sur les 2 colonnes à la fois ex. ActiveRecord c l a s s O r d e r d e f a m o u n t = ( v a l u e ) s u p e r s e l f . n e w _ a m o u n t = v a l u e e n d d e f a m o u n t n e w _ a m o u n t e n d e n d migrer les données de l'ancienne colonne vers la nouvelle 33 / 38
déployer une version qui lit et écrit les données sur les 2 colonnes à la fois ex. ActiveRecord c l a s s O r d e r d e f a m o u n t = ( v a l u e ) s u p e r s e l f . n e w _ a m o u n t = v a l u e e n d d e f a m o u n t n e w _ a m o u n t e n d e n d migrer les données de l'ancienne colonne vers la nouvelle supprimer l'ancienne colonne comme au point précédent 34 / 38