Base de datos en un proyecto comercial: ¿qué hacer?

¡Todo con el fin de las vacaciones! ... Algunos dirán que esta felicitación es regular. Pero, seguramente, muchos pronto tendrán vacaciones, así que tómate un poco más. Bueno, no estamos perdiendo impulso y en este día cálido compartimos la experiencia de nuestros socios. Se tratará de optimizar el trabajo con la base de datos. Más detalles debajo del corte!



Doy la palabra al autor.

¡Les damos la bienvenida, lectores de Habr! Somos el equipo de WaveAccess , en este artículo compartiremos con usted la experiencia de usar el servicio de base de datos (DB) Azure Cosmos DB en un proyecto comercial. Le diremos por qué está destinada la base de datos y los matices que tuvimos que enfrentar durante el desarrollo.

¿Qué es Azure Cosmos DB?


Azure Cosmos DB es un servicio de base de datos comercial distribuido globalmente con un paradigma multimodelo, proporcionado como una solución PaaS. Ella es la próxima generación de Azure DocumentDB.

La base de datos fue desarrollada en 2017 por Microsoft con la participación de Leslie Lamport, Ph.D. en informática (ganador del Premio Turing 2013 por su contribución fundamental a la teoría de sistemas distribuidos, desarrollador de LaTex, creador de la especificación TLA +).

Las características principales de Azure Cosmos DB son:

  • Base de datos no relacional;
  • Los documentos que contiene se almacenan como JSON;
  • Escalado horizontal con una selección de regiones geográficas;



  • Paradigma de datos multimodelo: valor-clave, documento, gráfico, familia de columnas;
  • Baja latencia para el 99% de las solicitudes: menos de 10 ms para operaciones de lectura y menos de 15 ms para operaciones de escritura (indexadas);
  • Diseñado para alto rendimiento;
  • Garantiza disponibilidad, consistencia de datos, latencia en el nivel de SLA de 99.999%;
  • Ancho de banda configurable
  • Replicación automática (maestro-esclavo);
  • Indexación automática de datos;
  • Niveles personalizables de consistencia de datos. 5 niveles diferentes (Fuerte, Estabilidad limitada, Sesión, Prefijo consistente, Eventual);

En el gráfico, puede ver la dependencia de varios niveles de coherencia de la disponibilidad, el rendimiento y la coherencia de los datos.



  • Para una transición conveniente a Cosmos DB desde su base de datos, hay muchas API para acceder a los datos: SQL, JavaScript, Gremlin, MongoDB, Cassandra, Azure Blob;
  • Firewall personalizable;
  • Tamaño de base de datos personalizado.

La tarea que resolvimos


Miles de sensores ubicados en todo el mundo transmiten información (en adelante notificaciones) cada pocos N segundos. Estas notificaciones deben almacenarse en la base de datos y luego buscarlas y mostrarlas en la interfaz de usuario del operador del sistema.

Requerimientos del cliente:

  • Usar una pila de tecnologías de Microsoft, incluida la nube de Azure;
  • Rendimiento de 100 solicitudes por segundo;
  • Las notificaciones no tienen una estructura clara y podrían expandirse aún más;
  • Para notificaciones críticas, la velocidad de procesamiento es importante;
  • Alta resistencia del sistema.

De acuerdo con los requisitos del cliente, nos acercó idealmente una base de datos comercial confiable, no relacional, distribuida globalmente.



Si observamos bases de datos similares a Cosmos DB, podemos recordar Amazon DynamoDB, Google Cloud Spanner. Pero Amazon DynamoDB no está distribuido globalmente, y Google Cloud Spanner tiene menos niveles de consistencia y tipos de modelos de datos (solo tabulares, relacionales).

Por estos motivos, nos decidimos por Azure Cosmos DB. Para interactuar con la base de datos, utilizamos el SDK de Azure Cosmos DB para .NET , ya que el back-end se escribió en .NET.

Los matices que encontramos


1. Gestión de bases de datos

Para comenzar a usar la base de datos, en primer lugar, debe elegir una herramienta para administrarla. Utilizamos Azure Cosmos DB Data Explorer en Azure Portal y DocumentDbExplorer . También hay una utilidad Azure Storage Explorer.



2. Configurar colecciones de bases de datos

En Cosmos DB, cada base de datos consta de colecciones y documentos.

Funciones de colección personalizables a tener en cuenta:

  • Tamaño de la colección: fijo o ilimitado;
  • Ancho de banda en unidades de solicitudes por segundo RU / s (desde 400 RU / s);



  • Política de indexación (incluyendo o excluyendo documentos y rutas hacia y desde el índice, configurando varios tipos de índice, configurando modos de actualización del índice).

Ejemplo de índice típico

{ "id": "datas", "indexingPolicy": { "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*", "indexes": [ { "kind": "Range", "dataType": "Number", "precision": -1 }, { "kind": "Hash", "dataType": "String" }, { "kind": "Spatial", "dataType": "Point" } ] } ], "excludedPaths": [] } } 

Para que funcione la búsqueda de subcadenas, para los campos de cadena debe usar el índice Hash ("kind": "Hash").

3. Transacciones de bases de datos

Las transacciones se implementan en la base de datos a nivel de procedimientos almacenados (la ejecución de un procedimiento almacenado es una operación atómica). Procedimientos almacenados de JavaScript

 var helloWorldStoredProc = { id: "helloWorld", body: function () { var context = getContext(); var response = context.getResponse(); response.setBody("Hello, World"); } } 

4. Canal de cambio de base de datos

Change Feed escucha los cambios en la colección. Cuando se producen cambios en los documentos de recopilación, la base de datos lanza un evento sobre los cambios a todos los suscriptores de este canal.

Utilizamos Change Feed para rastrear los cambios de la colección. Al crear un canal, primero debe crear una colección auxiliar AUX que coordine el procesamiento del canal de cambio para varios roles de trabajo.

5. Restricciones de la base de datos:

  • Falta de operaciones masivas (procedimientos almacenados usados ​​para eliminación masiva , actualización de documentos);
  • Falta de actualización parcial del documento;
  • Sin operación SKIP (complejidad de la implementación de paginación). Para implementar la paginación en las solicitudes de notificaciones, utilizamos RequestContinuation (enlace al último elemento como resultado de la emisión) y MaxItemCount (número de elementos devueltos desde la base de datos). De forma predeterminada, los resultados se devuelven en lotes (no más de 100 elementos y no más de 1 MB en cada paquete). El número de elementos devueltos se puede aumentar a 1000 utilizando el parámetro MaxItemCount.

6. Procesando el error 429 de la base de datos

Cuando el ancho de banda de la colección alcanza su máximo, la base de datos comienza a generar un error "429 Too Many Request". Para procesarlo, puede usar la configuración RetryOptions en el SDK, donde MaxRetryAttemptsOnThrottledRequests es el número de intentos para completar la solicitud, y MaxRetryWaitTimeInSeconds es el tiempo total de los intentos de conexión.

7. Previsión del costo del uso de la base de datos.

Para predecir el costo de usar la base de datos, utilizamos la calculadora en línea RU / s. En el plan básico, una unidad de solicitud para un elemento de 1 KB corresponde a un simple comando GET mediante un enlace a sí mismo o al identificador de este elemento.

Conclusiones


Azure Cosmos DB es fácil de usar, fácil y flexible de configurar a través del portal de Azure. Las numerosas API de acceso a datos facilitan la migración a Cosmos DB. No es necesario contratar a un administrador de base de datos para mantener la base de datos. Las garantías financieras de SLA, la escala horizontal global hacen que esta base de datos sea muy atractiva en el mercado. Es adecuado para su uso en aplicaciones empresariales y globales que exigen altas exigencias de tolerancia a fallos y ancho de banda. En WaveAccess continuamos usando Cosmos DB en nuestros proyectos.

Sobre el autor


El equipo de WaveAccess crea software técnicamente sofisticado, altamente cargado y tolerante a fallas para empresas de todo el mundo. Alexander Azarov , vicepresidente senior de desarrollo de software en WaveAccess, comenta:

A primera vista, las tareas difíciles se pueden resolver con métodos relativamente simples. Es importante no solo aprender nuevas herramientas, sino también perfeccionar el conocimiento de las tecnologías familiares.

Blog de la empresa

Source: https://habr.com/ru/post/es413757/


All Articles