● Definir fuentes autoritativas
● Componer respuestas en los bordes
● Usar eventos de ciclo de vida cuando sea necesario
Consistencia eventual
Los problemas
Slide 27
Slide 27 text
Los problemas
Muchos stacks tecnológicos
Slide 28
Slide 28 text
● Estandarizar mecanismos de RPC y comunicación asíncrona
● Proveer niveles de soporte para distintos stacks tecnológicos
Muchos stacks tecnológicos
Los problemas
Slide 29
Slide 29 text
Los problemas
Proteger contra cambios en las APIs
Slide 30
Slide 30 text
● Tolerant readers
● Consumer driven contracts
Proteger contra cambios en las APIs
Los problemas
Slide 31
Slide 31 text
Los problemas
Incremento de “chattiness”
Slide 32
Slide 32 text
● API Gateway
● BFF
Incremento de “chattiness”
Los problemas
Slide 33
Slide 33 text
Los problemas
Componentes se comunican en la red
Slide 34
Slide 34 text
● Tolerancia a fallos
● Comunicación asíncrona
Componentes se comunican en la red
Los problemas
Slide 35
Slide 35 text
Nuestra arquitectura
Slide 36
Slide 36 text
Vista desde 1000 km de altura
Nuestra arquitectura
Slide 37
Slide 37 text
Capas
Nuestra arquitectura (idealizada)
Slide 38
Slide 38 text
Extrayendo servicios
Slide 39
Slide 39 text
Identificar candidatos
Este feature necesita cambios? Produce riesgo técnico?
Escoger un enfoque de integración
Cómo integrar el servicio extraído?
Escoger un enfoque de migración de datos
Cómo mover los datos a su propio storage?
Extrayendo servicios
El proceso
1
2
3
Slide 40
Slide 40 text
Identificar candidatos
Este feature necesita cambios? Produce riesgo técnico?
Escoger un enfoque de integración
Cómo integrar el servicio extraído?
Escoger un enfoque de migración de datos
Cómo mover los datos a su propio storage?
Extrayendo servicios
El proceso
1
2
3
Slide 41
Slide 41 text
Escoger un enfoque de integración
Monolito como gateway
AN
TES
Monolith
Slide 42
Slide 42 text
Escoger un enfoque de integración
Monolito como gateway
Monolith
Service Service
D
ESPU
ÉS
Slide 43
Slide 43 text
Introducir capa de servicios para el feature
Si ya no la tienes
Agregar camino alternativo bajo feature flag
Cuidado, se podrían necesitar joins en memoria
Mover el tráfico
Ahora el código se puede limpiar
Monolito como gateway
El proceso
2.1
2.2
2.3
Slide 44
Slide 44 text
def index
likes = user_likes_service.public_track_likes(
@user, pagination)
respond collection_for(likes)
end
Introducir capa de servicios para el feature
Monolito como gateway
Slide 45
Slide 45 text
Introducir capa de servicios para el feature
Si ya no la tienes
Agregar camino alternativo bajo feature flag
Cuidado, se podrían necesitar joins en memoria
Mover el tráfico
Ahora el código se puede limpiar
El proceso
2.1
2.2
2.3
Monolito como gateway
Slide 46
Slide 46 text
def public_track_likes(user, pagination)
if $feature.active?(:use_likes_service, user)
…
else
…
end
end
Agregar camino alternativo bajo feature flag
Monolito como gateway
Slide 47
Slide 47 text
Introducir capa de servicios para el feature
Si ya no la tienes
Agregar camino alternativo bajo feature flag
Cuidado, se podrían necesitar joins en memoria
Mover el tráfico
Ahora el código se puede limpiar
El proceso
2.1
2.2
2.3
Monolito como gateway
Slide 48
Slide 48 text
Strangler
Monolith
AN
TES
Escoger un enfoque de integración
Slide 49
Slide 49 text
Strangler
Strangler
STR
AN
G
LIN
G
Monolith
Escoger un enfoque de integración
Slide 50
Slide 50 text
Strangler
Strangler
Service Monolith
D
ESPU
ÉS
Escoger un enfoque de integración
Slide 51
Slide 51 text
Strangler
Strangler
Service Service
ALG
Ú
N
D
ÍA…
Service Service
Escoger un enfoque de integración
Slide 52
Slide 52 text
Introducir handlers para los paths
Esto permite intervención
Agregar camino alternativo bajo feature flag
Puede implicar no sólo invocar el nuevo servicio
Mover el tráfico
Ahora el código se puede limpiar
Strangler
El proceso
2.1
2.2
2.3
Slide 53
Slide 53 text
def index
handle(request)
end
Introducir handlers para los paths
Strangler
Slide 54
Slide 54 text
Introducir handlers para los paths
Esto permite intervención
Agregar camino alternativo bajo feature flag
Puede implicar no sólo invocar el nuevo servicio
Mover el tráfico
Ahora el código se puede limpiar
Strangler
El proceso
2.1
2.2
2.3
Slide 55
Slide 55 text
def index
if $feature.active?(:use_likes_service, @current_user)
…
else
handle(request)
end
end
Agregar camino alternativo bajo feature flag
Strangler
Slide 56
Slide 56 text
Introducir handlers para los paths
Esto permite intervención
Agregar camino alternativo bajo feature flag
Puede implicar no sólo invocar el nuevo servicio
Mover el tráfico
Ahora el código se puede limpiar
Strangler
2.1
2.2
2.3
El proceso
Slide 57
Slide 57 text
Identificar candidatos
Este feature necesita cambios? Produce riesgo técnico?
Escoger un enfoque de integración
Cómo integrar el servicio extraído?
Escoger un enfoque de migración de datos
Cómo mover los datos a su propio storage?
Extrayendo servicios
El proceso
1
2
3
Slide 58
Slide 58 text
Escoger un enfoque de migración de datos
Nuevo schema
Monolith
AN
TES
Slide 59
Slide 59 text
Nuevo schema
Monolith
M
IG
R
AC
IÓ
N
A
Service
B
Escoger un enfoque de migración de datos
Slide 60
Slide 60 text
Nuevo schema
D
ESPU
ÉS
Monolith
A
Service
B
Escoger un enfoque de migración de datos
Slide 61
Slide 61 text
● Permite cambiar el motor de storage
● Agrega riesgo a la migración
● No lo he usado personalmente, más adecuado cuando se requieren cambios de features.
Nuevo
Escoger un enfoque de migración de datos
Slide 62
Slide 62 text
El mismo schema
Monolith
AN
TES
Escoger un enfoque de migración de datos
Slide 63
Slide 63 text
El mismo schema
Monolith
M
IG
R
AC
IÓ
N
A
Service
A’
Escoger un enfoque de migración de datos
Slide 64
Slide 64 text
El mismo schema
D
ESPU
ÉS
Monolith
A
Service
A’
Escoger un enfoque de migración de datos
Slide 65
Slide 65 text
● Bajo riesgo
● Usualmente movemos los lecturas en forma progresiva más un cut-over para las escrituras
● Lo hemos escogido para migraciones por riesgo técnico
El mismo schema
Escoger un enfoque de migración de datos
Slide 66
Slide 66 text
● Sistemas que leían directo desde BDs ajenas
● Cut-over de las escrituras
● Migrando eventos de ciclo de vida
● Outages
Extrayendo servicios
Detalles omitidos
Slide 67
Slide 67 text
Conclusiones
Slide 68
Slide 68 text
Equipos pequeños y bien
concentrados
Delivery rápido
Conclusiones
Razones para migrar
Slide 69
Slide 69 text
Provisioning rápido Monitoreo Deployment pipeline
Conclusiones
Requisitos para migrar (Fowler)
Slide 70
Slide 70 text
Más partes en
movimiento
Conclusiones
Problemas que se introducen
Slide 71
Slide 71 text
Un feature a la vez Cuando lo necesitas Sin parar el delivery!
Conclusions
Como romper un monolito