Поделиться через


Шаблоны фида изменений в Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Канал изменений Azure Cosmos DB обеспечивает эффективную обработку больших наборов данных с большим объемом операций записи. Также канал изменений позволяет обойтись без запросов ко всему набору данных, когда нужно найти только изменившиеся данные. В этой статье рассматриваются распространенные шаблоны проектирования потока изменений, компромиссы проектирования и ограничения потока изменений.

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

  • Активация уведомления или вызова API при вставке, обновлении или удалении элемента.
  • потоковая обработка в режиме реального времени (для Интернета вещей) или аналитическая обработка в режиме реального времени по рабочим данным;
  • Перемещение данных, например, синхронизация с кэшем, поисковым движком, хранилищем данных или холодным хранилищем.

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

Схема, на котором показано использование канала изменений Azure Cosmos DB для аналитики в режиме реального времени и сценариев вычислений на основе событий.

Обработка событий и уведомления

Канал изменений Azure Cosmos DB может упростить сценарии, которые должны активировать уведомление или отправлять вызов в API при определенном событии. Можно использовать обработчик потока изменений для автоматического опроса контейнера для изменений и вызова внешнего API при каждой записи, обновлении или удалении.

Вы также можете выборочно активировать уведомление или отправить вызов в API на основе определенного критерия. Например, если вы читаете из канала изменений, используя Функции Azure, вы можете добавить логику в функцию, чтобы отправить уведомление только в том случае, если условие выполнено. Хотя код функции Azure будет выполняться для каждого изменения, уведомление будет отправлено только в том случае, если условие выполнено.

Потоковая обработка в режиме реального времени

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

Схема, демонстрирующая лямбда-конвейер на базе Azure Cosmos DB для сбора и обработки запросов.

Во многих случаях реализации потоковой обработки сначала получают большой объем входящих данных во временную очередь сообщений, например в концентраторы событий Azure или в Apache Kafka. Канал изменений — отличная альтернатива, поскольку Azure Cosmos DB поддерживает устойчивую высокую скорость приема данных с гарантированной низкой задержкой чтения и записи. Преимущества канала изменений Azure Cosmos DB перед очередью сообщений включают следующее.

Сохраняемость данных

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

Возможность запроса

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

Высокая доступность

Azure Cosmos DB обеспечивает доступность для чтения и записи до 99,999 %. В отличие от многих очередей сообщений, данные Azure Cosmos DB могут быть легко распределены по всему миру и настроены с нулевой временной целью восстановления (RTO).

После обработки элементов в канале изменений можно создать материализованное представление и сохранить агрегированные значения обратно в Azure Cosmos DB. Если вы используете Azure Cosmos DB для создания игры, например, вы можете использовать канал изменений для реализации списков лидеров в режиме реального времени на основе показателей завершенных игр.

Перемещение данных

Вы также можете считывать данные из потока изменений для перемещения данных в режиме реального времени.

Например, с помощью канала изменений можно эффективно выполнять следующие задачи:

  • Обновите кэш, индекс поиска или хранилище данных с данными, хранящимися в Azure Cosmos DB.

  • Выполните миграцию без простоя в другую учетную запись Azure Cosmos DB или другой контейнер Azure Cosmos DB с другим логическим ключом секции.

  • реализация распределения данных по уровням и архивирования на уровне приложения. Например, можно хранить "горячие" данные в Azure Cosmos DB и перемещать "холодные" данные в другие системы хранения, такие как хранилище BLOB-объектов Azure.

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

Источник событий

Шаблон источников событий включает использование хранилища, доступного только для добавления данных, для записи полного набора действий с этими данными. Канал изменений Azure Cosmos DB является отличным выбором в качестве центрального хранилища данных в архитектурах на основе событий, в которых весь прием данных моделируется как записи (без обновлений или удалений). В этом случае каждая запись в Azure Cosmos DB является "событием", поэтому в канале изменений есть полная запись прошлых событий. Типичные способы использования событий, опубликованных центральным хранилищем событий, предназначены для поддержания материализованных представлений или интеграции с внешними системами. Поскольку в режиме последней версии канала изменений нет ограничения на срок хранения, вы можете воспроизвести все прошлые события, начав чтение с начала канала изменений контейнера Azure Cosmos DB. Вы даже можете подписаться на один канал изменений нескольких потребителей канала изменений.

Azure Cosmos DB — это отличное центральное хранилище постоянных данных в шаблоне источников событий, доступное только для добавления. Оно отличается высокой горизонтальной масштабируемостью и высоким уровнем доступности. Кроме того, обработчик канала изменений предлагает гарантию "по крайней мере один раз", обеспечивая, что вы не пропустите ни одного события.

Текущие ограничения

Веб-канал изменений имеет несколько режимов, каждый из которых имеет важные ограничения, которые следует понимать. Существует несколько областей, которые следует учитывать при разработке приложения, использующего канал изменений в режиме последней версии или в режиме всех версий и удаления.

Промежуточные обновления

В режиме последней версии в потоке изменений отображается только последнее изменение конкретного элемента. При обработке изменений вы считываете последнюю доступную версию элемента. Если в течение короткого периода времени существует несколько обновлений для одного и того же элемента, можно пропустить обработку промежуточных обновлений. Если вы хотите воспроизвести отдельные прошлые обновления элемента, можно моделировать их как серию записей или использовать режим всех версий и удалений.

Удаление

Режим последней версии фида изменений не фиксирует удаления. При удалении элемента из контейнера он также удаляется из канала изменений. Наиболее распространенным способом обработки удаления является добавление обратимого маркера на удаленные элементы. Можно добавить свойство, называемое deleted, и задать ему значение true во время удаления. Это обновление документа отображается в канале изменений. Вы можете задать время жизни (TTL) на этом элементе, чтобы его можно было автоматически удалить позже.

Хранение

Функция "канал изменений" в режиме последней версии имеет неограниченное время хранения. До тех пор пока элемент существует в вашем контейнере, он доступен в канале изменений.

Гарантированный заказ

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

Например, рассмотрим розничное приложение, использующее шаблон конструктора событий. В этом приложении различные действия пользователя — это все "события", которые моделироваются как записи в Azure Cosmos DB. Допустим, произошло несколько событий в следующей последовательности.

  1. Клиент добавляет элемент A в корзину покупок.
  2. Клиент добавляет элемент B в корзину покупок.
  3. Клиент удаляет элемент A из корзины покупок.
  4. Клиент завершает покупку, и содержимое корзины отправляется.

Для каждого клиента сохраняется материализованное представление текущего содержимого корзины. Приложение должно обеспечивать обработку этих событий в том порядке, в котором они происходят. Например, если оформление заказа из корзины было бы обработано до удаления элемента A, скорее всего, элемент A был бы отправлен клиенту, а не элемент, который клиент хотел вместо него, элемент B. Чтобы гарантировать, что эти четыре события обрабатываются в порядке их появления, они должны находиться в том же значении ключа раздела. Если выбрать username (у каждого клиента есть уникальное имя пользователя) в качестве ключа секции, вы можете гарантировать, что эти события отображаются в канале изменений в том же порядке, в котором они записываются в Azure Cosmos DB.

Примеры

Ниже приведены некоторые примеры кода канала изменений из реальной практики для режима последней версии, которые выходят за пределы предоставленных образцов: