Блог

Полезные статьи и новости о жизни WaveAccess

Опыт использования Azure Cosmos DB в коммерческом проекте

Azure Cosmos DB — это глобально распределенная база данных для приложений, поддерживающая NoSQL. Она характеризуется низкой задержкой и высокой масштабируемостью, а распространяется по модели PaaS (Platform as a service).

Azure Cosmos DB была разработана в 2017 году компанией Microsoft и пришла на смену Azure Document DB. Одним из разработчиков Cosmos DB стал известный учёный Лесли Лэмпорт — разработчик LaTeX, первый лауреат премии Дейкстры и лауреат премии Тьюринга 2013 года.

Основные отличительные черты Azure Cosmos DB:

    • Горизонтальное масштабирование в рамках всего мира.
    • Поддержка нескольких типов хранения данных: ключ-значение, граф, документ, семейство столбцов;
    • В 99% случаев время чтения данных не превышает 10 мс, а время записи данных — 15 мс;
    • Показатели доступности, согласованности данных и задержки гарантируются на уровне SLA 99,999%;
    • Поддержка различных API для миграции с других баз данных: SQL, JavaScript, MongoDB, Gremlin, Azure Blob, Cassandra;

    Map1

    • Нереляционная модель данных;
    • Хранение документов в формате JSON;
    • Высокая пропускная способность с возможностью настройки;
    • Гарантия согласованности, доступности данных;
    • Автоматическая репликация (master-slave);
    • Автоматическая индексация данных;
    • Поддержка 5 уровней согласованности данных (Strong, Bounded Staleness, Session, Consistent Prefix, Eventual);
    • Настройка размера базы данных;
    • Настройка брандмауэра.

    Grapg For Cosmos DB

    График показывает, как зависят доступность, производительность и согласованность данных от уровня согласованности.

    Задача проекта

    По всему миру расположены тысячи датчиков, которые транслируют информацию каждые N секунд. В данном тексте каждую такую передачу данных от датчика мы будем называть нотификацией. Все нотификации должны передаваться в базу данных, где затем по ним можно делать поиск и отображать в UI оператора системы.

    ТЗ на проект от заказчика содержало следующие требования:

    • Проект должен использовать стек технологий Microsoft, в том числе облако Azure; 
    • Необходимо обеспечить пропускную способность не менее 100 запросов в секунду; 
    • Структура нотификаций нестрогая и может быть расширена в дальнейшем; 
    • Важно обрабатывать критические нотификации с максимальной скоростью; 
    • Система должна иметь высокую степень отказоустойчивости.

    Мы решили реализовывать данный проект на базе нереляционной глобальной коммерческой БД с высокой надежностью.

    cosmos Map

    Аналогами Cosmos DB являются платформы баз данных Google Cloud Spanner и Amazon DynamoDB. Но у них есть ряд ограничений, не удовлетворяющих нашим условиям: Amazon DynamoDB не является глобально-распределенной, а Google Cloud Spanner имеет меньшее количество уровней согласованности и типов данных. К тому же, клиент пожелал использовать стек Microsoft. Таким образом, единственным вариантом, устроившим нас по всем параметрам, стала Azure Cosmos DB.

    Поскольку бэкенд системы был реализован на .NET, для взаимодействия с базой данных были использованы соответствующие средства разработки — Azure Cosmos DB SDK для .NET.

    Специфика проекта

    1. Инструменты управления базой данных

    Для управления базой данных мы использовали «родные» инструменты Azure Cosmos DB Data Explorer и Azure Storage Explorer, а также сторонний вариант — DocumentDbExplorer.

    Portal

    2. Настройка коллекций баз данных

    В Azure Cosmos DB каждая база данных состоит из документов и коллекций.

    Ряд параметров базы данных можно настроить:
    Размер коллекции: фиксированная или неограниченная;
    Пропускная способность (единиц запросов в секунду, RU/s) (от 400 RU/s);

    Scale

    • Политика индексирования (Включение документов и путей в индекс и исключение из него, настройка типов индекса, настройка режимов обновления индекса);

    Например, вот код типичного индекса:

    {
    "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": []
    }
    }

    Для того, чтобы реализовать функцию поиска по подстроке для текстовых полей БД, используется хэш-индекс ("kind": "Hash").

    3. Транзакции в базе данных

    Для создания транзакций в CosmosDB используются хранимые процедуры. Каждая хранимая процедура атомарна и выполняется в одной транзакции. Пример кода хранимой процедуры на JavaScript:

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

    4. Канал изменений базы данных

    Канал изменений (Change Feed) мониторит изменения в коллекции. В момент изменения база данных информирует об этом всех подписчиков канала путем создания события.

    Канал изменений пригодился нам для отслеживания изменений в коллекции. Перед созданием канала изменений, нужно также создать вспомогательную коллекцию AUX. Она нужна для координации обработки канала для нескольких рабочих ролей.

    5. Ограничения функциональности базы данных

    Несмотря на то, что мы выбрали Azure Cosmos DB среди близких аналогов по ряду устраивающих нас параметров, у этой платформы есть и ограничения. Расскажем о них и о способах их преодоления.

    В Cosmos DB отсутствуют bulk-операции. Поэтому пришлось использовать хранимые процедуры для массового удаления и обновления документов.
    Нет возможности частично обновить документ.
    Сложно реализовать пагинацию документа из-за отсутствия операции SKIP. Для этого были использованы параметры RequestContinuation (ссылка на последний элемент в результате выдачи) и MaxItemCount (количество элементов возвращаемой из БД). Данные параметры по умолчанию возвращают результат в пакетах (размер пакета — не более 1 Мб и не более 100 элементов). Количество элементов в пакете можно отрегулировать вручную с помощью параметра MaxItemCount, после чего пакет может содержать до 1000 элементов.

    6. Обработка «ошибки 429»

    Распространенная проблема — при достижении максимума пропускной способности коллекции база начинает выдавать ошибку «429 Too Many Requests». Обработать ее позволяет настройка RetryOptions в SDK, где параметр MaxRetryAttemptsOnThrottledRequests — это максимальное число попыток выполнения запроса, а MaxRetryWaitTimeInSeconds — это суммарное время выполнения попыток подключения в секундах.

    7. Прогнозирование стоимости использования БД

    Для прогноза стоимости использования базы данных (по модели PaaS), мы воспользовались онлайн-калькулятором RU/s. В базовом тарифе одна единица запроса для элемента размером 1 КБ соответствует команде GET по ссылке на себя или идентификатору этого элемента.

    Результат


    Azure Cosmos DB — гибкая платформа, дающая возможность простых и точных настроек через портал Azure. Разрабочик позаботился об удобстве миграции: доступно множество API для доступа к данным, с помощью которых можно быстро перенести данные с другой системы на Сosmos DB. Также среди преимуществ Cosmos DB — отсутствие необходимости в администраторе баз данных для ее обслуживания, гарантии SLA и широчайшие возможности масштабирования. Она находит применение в глобальных и корпоративных приложениях, где важна отказоустойчивость и высокая пропускная способность. Опыт работы с Azure Cosmos DB оказался положительным, и мы продолжим ее использование и в других проектах.

    Если вам нужен надежный, производительный коммерческий проект или разработка специфической системы, свяжитесь с намиМы обсудим вашу идею и расскажем о возможностях. 

    Заказать звонок

    Удобное время:

    Отменить

    Пишите!

    Присоединить
    Файл не больше 30 Мб.
    Отменить