ruby on rails - vale - ¿Por qué no se puede escalar Twitter agregando servidores de la manera en que lo hacen los sitios como Facebook?
ruby php (7)
Creo que falta algo importante aquí es la plataforma. Sí, tuvimos el argumento compilado contra el interpretado y un par de otros. Pero un aspecto muy importante fue de hecho la plataforma. Hay diferentes máquinas virtuales de Ruby pero ninguna hizo por favor Twitter, aunque lo ajustaron bastante. Pero Scala se ejecuta en la JVM y los ingenieros de Twitter tienen una experiencia bastante buena con eso. ¿Por qué ellos no intentaron / eligieron JRuby? Bueno, supongo que las razones mencionadas anteriormente entran aquí en juego.
He estado buscando una explicación de por qué Twitter tuvo que migrar parte de su software intermedio de Rails a Scala. Lo que les impidió escalar el camino de Facebook, al agregar servidores a medida que su base de usuarios se expandió. Más específicamente, ¿qué pasa con la tecnología de Ruby / Rails que evitó que el equipo de Twitter adoptara este enfoque?
La escala de Facebook (y Google) agrega más servidores, pero al mismo tiempo dividen su aplicación en varios servicios. Esos servicios se comunican a través de una interfaz y tipo acordados, y ahora son libres de crear estos servicios en cualquier tecnología que consideren conveniente. El hecho de que usted lea que Facebook utiliza php no significa que todos sus servicios back-end sean atendidos por php (y tampoco tiene sentido, ya que en SOA puede elegir cualquier paquete de tecnología).
Creo que este video es la mejor respuesta a tu pregunta:
"De Ruby a la JVM" https://www.youtube.com/watch?v=ohHdZXnsNi8
Las ganancias lineales con paralelismo (que es lo que son varios servidores) son extremadamente raras y muy dependientes de la aplicación. Sí, existe, así es como GPU hace la mayor parte de su trabajo. Si está sirviendo páginas estáticas, sin estado de sesión, ese también sería el caso.
En su mayor parte, sin embargo, agregar servidores no aumenta el rendimiento linealmente (es decir, 10 servidores no son 10 veces más rápidos que 1 servidor), y eso significa que cualquier ganancia que pueda obtener en un único servidor tendrá mucho más impacto que simplemente agregar servidores. No es que Twitter no tenga muchos servidores, ¿verdad?
Ninguna plataforma puede escalar infinitamente mientras sigue lidiando con conjuntos complejos de datos que cambian de momento a momento. El lenguaje y la infraestructura son importantes, pero la forma en que construyes tu sitio y los patrones de acceso a los datos importan más.
Si alguna vez jugaste en juegos como Transport Tycoon o Settlers, donde tienes que transportar recursos, sabrás cómo debes mantenerte al día de la actualización de la infraestructura a medida que aumenta el uso.
Las plataformas de escala como Facebook y Twitter son una tarea interminable. Usted tiene un número cada vez mayor de usuarios, y se le está presionando para que agregue más características y funcionalidades. Es un proceso continuo de actualización de un bit, que causa más estrés en otro bit.
Lanzar servidores al problema no siempre es la respuesta, y en ocasiones puede causar más problemas.
No es que Rails no se escale, sino que las solicitudes de datos "en vivo" en Ruby (o cualquier lenguaje interpretado) no se escalan, ya que son comparativamente mucho más costosas en términos de utilización de CPU y memoria que sus contrapartes de lenguaje compilado. .
Ahora, si Twitter fuera un tipo diferente de servicio, uno que tuviera la misma enorme base de usuarios, pero que brindara datos que cambiaran con menor frecuencia, Rails podría ser una opción viable mediante el almacenamiento en caché; es decir, se evitan solicitudes en vivo a la pila de Rails por completo y se descargan al servidor front-end y / o al caché de DB en memoria. Un excelente artículo sobre este tema:
Cómo Basecamp Next llegó a ser tan malditamente rápido
Sin embargo, Twitter no se deshizo de Rails solo por problemas de escalado, sino que hizo el cambio porque Scala, como lenguaje, ofrece ciertas garantías integradas sobre el estado de su aplicación que los idiomas interpretados no pueden proporcionar: si compila, desperdicia errores de tiempo como los errores tipográficos con dedos gordos, las llamadas a métodos incorrectos, las declaraciones de tipos incorrectos, etc. simplemente no pueden existir.
Para Twitter TDD no fue suficiente. Una cita de Dijkstra en Programación en Scala ilustra este punto: "las pruebas solo pueden probar la presencia de errores, nunca su ausencia". A medida que su aplicación creció, se encontraron con más y más dificultades para rastrear errores. La gira de misterio mágico se estaba convirtiendo en un obstáculo más allá del rendimiento, por lo que hicieron el cambio. Por todas las cuentas, un éxito abrumador, Twitter es para Scala lo que Facebook es para PHP (aunque Facebook usa su propio preprocesador C ++ ultrarrápido, así que hacer trampa un poco ;-))
En resumen, Twitter hizo el cambio tanto en rendimiento como en fiabilidad. Por supuesto, Rails tiende a estar en la vanguardia de la innovación, por lo que las aplicaciones del 99% de tráfico de Twitter que no son de Twitter pueden funcionar bien con un lenguaje interpretado (aunque, ahora estoy sólidamente en el lado compilado del lenguaje de la valla) ¡Scala es demasiado bueno!)
Podrían haber arrojado más hardware al problema, pero es mucho más caro que simplemente escribir un código más eficiente. Al igual que muchos marcos de alto nivel, Ruby on Rails es excelente en muchas cosas, pero el alto rendimiento no es uno de ellos. Los lenguajes compilados siempre serán más rápidos que los idiomas interpretados.
http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster vincula a un conjunto de publicaciones sobre los cambios, incluido un historial decente de los pasos dados a lo largo del tiempo.
La versión corta es que Ruby and Rails no ofrecieron el rendimiento y la confiabilidad que requerían para el servicio. Dada la escala, esto no es sorprendente; la mayoría de las soluciones COTS no son satisfactorias en el extremo de gran escala.
La alta escalabilidad cubre muchas preguntas sobre la arquitectura en ese extremo superior, para otros sitios, por lo que también ayuda a responder preguntas más amplias en el área.