A muchas personas técnicas nos encanta dedicar un montón de tiempo en discusiones como esta, pero, si hoy volviera a iniciar Muni desde 0, construiría un Monolito, sin ninguna duda.
Parece que hoy en día, todas las startups inician con las tecnologías o tendencias del momento, a fin de cuentas si Google, eBay o Amazon lo están haciendo, tienen que ser una buena idea, ¿no?.
Lamento decirlo, pero la inmensa mayoría de nosotros NO somos Google, ni operamos y quizás nunca operaremos a su escala, así tengamos negocios altamente rentables y “grandes”.
Los microservicios, son una forma popularizada de solucionar problemas relacionados a escalabilidad y estabilidad, pero traen consigo otra gran cantidad de complejidades, y donde realmente brillan, es en escalas masivas. Estamos hablando millones de peticiones por segundo desde todas partes del mundo, equipos de miles de desarrolladores, y productos que funcionan de manera independiente.
Otro problema grande de los microservicios, es que son difíciles de implementar de manera correcta, y el error más frecuente, que aparte de Muni, he visto en otras startups, es terminar construyendo un monolito distribuido difícil de mantener y evolucionar a la velocidad de un negocio que, muy probablemente, aún esta buscando su product market fit.
En el 95% de los casos, inciar con un monolito te va a permitir tener un equipo de desarrollo más pequeño y ágil enfocado en solucionar las necesidad de negocio, en lugar de equipos mucho más grandes que además de entregar valor a dicho negocio, deben lidiar con una mayor latencia, dificultades para observar y monitorear todo el sistema, probablemente diferentes lenguajes de programación, personal especializado, protocolos o contratos de comunicación no estandarizados, mayor cantidad de unidades funcionales a ser desplegadas, entre otros… en general, una mucho mayor complejidad cognitiva.
Si eventualmente llegas a los límites de trabajar en un monolito, hay bastante posibilidades que el negocio haya funcionado, y ahora si, valdrá la pena invertir tiempo y dinero en revisar e implementar algo como microservicios. Sea como sea, lo que sea que definas al principio, vas a tener que cambiarlo a medida que el negocio evolucione, ¡Keep it simple!.
Concluyó diciendo que, monolito no es igual a lento o “no escalable”, e invitándolos a leer un artículo interesante de Shopify, donde explican como llegaron a los límites típicos de un monolito, pero decidieron no mudarse a una arquitectura basada en microservicios: https://shopify.engineering/deconstructing-monolith-designing-software-maximizes-developer-productivity
Me dijo un amigo recientemente, “¿Si no eres capaz de construir un buen monolito, que te hace pensar que puedes hacerlo bien con microservicios?”. No puedo estar más de acuerdo.
PD: Si bien escribí esta sección en términos de una cosa VS la otra y, a pesar de que si tengo cierta preferencia hacia los monolitos, la verdad es que la respuesta a esta pregunta siempre sera, depende.
Lo más importante es ser consciente de los tradeoffs asociados a la decisión que se esta tomando, y siempre bajo el contexto del problema a solucionar (nada es gratis en la vida).