$30 off During Our Annual Pro Sale. View Details »

Migrando a Microservicios

Migrando a Microservicios

Mi charla en CodeÑuble 2019

Jano González

June 07, 2019
Tweet

More Decks by Jano González

Other Decks in Programming

Transcript

  1. Migrando a microservicios
    @janogonzalez

    View Slide

  2. Monolitos
    Microservicios
    Nuestra arquitectura
    Extrayendo servicios
    Conclusiones

    View Slide

  3. Monolitos

    View Slide

  4. $ rails new soundcloud
    Cómo SoundCloud comenzó
    Monolitos

    View Slide

  5. Monolitos
    Toda la funcionalidad en un lado
    User
    Track
    Like

    View Slide

  6. Monolitos
    Usualmente organizados en capas
    Backend
    DB
    UI

    View Slide

  7. Monolitos
    Tienden a la especialización por capa

    View Slide

  8. Monolitos
    Tuvimos problemas cuando los equipos crecieron

    View Slide

  9. Monolitos
    Nuestro delivery era muy lento

    View Slide

  10. Microservicios

    View Slide

  11. Microservicios
    Bounded contexts
    User
    Track
    Like

    View Slide

  12. Microservicios
    Modelo de dominio que cabe en tu cabeza
    Like
    Track Likes
    Count
    User Likes
    Count

    View Slide

  13. Microservicios
    Cada bounded context pertenece a un servicio
    Likes Service

    View Slide

  14. Microservicios
    Tienden a tener equipos multifuncionales

    View Slide

  15. Microservicios
    Delivery más rápido

    View Slide

  16. Microservicios
    Usar la herramienta más adecuada

    View Slide

  17. Microservicios
    Reemplazabilidad

    View Slide

  18. Los requisitos

    View Slide

  19. Los requisitos
    Facilidad para reservar recursos de cómputo

    View Slide

  20. Los requisitos
    Monitoreo

    View Slide

  21. Los requisitos
    Continuous delivery

    View Slide

  22. Los problemas

    View Slide

  23. Los problemas
    Fallos en cascada

    View Slide

  24. ● Circuit breakers

    ● Failure accrual
    Fallos en cascada
    Los problemas

    View Slide

  25. Los problemas
    Consistencia eventual
    (A: a1,a2;
    B: b1)
    (A;B)
    (A;C)
    (A: a1, a2) (B: b1, b2)

    View Slide

  26. ● Definir fuentes autoritativas

    ● Componer respuestas en los bordes

    ● Usar eventos de ciclo de vida cuando sea necesario
    Consistencia eventual
    Los problemas

    View Slide

  27. Los problemas
    Muchos stacks tecnológicos

    View Slide

  28. ● Estandarizar mecanismos de RPC y comunicación asíncrona

    ● Proveer niveles de soporte para distintos stacks tecnológicos
    Muchos stacks tecnológicos
    Los problemas

    View Slide

  29. Los problemas
    Proteger contra cambios en las APIs

    View Slide

  30. ● Tolerant readers

    ● Consumer driven contracts
    Proteger contra cambios en las APIs
    Los problemas

    View Slide

  31. Los problemas
    Incremento de “chattiness”

    View Slide

  32. ● API Gateway

    ● BFF
    Incremento de “chattiness”
    Los problemas

    View Slide

  33. Los problemas
    Componentes se comunican en la red

    View Slide

  34. ● Tolerancia a fallos

    ● Comunicación asíncrona
    Componentes se comunican en la red
    Los problemas

    View Slide

  35. Nuestra arquitectura

    View Slide

  36. Vista desde 1000 km de altura
    Nuestra arquitectura

    View Slide

  37. Capas
    Nuestra arquitectura (idealizada)

    View Slide

  38. Extrayendo servicios

    View Slide

  39. 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

    View Slide

  40. 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

    View Slide

  41. Escoger un enfoque de integración
    Monolito como gateway
    AN
    TES
    Monolith

    View Slide

  42. Escoger un enfoque de integración
    Monolito como gateway
    Monolith
    Service Service
    D
    ESPU
    ÉS

    View Slide

  43. 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

    View Slide

  44. 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

    View Slide

  45. 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

    View Slide

  46. 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

    View Slide

  47. 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

    View Slide

  48. Strangler
    Monolith
    AN
    TES
    Escoger un enfoque de integración

    View Slide

  49. Strangler
    Strangler
    STR
    AN
    G
    LIN
    G
    Monolith
    Escoger un enfoque de integración

    View Slide

  50. Strangler
    Strangler
    Service Monolith
    D
    ESPU
    ÉS
    Escoger un enfoque de integración

    View Slide

  51. Strangler
    Strangler
    Service Service
    ALG
    Ú
    N
    D
    ÍA…
    Service Service
    Escoger un enfoque de integración

    View Slide

  52. 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

    View Slide

  53. def index
    handle(request)
    end
    Introducir handlers para los paths
    Strangler

    View Slide

  54. 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

    View Slide

  55. def index
    if $feature.active?(:use_likes_service, @current_user)

    else
    handle(request)
    end
    end
    Agregar camino alternativo bajo feature flag
    Strangler

    View Slide

  56. 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

    View Slide

  57. 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

    View Slide

  58. Escoger un enfoque de migración de datos
    Nuevo schema
    Monolith
    AN
    TES

    View Slide

  59. Nuevo schema
    Monolith
    M
    IG
    R
    AC

    N
    A
    Service
    B
    Escoger un enfoque de migración de datos

    View Slide

  60. Nuevo schema
    D
    ESPU
    ÉS
    Monolith
    A
    Service
    B
    Escoger un enfoque de migración de datos

    View Slide

  61. ● 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

    View Slide

  62. El mismo schema
    Monolith
    AN
    TES
    Escoger un enfoque de migración de datos

    View Slide

  63. El mismo schema
    Monolith
    M
    IG
    R
    AC

    N
    A
    Service
    A’
    Escoger un enfoque de migración de datos

    View Slide

  64. El mismo schema
    D
    ESPU
    ÉS
    Monolith
    A
    Service
    A’
    Escoger un enfoque de migración de datos

    View Slide

  65. ● 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

    View Slide

  66. ● Sistemas que leían directo desde BDs ajenas

    ● Cut-over de las escrituras

    ● Migrando eventos de ciclo de vida

    ● Outages
    Extrayendo servicios
    Detalles omitidos

    View Slide

  67. Conclusiones

    View Slide

  68. Equipos pequeños y bien
    concentrados
    Delivery rápido
    Conclusiones
    Razones para migrar

    View Slide

  69. Provisioning rápido Monitoreo Deployment pipeline
    Conclusiones
    Requisitos para migrar (Fowler)

    View Slide

  70. Más partes en
    movimiento
    Conclusiones
    Problemas que se introducen

    View Slide

  71. Un feature a la vez Cuando lo necesitas Sin parar el delivery!
    Conclusions
    Como romper un monolito

    View Slide

  72. Todo es un trade-off!
    Conclusions
    Debes hacerlo?

    View Slide

  73. Gracias

    View Slide

  74. Preguntas

    View Slide