Conectando con Azure Cosmos DB (SQL API)

avatar-jose-luque.jpg

Escrito por
Backend & Azure Technical Leader 07 febrero, 2018

¿Qué es Azure Cosmos DB? 

Azure Cosmos DB es la base de datos multimodelo de distribución global de Microsoft, que fue diseñada con las características fundamentales de distribución global y escalado horizontal, adecuada para escenarios en los que necesitemos poca latencia y manejemos grandes cantidades de datos con lecturas y escrituras a escala global. 

post azure img1.png

 

El concepto de multimodelo hace referencia a los diferentes modelos que podemos elegir para almacenar nuestra información (En Cosmos DB se conoce como secuencia de registro de átomos) y que van desde los basados en documentos y clave-valor hasta los grafos. 

Caso de uso

En el caso que nos ocupa en este post vamos a ver cómo implementar un repositorio contra un modelo JSON alojado en Cosmos DB haciendo uso de SQL API, que es la evolución de lo que antes se conocía como Document DB API. 

El modelo que vamos a representar es bastante simple, se trata de un modelo JSON que representa un post (título, fecha de publicación, contenido,etc.) así como los comentarios del mismo. 

Instalación

  • Para comenzar necesitamos crear una estancia de Azure Cosmos DB. Para ello, desde el portal de Azure, hacemos clic sobre New, buscamos el término "Azure Cosmos DB" y seleccionamos Create

 

post azure img2.png


  • A continuación, debemos seleccionar un identificador para nuestra instancia (en nuestro caso posts), seleccionar la API a utilizar, esto es, el modelo de datos del que vamos a hacer uso (en nuestro caso SQL API), la suscripción en la que deseamos crear la instancia, un grupo de recursos, bien sea uno existente o uno nuevo, y la localización (en nuestro caso lo más conveniente es una localización en North Europe o West Europe).
  • Finalmente, para escenarios en los que deseemos una distribución global, podemos seleccionar la opción de geo-redundancy para emparejar las regiones de North Europe y West Europe. Si hemos rellenado correctamente todo lo necesario al pulsar sobre Create se iniciará la creación de la instancia. 

post azure img3.png

  • Una vez tenemos la instancia creada, necesitaremos crear una nueva base de datos, y dentro de ella, una colección. Una colección es una agrupación de documentos sobre los que podemos realizar operaciones CRUD (Create, Read, Update, Delete)
  • Para ello, seleccionaremos la instancia de Cosmos DB que hemos creado, pulsaremos sobre la opción Browse, y a continuación seleccionaremos "Add Database". 
  • Finalmente, indicaremos un nombre para dicha base de datos: 

 

post azure img4.png
  • Para crear una colección seguiremos los pasos anteriores pero esta vez seleccionaremos la opción "Add Collection". A continuación, indicaremos el identificador de la base de datos que hemos creado anteriormente, le daremos un nombre a la colección (en nuestro caso PostCollection), seleccionaremos la capacidad, pudiendo elegir bien entre un tamaño fijo de 10GB o bien no limitarnos a un tamaño si creemos que nuestra colección puede ir más allá de dicha capacidad. Si optamos por la opción sin límites, debemos tener en cuenta que el pago se calcula por GB de información almacenada. 
  • Finalmente, tendremos que establecer un valor de Throughput, dicho valor expresa el número de unidades de petición por segundo, siendo 1 el rendimiento necesario para leer un docuemento de 1KB. En nuestro caso, y dado que es una colección a modo de PoC, vamos a establecer el mínimo valor recomendado que es de 400. 

post azure img5.png

 

Configuración

Para poder conectarnos a nuestra colección, además del nombre de la base de datos y de la colección, necesitaremos el endopint de conexión, así como una de las claves

Para ello, desde la sección Keys podremos acceder a dicha información.

 

post azure img6.png

 

Implementación

Al haber seleccionado SQL API como modelado, vamos a hacer uso del paquete nuget Microsoft.Azure.DocumentDB (podríamos decir que es nuestro Azure Cosmos DB Client) para poder conectar con nuestra instancia. 

En la implementación de la inicialización de la conexión del cliente, tenemos que pasarle la URL del endpoint de nuestra instancia, así como la clave de conexión. Opcionalmente, podemos indicar ciertas políticas de conexión: 

 

var endpointUrl = _configuration["CosmosDB:EndpointURL"];

var primaryKey = _configuration["CosmosDB:Key"];

var connectionPolicy = new ConnectionPolicy

{

    ConnectionMode = ConnectionMode.Direct,

    ConnectionProtocol = Protocol.Tcp

};

var client = new DocumentClient(new Uri(endpointUrl), primaryKey, connectionPolicy);

await _client.OpenAsync();

 

 

Rendimiento

La forma en que un cliente se conecta a Azure Cosmos DB a través del cliente de Document DB tiene importantes implicaciones sobre el rendimiento, especialmente en términos de latencia. 

Hay dos opciones disponibles para configurar la política de conexión del cliente: el modo de conexión y el protocolo de conexión. 

  • El modelo Gateway es compatible con todas las plataformas SDK, y es el modo predeterminado configurado. Si nuestra aplicación se ejecuta dentro de una red corporativa con restricciones estrictas de firewall, Gateway Mode es la mejor opción, ya que utiliza el puerto HTTPS estándar. 

Sin embargo, la contrapartida de rendimiento es que el modo Gateway implica un salto de red adicional cada vez que se leen o escriben datos, ya que envía solicitudes a los equipos de pasarela, que traducen el URL lógico de la solicitud a la dirección física del nodo, y reenvían la solicitud correctamente. 

  • Debido a esto, el modo directo ofrece un mejor rendimiento debido al menor número de saltos de red. Cuando se aprovecha el modo directo, hay dos opciones de protocolo disponibles: TCP y HTTPS.

SQL API ofrece un modelo de programación RESTful simple y abierto sobre HTTPS. Además, ofrece un protocolo TCP eficiente que también es RESTful en su modelo de comunicación y está disponible en el cliente que hemos instalado. 

Finalmente, debemos tener en cuenta que la primera solicitud tendrá una latencia más alta porque tiene que buscar la tabla de enrutamiento de direcciones, por lo que es aconsejable utilizar el método asíncrono de apertura.

Ejemplo completo

Existe una aplicación ASP.NET Core de ejemplo con un repositorio con operaciones CRUD sobre una colección de Azure Cosmos DB (SQL API). 

¡Pincha aquí para verla!

Enlaces relacionados: "Introduction to Azure Cosmos DB

¡Gracias por leer! 

Podéis dejar vuestros comentarios aquí o en nuestras redes sociales. ¡Estaré encantado de leeros! :) 

ojo_07 ¿ Te gusta lo que lees? Suscríbete a nuestras newsletters