Coherencia en Azure Cosmos DB
Si estas familiarizado con las bases de datos distribuidas, seguramente hayas utilizado alguna vez el término coherencia, o más concretamente hayas hablado de la coherencia de datos, esto es, la necesidad de establecer la lógica necesaria para que los distintos datos replicados en tu infraestructura contengan la misma información.
Habitualmente, se habla de coherencia fuerte y coherencia eventual, pero si has tenido la oportunidad de crear una instancia de Azure Cosmos, te habrás dado cuenta de que ofrece la posibilidad de seleccionar hasta cinco niveles de coherencia diferentes.
En este post vamos a hablar de cada uno de esos niveles: qué significan, cuáles son sus características y en qué escenarios es mejor utilizar unos u otros.
Niveles de coherencia
Cuando creamos una instancia de Azure Cosmos DB tenemos la posibilidad de establecer un nivel de coherencia para nuestros datos, algo muy importante si tenemos en cuenta que la potencia de Azure Cosmos DB radica en la facilidad con la que puedes replicar tus datos a diferentes nodos en diferentes regiones.
Antes de comenzar a desgranar las bondades de cada uno de ellos, es importante remarcar que Azure Cosmos DB ofrece un acuerdo de nivel de servicio del 99,99% si hablamos de una única región. Si hablamos de más de una región, el 99,99 % aplica únicamente a los cuatro niveles de coherencia más moderados.
Actualmente, los niveles de coherencia disponibles son los siguientes:
[Fuente: https://docs.microsoft.com/es-es/azure/cosmos-db/consistency-levels]
Como se puede apreciar en la imagen, a medida que el nivel de coherencia es menos estricto, mejora la latencia, la disponibilidad y la escalabilidad de la lectura.
Fuerte
Posiblemente es el más sencillo de comprender, ya que sigue el paradigma de las bases de datos tradicionales: todas las partes implicadas, en cualquier lugar, están informadas de lo que está sucediendo en cualquier momento.
Este nivel de coherencia garantiza que, cuando se realiza una escritura, esta es únicamente visible (disponible para su lectura) hasta que la mayoría de las réplicas hayan aceptado el cambio. Por lo tanto, nos asegura que en la lectura obtendremos siempre la última versión del dato que estamos consultando.
Nos proporciona un nivel de consistencia muy alto aunque, por ello, el rendimiento y la disponibilidad se ven impactados. De hecho, si seleccionamos este nivel de coherencia, no podremos asociar más de una región a nuestra cuenta.
Obsolescencia limitada
Es muy parecido al nivel de coherencia fuerte. En este caso, se diferencia en que aquí podemos establecer un nivel de obsolescencia de los datos, es decir, que las lecturas irán por detrás de las escrituras, bien durante un intervalo de tiempo, bien durante un número de versiones del dato a leer.
Por ejemplo, si establecemos un nivel de obsolescencia de 1 hora, garantizaremos que ante una petición de lectura de un dato la información que se devuelve habrá podido cambiar en la última hora, pero no más allá de dicho lapso.
Para las aplicaciones de distribución global, se recomienda utilizar la obsolescencia entrelazada para aquellos escenarios donde se desea disponer de coherencia fuerte, pero también de una disponibilidad del 99,99 % y una latencia baja.
Sesión
Llegamos al nivel de coherencia predeterminado cuando creamos una instancia de Azure Cosmos DB. Hay varias razones. Por un lado, el precio (menos de la mitad de lo que cuestan los niveles de coherencia fuerte y de obsolescencia limitada) y, por otro, que es el nivel que más se ajusta a los escenarios más habituales.
Pensemos en el concepto de sesión de una aplicación. En este caso, nos garantiza obtener la última versión del dato consultado, siempre que los cambios se hayan realizado dentro de nuestra sesión de usuario y/o dispositivo.
Si consultamos un dato que haya sido modificado dentro de una sesión distinta a la nuestra, no garantiza obtener la última versión del mismo.
El nivel de consistencia es menor al de los niveles de coherencia anteriores, pero mejora enormemente el rendimiento en escrituras y, por encima de todo, en lecturas.
Prefijo Coherente
El nivel de coherencia de prefijo coherente nos permite obtener las lecturas en base a escrituras ordenadas, es decir, garantiza que las lecturas nunca vean escrituras desordenadas. Si se realizan escrituras en el orden A, B, C, un cliente ve A, A,B o A,B,C, pero nunca un desorden como A,C o B,A,C.
En un momento dado, en ausencias de escrituras extra las lecturas llegaran a ser consistentes, obteniendo la última versión del dato requerido.
Eventual o Final
El último nivel de coherencia disponible es el eventual o final, en el que, al igual que pasa con el de prefijo coherente, en ausencia de escrituras extra, las lecturas llegarán a ser consistentes.
La diferencia con el nivel anterior radica en que aquí no se garantiza el orden de las escrituras, por lo que podríamos leer un dato cuya versión ya ha sido cambiada y, por tanto, no estaríamos obteniendo la última versión.
Este nivel de coherencia es el que nos aporta la latencia más baja tanto en lecturas como en escrituras.
¿Por qué es importante el nivel de coherencia?
Cuando creamos nuestra instancia de Azure Cosmos DB es muy importante saber qué nivel de consistencia es el que más nos conviene para nuestra aplicación o sistema, ya que, además de tener un impacto directo sobre el rendimiento, la disponibilidad o la escalabilidad, también lo tiene sobre el gasto, puesto que los niveles de coherencia que nos aseguran una mayor consistencia son los más caros.
Espero que este post te haya resultado útil para entender los diferentes niveles de coherencia que ofrece Azure Cosmos DB y cual puede resultarte más interesante dependiendo del escenario en el que te muevas.