Mientras no tenga muchos usuarios (donde muchos se definen como la cantidad de usuarios que requerirían que obtenga de 50 a 100 visitas por segundo en un solo servidor), la escalabilidad no es un problema. Sin embargo, cuando cruza ese umbral, debe comenzar a pensar cómo funcionará su aplicación en presencia de múltiples servidores conectados a través de redes. La gran mayoría de los sitios en la web nunca se topa con este problema porque no tienen tantos usuarios; sin embargo, aquellos que siempre tienen que rediseñar sus aplicaciones para la escalabilidad.
El problema más común que se enfrenta en este rediseño es que debe decidir cómo fluyen los datos a través de su sistema para que todos no accedan al mismo almacén de datos (de lo contrario, puede escalar solo a la capacidad de respuesta de su almacén de datos). En el caso de AWS o GAE, el almacenamiento es relativamente escalable, pero es posible que no cumpla con otros criterios (por ejemplo, puede que no sea lo suficientemente rápido, puede que no brinde garantías estrictas sobre la coherencia, puede requerir que exista un estado global)
El teorema de Brewer [1] establece que solo puede obtener 2 de las 3 propiedades deseables en un sistema distribuido:
- ¿Cuál es exactamente la diferencia entre CSE y los programas de matemática e informática ofrecidos en los IIT?
- ¿Cuáles serían los diez temas más relevantes en el desarrollo de software que representan la vanguardia de las prácticas de programación, la nube y los grandes datos?
- ¿Qué aplicaciones, empresas o investigación podrían aprovechar mejor una red pública de 100,000 a 300,000 PC? (Sí, tenemos uno. Cuesta ~ 1c por núcleo / hora).
- ¿De verdad debería aprender computación en la nube?
- Cómo aprender el desarrollo de OpenStack
- Consistencia
- Disponibilidad
- Tolerancia de partición
Este es el desafío fundamental de la escalabilidad. En presencia de una red distribuida de servidores, ¿qué intercambia? Idealmente, querrías los 3 pero, dado que eso no es posible en la práctica, las personas intercambian la consistencia de los otros 2 y lo manejan usando modelos de “consistencia eventual”. [2]
Sin embargo, en el momento en que decide usar la coherencia eventual, ha introducido inmediatamente la complejidad del código porque no puede confiar en sus propios datos porque podría estar en el medio de una transacción que podría no completarse con éxito o parcialmente exitosa. Por lo tanto, debe poder deshacer cualquier conjunto de cambios de datos. Eso es realmente desagradable.
Desafortunadamente, las alternativas son mucho peores:
- Optar por cambiar la tolerancia de partición significa que la pérdida de unos pocos servidores o enlaces de red será suficiente para que toda su aplicación deje de funcionar, una perspectiva bastante desagradable (pero definitivamente podría ser lo correcto, por ejemplo, para un sistema de pagos).
- Optar por intercambiar la disponibilidad significa que su aplicación parecerá defectuosa para sus usuarios, así como para sus sistemas internos, ya que los sistemas pueden no responder a una solicitud de datos durante un período esencialmente indefinido.
Dado este contexto, ¿puede ver cuán desordenadas se vuelven las cosas una vez que ya no tiene un código que se encuentra en una sola caja y habla con un único almacén de datos consistente? Es por eso que hay tanto ruido en torno a la escalabilidad: se ha demostrado que es un problema difícil incluso en teoría y mucho más en la práctica, y los ingenieros inteligentes de estas empresas son los que están creando todo este ruido. No es un problema común del hombre. 🙂
Además, CAP es solo un concepto de alto nivel. Es posible que desee leer las cosas con mayor detalle. Sugeriría comenzar desde [3].
[1] http://en.wikipedia.org/wiki/CAP…
[2] http://en.wikipedia.org/wiki/Eve…
[3] http://dbmsmusings.blogspot.com/…