Конструктивные шаблоны для каналов изменений в 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 — это отличное центральное хранилище постоянных данных в шаблоне источников событий, доступное только для добавления. Оно отличается высокой горизонтальной масштабируемостью и высоким уровнем доступности. Кроме того, обработчик канала изменений предоставляет гарантию "по крайней мере один раз" , гарантируя, что вы не пропустите обработку каких-либо событий.

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

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

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

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

Deletes

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

Сохранение

Канал изменений в режиме последней версии имеет неограниченное хранение. Если элемент существует в контейнере, он доступен в канале изменений.

Гарантированный порядок

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

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

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

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

Примеры

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

Дальнейшие действия