DESCOUPLE! DECOUPLE, ¡Maldita sea!
En Spotify, hemos aprendido, a través de dolores de mantenimiento equivalentes al calor o mil soles ardientes, que el desacoplamiento es el camino a seguir. Básicamente, desacoplar hasta que duela .
Descubrimos que mientras más cosas construyes en una cosa, más frágil es. En parte solo porque más código inevitablemente significa más errores y un mantenimiento más complicado, y en parte porque cuantas más responsabilidades tenga un sistema, más sistemas dependerán de él. Esto, a su vez, significa que el servicio fallará más porque está bajo un mayor estrés por parte de muchas otras aplicaciones (que, como beneficio adicional, fallará con él).
- ¿Cuáles crees que son las tres mejores aplicaciones web y por qué?
- ¿Qué crees que deben usarse una buena configuración / tecnologías para crear un SaaS de análisis web?
- ¿Cómo puedo aprovechar mi habilidad de desarrollo de aplicaciones C ++ QT para construir aplicaciones web HTML5? ¿Existe un solo marco de JavaScript HTML5 que sea similar?
- ¿Cuáles son las consideraciones clave al elegir una tecnología de base de datos como PostgreSQL vs MongoDB?
- ¿Cuál es la mejor manera de extender la tecnología web y conectar todo el mundo mediante la aplicación de Android?
El backend de Spotify (que es Python en gran medida, por cierto) consta de unos 100 servicios diferentes. Todos son muy, muy simples y están estrictamente enfocados en hacer una cosa bien. La mayoría de ellos son bastante autónomos, lo que significa que dependen de unos pocos otros servicios, y cuando lo hacen, suponen que los otros servicios se ralentizan y / o disminuyen de vez en cuando.
Tenga en cuenta que estos son servicios separados . Tienen su propia base de código y sus propias bases de datos. Por ejemplo, el servicio de lista de reproducción está completamente separado del servicio de usuario y el almacenamiento de música. Compartir una sola base de datos NO es una buena idea: rápidamente se convierte en una cosa horrible masiva e imposible de mantener que no debe fallar, pero lo hace, todo el tiempo. 🙂 He observado este fenómeno de “base de datos maestra” de primera mano en otras compañías, y NO es divertido y sucede REALMENTE rápido.
Estos servicios se comunican entre sí mediante un protocolo propietario, pero solía hacerse en HTTP. HTTP funcionará bien para la mayoría de los servicios, la razón por la que ya no usamos HTTP en Spotify es porque nuestra situación de carga es extrema: 20 millones de usuarios que transmiten música es una locura.
Spotify hace un uso increíblemente extenso de submódulos git, que definitivamente es una solución viable. Sin embargo, personalmente no soy fanático. Los submódulos de Git no están diseñados para ser un administrador de paquetes, y si puede, use administradores de paquetes reales en su lugar, como pip o easy_install para Python, npm para node.js o gem para Ruby. Le ahorrará mucho dolor tener paquetes con versiones semánticas en lugar de meterse con submódulos git. Para configurar un servidor de paquetes privado, recomiendo Gemfury.
Lo hacemos, en realidad utilizamos un único repositorio para todo esto, y git parece manejar esto muy bien. Si usa Github, también podría usar repositorios separados, pero es muy difícil configurarlo sin él.
Editar: se puede encontrar una lectura más divertida sobre el backend de Spotify en esta respuesta: ¿Cuál es la arquitectura de Spotify?