Generalmente llamamos a un sistema distribuido cuando la interacción (intercambio de datos o ejercicio de control) entre componentes es cualitativamente diferente de la interacción dentro de un componente. Puede ser uno o una combinación de los siguientes factores (desde la parte superior de mi cabeza):
- Latencia: la interacción entre componentes lleva mucho más tiempo que dentro, lo que requiere un manejo especial, como el procesamiento por lotes y la ejecución asincrónica;
- Rendimiento: la interacción se produce a través de un enlace débil, lo que requiere protocolos específicos que tengan en cuenta el rendimiento;
- Deriva del tiempo: no hay un “reloj de pared” compartido que pueda ser utilizado de manera confiable por todos los componentes;
- Contratos: las interfaces de componentes evolucionan independientemente, sin una forma confiable de actualizar todo el sistema a la vez;
- Fallos parciales: la caída de un solo componente no garantiza un reinicio de todo el sistema;
- Consistencia: no existe una vista única del sistema en “punto en el tiempo”, los componentes evolucionan su estado independientemente;
- Límites de propiedad: la interacción ocurre a través de un enlace que está sujeto a manipulación o escuchas telefónicas.
Estas preocupaciones también son comunes a las redes de computadoras. De hecho, la mayoría de los sistemas distribuidos tienen una red informática como una de sus partes. Caso en cuestión: Internet, que es probablemente el sistema distribuido más grande conocido por la humanidad y exhibe todos los factores anteriores.
Sin embargo, la presencia de una red informática no es necesaria ni suficiente para calificar un sistema como distribuido. Para calificar un sistema como distribuido, debemos tener en cuenta la escala.
Por ejemplo, a pesar de que las supercomputadoras contienen redes de propósito especial, desde el punto de vista de la aplicación, no son un sistema distribuido, ya que la mayoría de los factores anteriores están (con suerte) ocultos a su control. Al mismo tiempo, mi MacBook es un sistema distribuido desde el punto de vista de los ingenieros de procesadores: tiene múltiples núcleos y múltiples cachés que tienen que interactuar y parecer más o menos una sola unidad para las aplicaciones que los usan. Este es solo un ejemplo de un sistema que parece monolítico, pero resulta ser distribuido tan pronto como cambiamos la escala y lo miramos más de cerca.
Otro ejemplo interesante (y generalizado) sería una configuración que involucra varios procesos que se ejecutan en una máquina y tienen que comunicarse entre sí, por ejemplo, un servidor web y una base de datos que se ejecutan juntas en el mismo host. No existe una red de computadoras entre ellos en el sentido convencional, pero lidiar con la evolución independiente de los contratos y el estado, así como las fallas parciales, es casi inevitable. Esto, en mi opinión, califica dicha configuración, por simple que sea, como un sistema distribuido.