- Wave es una empresa valuada en $1.7B (2.3 billones de wones) con 70 ingenieros (ofrece servicios de banca móvil para África)
- Tiene una arquitectura estándar de app CRUD monolítica en Python basada en Postgres
- Al comenzar con una arquitectura simple y resolver problemas minimizando la complejidad, los ingenieros pudieron enfocarse en el trabajo que aporta valor a los usuarios
- Stackoverflow creció con éxito escalando un monolito hasta ser adquirida por 1.8 mil millones de dólares
A pesar de la eficiencia de una arquitectura simple, a la mayoría de los medios les gustan las arquitecturas complejas
- En las conferencias técnicas hay muchas charlas sobre arquitecturas complejas basadas en microservicios, pero ninguna sobre monolitos simples
- Muchas empresas imitan tecnologías complejas aunque sus aplicaciones sean pequeñas, y con eso ganan popularidad en conferencias y en HN
- La arquitectura que usamos es tan simple que ni siquiera hace falta dibujar un diagrama de arquitectura
Cómo mantener la simplicidad
- Wave usa Python síncrono, lo que significa que el proceso del servidor se bloquea mientras espera I/O
- Probaron frameworks asíncronos como Eventlet, pero tenía demasiados bugs y concluyeron que el costo no valía el dolor operativo
- En lugar de aumentar la complejidad, separan en colas los trabajos de larga duración
- Para cumplir con regulaciones de residencia de datos, en algunos países deben operar centros de datos on-premise
- Senegal/Costa de Marfil estaban en la nube, pero Uganda y otros países requieren on-premise por regulación
- En esos casos, una arquitectura simple es mucho más sencilla que una compleja
Construir en vez de comprar
- Como el equipo era pequeño, al principio preferían comprar software, pero cuando no podían resolver bugs críticos desarrollaban sus propias herramientas
- Construir herramientas internas es una complejidad que no quieren asumir, pero en algunas categorías de producto no encontraron proveedores adecuados incluso tras una investigación bastante amplia
- A veces es necesario desarrollar herramientas propias y mantener expertise interna incluso fuera de la competencia principal
Decisiones que están reconsiderando
- Están reconsiderando elecciones tecnológicas como RabbitMQ, Celery, SQLAlchemy y Python, porque aumentan la complejidad o la carga de mantenimiento
- Si iniciaran un nuevo codebase, evaluarían estas decisiones con mucho cuidado
Decisiones con las que están satisfechos
- Están satisfechos con decisiones como GraphQL, protocolos de transporte personalizados y Kubernetes
- GraphQL tiene ventajas como autodocumentación, generación de código y el explorador interactivo GraphiQL
- Consideran que, al usar GraphQL, las ventajas superan las desventajas
- Ventajas
- Autodocumentación sobre los tipos exactos de retorno
- Los clientes son más seguros gracias a la generación de código con tipos de retorno exactos
- Mayor productividad con el explorador interactivo GraphiQL
- Varias apps (app de usuario, app de soporte, app de agentes de Wave, etc.) pueden compartir en gran medida una sola API, reduciendo la complejidad
- Con un lenguaje de consultas componible, los clientes pueden obtener exactamente los datos necesarios en un solo viaje de ida y vuelta del paquete sin tener que construir muchos endpoints de propósito específico
- Elimina el bikeshedding sobre lo que debería considerarse una API RESTful
- Desventajas
- Las librerías de GraphQL no eran muy buenas cuando adoptaron GraphQL
- La codificación GQL por defecto es redundante, y como muchos clientes usan poco ancho de banda, prestan mucha atención a las limitaciones de tamaño
- Kubernetes se usa para cumplir con los requisitos de operar centros de datos por país
Conclusión
- Al mantener la arquitectura de la aplicación lo más simple posible, pueden gastar el presupuesto de complejidad (y de personal) en los lugares donde esa complejidad sí ayuda al negocio
- La idea de hacer las cosas tan simples como sea posible salvo que exista una razón poderosa para agregar complejidad les permitió construir un negocio bastante grande con pocos ingenieros, a pesar de operar en el negocio financiero africano, que por lo general se considera difícil
9 comentarios
"comprar en vez de construir" me parece que en realidad debería ser "construir en vez de comprar".
Ah, al intentar enfatizarlo, el título terminó quedando raro. Ya lo corregí. Gracias.
¿Será que las modas cambian según el ciclo económico? Independientemente de las tendencias, empezar con un monolito es más conveniente para reducir costos fijos y facilitar el mantenimiento.
Una arquitectura fácil de entender también es fácil de mantener.
En mi opinión, para cualquier servicio conviene empezar con un monolito. Si desde el principio te metes con MSA, es desperdiciar dinero.
"A medida que aumenta la complejidad, también aumentan los costos (dinero, personas, tiempo...)."
"No intentes resolver con una arquitectura compleja un problema que puede resolverse con una arquitectura simple."
Opiniones en Hacker News
Consejos de ingeniería sobre microservicios
Charlas sobre microservicios
Sesgo cognitivo y simplicidad
Sobreingeniería y falta de experiencia
Empresas que valoran el equilibrio entre trabajo y vida personal
Experiencia personal con Dan Luu
Importancia de una arquitectura simple
Arquitectura y estructura social del equipo de ingeniería
Preferencia por una arquitectura simple
IOsincrónico.¿Podrían compartir el enlace de la charla sobre los consejos de David Schmitz acerca de los fracasos de los microservicios?
Es https://www.youtube.com/watch?v=r8mtXJh3hzM