El objetivo principal de implementar un sistema con un enfoque de arquitectura basado en microservicios es agregar la posibilidad de escalar cuando las capacidades del negocio lo requieran. Uno de los problemas radica en que para escalar desde el punto de vista del software no solo basta con escalar las aplicaciones en sí, se requiere además escalar los sistemas de persistencia.

Para lograr mecanismos de persistencia escalables se requiere de la adopción de tecnologías de almacenamiento de datos que así lo permitan. La elección incorrecta de un sistema de base de datos en etapas tempranas del desarrollo puede traer consigo verdaderos dolores de cabeza en el futuro.

En este blog hablamos hace un tiempo de la conjetura de brewer, que fue popularizado como teorema CAP. Este teorema nos dice en forma resumida que en un sistema distribuido es imposible que un sistema de persistencia pueda garantizar la disponibilidad, consistencia y tolerancia de particiones.

Componentes del teorema CAP

Definamos cada unos de los elementos del teorema CAP y su significado.

Consistency (Consistencia):

  • Significado: Todos los nodos en el sistema tienen la misma vista de los datos en un momento dado.
  • Explicación: La consistencia garantiza que cualquier lectura desde cualquier nodo del sistema devuelva el mismo conjunto de datos. Esto significa que, después de una operación de escritura, todas las lecturas subsiguientes devolverán el valor actualizado. Es como si hubiera una única copia de los datos que siempre está actualizada.

Availability (Disponibilidad):

  • Significado: Cada solicitud recibida por un nodo que no falla en el sistema debe resultar en una respuesta.
  • Explicación: La disponibilidad garantiza que el sistema siempre está listo para responder a las solicitudes, incluso si uno o más nodos fallan. Esto implica que cada solicitud se procesa y se da una respuesta, sin importar si se producen fallos en algunos nodos del sistema. Un sistema altamente disponible continúa funcionando incluso cuando hay fallos en algunos de sus componentes.

Partition Tolerance (Tolerancia a particiones):

  • Significado: El sistema continúa operando incluso si hay fallos de red que dividen el sistema en particiones.
  • Explicación: La tolerancia a particiones asegura que el sistema sigue funcionando y respondiendo a las solicitudes incluso si hay fallos de comunicación entre los nodos. Esto significa que, aunque los nodos no puedan comunicarse entre sí debido a un fallo de red, el sistema en su conjunto sigue operando. La replicación de datos a través de múltiples nodos y redes ayuda a mantener el sistema en funcionamiento durante estas interrupciones.

De acuerdo al teorema CAP, cualquier sistema distribuido necesita elegir dos de las tres propiedades. Las tres opciones son CA (consistente y disponible), CP (consistente y tolerante a particiones) y AP (disponible y tolerante a particiones). Sin embargo, CA no es realmente una opción coherente para sistemas distribuidos, ya que un sistema que no es tolerante a las particiones se verá obligado a renunciar a la coherencia o la disponibilidad en el caso de una partición de red.

Como elementos central no podemos crear un sistema de persistencia que sea continuamente disponible, consistente y tolerante a cualquier falla de partición al mismo tiempo. Solo podemos construir un sistema que posea dos de estas tres propiedades. Esto se debe a que, para garantizar la consistencia, todos los nodos deben ver el mismo conjunto de actualizaciones en el mismo orden. Sin embargo, si la red se divide en particiones, es posible que las actualizaciones en una partición no lleguen a las otras antes de que un cliente lea datos de una partición desactualizada después de haber leído de una partición actualizada. La única manera de manejar esta situación es dejar de atender solicitudes de la partición desactualizada, pero entonces el sistema ya no estaría disponible totalmente.

PACELEC, una extensión de CAP.

El teorema PACELC es una extensión del teorema CAP que proporciona un marco más detallado para entender las compensaciones en sistemas distribuidos. Fue propuesto por Daniel J. Abadi y complementa el teorema CAP al tener en cuenta tanto las situaciones en las que hay particiones en la red (como en CAP) como cuando no las hay.

El teorema PACELC establece que en un sistema distribuido:

  • P (Partition tolerance): Tolerancia a particiones. Similar a CAP, afirma que un sistema distribuido debe ser tolerante a particiones, ya que las particiones en la red son inevitables.
  • A (Availability) y C (Consistency): En caso de una partición de red (P), el sistema debe elegir entre ser Disponible (A) o Consistente (C).
  • E (Else – En otro caso) y L (Latency) y C (Consistency): En ausencia de particiones (Else – E), el sistema debe elegir entre baja Latencia (L) y Consistencia (C).

Interpretación del Teorema PACELC

El teorema PACELC amplía el teorema CAP al reconocer que, además de los tiempos en los que hay una partición (P), también hay un tiempo importante en el que no hay particiones (Else – E). En esos momentos, los desarrolladores deben tomar una decisión adicional entre optimizar la consistencia o la latencia.

Explicación Detallada

Tolerancia a particiones (P):

  • Un sistema debe ser tolerante a particiones, ya que las particiones en la red pueden ocurrir. Esto significa que debe seguir funcionando incluso si los nodos están desconectados unos de otros.

Disponibilidad (A) vs. Consistencia (C) Durante las particiones:

  • Durante una partición de red, un sistema distribuido debe elegir entre ser consistente (C) o estar disponible (A). Esto es el mismo dilema que el teorema CAP plantea.

Latencia (L) vs. Consistencia (C) Cuando no hay particiones (Else – E):

  • Cuando no hay particiones en la red, el sistema debe elegir entre proporcionar respuestas con baja latencia (L) o asegurar una consistencia fuerte (C). Esta elección reconoce que incluso en condiciones normales, hay un trade-off entre la rapidez de respuesta y la consistencia de los datos (debido obviamente a que en los sistemas de persistencia distribuidos la consistencia siempre será eventual, aún en condiciones donde no hay particiones).

El teorema PACELC amplía el marco de referencia de CAP al incluir consideraciones de latencia y consistencia durante condiciones normales de operación, además de las particiones de red. Esto proporciona una visión más completa para la selección de sistemas de bases de datos.