Платформа данных для критически важных рабочих нагрузок в Azure

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

Характеристики Рекомендации
Производительность Сколько вычислительных ресурсов требуется?
Задержка Какое воздействие на задержку окажет расстояние между пользователем и хранилищем данных? Какой уровень согласованности желателен с учётом компромисса по задержке?
Адаптивность Требуется ли хранилище данных всегда доступно?
Масштабируемость Что такое схема секционирования?
Устойчивость Ожидается ли, что данные будут долговечными? Что такое политика хранения?
Устойчивость В случае сбоя может ли хранилище данных автоматически переключаться? Какие меры применяются для уменьшения времени переключения на резерв?
Безопасность Шифруются ли данные? Можно ли достичь хранилища данных через общедоступную сеть?

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

  • База данных

    Магазины, связанные с рабочей нагрузкой. Рекомендуется, чтобы все состояние хранилось глобально в базе данных, отделенной от региональных меток. Создайте избыточность, развернув базу данных в разных регионах. Для критически важных рабочих нагрузок синхронизация данных между регионами должна быть основной проблемой. Кроме того, в случае сбоя запросы на запись в базу данных по-прежнему должны быть функциональными.

    Репликация данных в конфигурации active-active настоятельно рекомендуется. Приложение должно мгновенно подключиться к другому региону. Все экземпляры должны иметь возможность обрабатывать запросы на чтение и запись.

  • Брокер сообщений

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

Для других аспектов данных см. руководство для критически важных задач в Well-architected Framework: аспекты платформы данных.

База данных

Рассмотрите возможность использования Azure Cosmos DB для NoSQL для критически важных рабочих нагрузок. Этот вариант предоставляет основные функции, необходимые для критически важных проектов:

  • Мульти-региональная запись

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

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

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

  • Управление конфликтами

    Благодаря возможности выполнять запись в нескольких регионах возникает необходимость внедрения модели разрешения конфликтов, так как одновременные записи могут привести к конфликтам данных. Last Writer Wins — это модель по умолчанию и используется для проектирования критически важных задач. Последний записывающий, как определено связанными метками времени записей, выигрывает конфликт. Azure Cosmos DB для NoSQL также позволяет определить пользовательское свойство.

  • Оптимизация запросов

    Общая рекомендация по эффективности запросов для контейнеров с большим количеством секций заключается в добавлении фильтра равенства с указанным идентификатором itemID. Подробный обзор рекомендаций по оптимизации запросов можно найти в статье "Устранение неполадок с запросами" при использовании Azure Cosmos DB.

  • Функция резервного копирования

    Рекомендуется использовать встроенную функцию резервного копирования Azure Cosmos DB для защиты данных. Функция резервного копирования Azure Cosmos DB поддерживает оперативное резервное копирование и восстановление данных по запросу.

Примечание.

Большинство рабочих нагрузок не являются полностью OLTP. Растет спрос на отчеты в режиме реального времени, например, запуск отчетов по операционной системе. Также это называют HTAP (гибридная транзакционно-аналитическая обработка). Azure Cosmos DB поддерживает эту возможность с помощью отражения в среде Fabric для Cosmos DB.

Модель данных для рабочей нагрузки

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

Рабочая нагрузка имеет следующие характеристики доступа к данным:

  • Шаблон чтения:
    • Точка данных — извлечение одной записи. Идентификатор элемента и ключ раздела используются напрямую для максимальной оптимизации (1 RU за запрос).
    • Чтение списка— получение элементов каталога для отображения в списке. Используется FeedIterator, ограниченное по количеству результатов.
  • Записать шаблон:
    • Небольшие записи. Запросы обычно вставляют одну или несколько записей в транзакцию.
  • Предназначен для обработки большого трафика от конечных пользователей с возможностью масштабирования для удовлетворения спроса на трафик на миллионы пользователей.
  • Небольшая полезная нагрузка или размер набора данных — обычно в диапазоне килобайт.
  • Низкое время отклика (в порядке миллисекунд).
  • Низкая задержка (в порядке миллисекунд).

Настройка

Azure Cosmos DB настроен следующим образом:

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

    Примечание.

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

  • Ключ раздела установлен на /id для всех коллекций. Это решение основано на шаблоне использования, который в основном включает "написание новых документов с GUID в качестве идентификатора" и "чтение широкого спектра документов по идентификаторам". Если код приложения поддерживает уникальность идентификатора, новые данные равномерно распределяются по секциям Azure Cosmos DB, что обеспечивает бесконечное масштабирование.

  • Политика индексирования настраивается для коллекций для оптимизации запросов. Для оптимизации затрат и производительности RU используется настраиваемая политика индексирования. Эта политика индексирует только свойства, используемые в предикаатах запросов. Например, приложение не использует текстовое поле комментария в качестве фильтра в запросах. Он был исключен из настраиваемой политики индексирования.

    В следующем примере показаны рекомендуемые параметры политики индексирования с помощью Terraform:

    indexing_policy {
    
      excluded_path {
        path = "/description/?"
      }
    
      excluded_path {
        path = "/comments/text/?"
      }
    
      included_path {
        path = "/*"
      }
    
    }
    

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

службы обмена сообщениями;

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

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

В следующих разделах описываются рекомендации по проектированию и рекомендации по использованию служебной шины Azure premium и Центров событий Azure в критической архитектуре.

Управление нагрузкой

Система обмена сообщениями должна иметь возможность обрабатывать необходимую пропускную способность (как в МБ в секунду). Обратите внимание на следующие факторы:

  • Для нефункциональных требований (NFR) системы необходимо указать средний размер сообщения и пиковое количество сообщений в секунду, которые должна поддерживать каждая метка. Эти сведения можно использовать для вычисления требуемой пиковой мб/секунды на метку.
  • Влияние переключения на резерв необходимо учитывать при вычислении требуемой пиковой пропускной способности в МБ/секунду на одну метку.
  • Для Службы шины Azure NFR должны указать любые расширенные функции службы шины, такие как сеансы и удаление дубликатов сообщений. Эти функции будут влиять на пропускную способность Service Bus.
  • Пропускная способность Service Bus с необходимыми функциями должна вычисляться путем тестирования как МБ/секунда на единицу сообщений (MU). Дополнительные сведения по этой теме см. в разделе Service Bus уровней обмена сообщениями "Премиум" и "Стандартный".
  • Пропускная способность Центра событий Azure должна вычисляться путем тестирования как МБ/секунды на единицу пропускной способности (TP) для стандартного уровня или единицу обработки (PU) для премиум-уровня. Дополнительные сведения об этом разделе см. в статье Масштабирование с помощью Центров событий.
  • Предыдущие вычисления можно использовать для проверки того, что служба обмена сообщениями может обрабатывать требуемую нагрузку на метку, а также необходимое количество единиц масштабирования, необходимых для выполнения этой нагрузки.
  • В разделе операций рассматривается автоматическое масштабирование.

Каждое сообщение должно обрабатываться

Служебная шина Azure категории "Премиум" — это рекомендуемое решение для сообщений с высоким уровнем ценности, для которых должна быть гарантирована обработка. Ниже приведены сведения об этом требовании при использовании службы Azure Service Bus Premium:

  • Чтобы убедиться, что брокер принимает и передает сообщения должным образом, производители сообщений должны использовать одного из поддерживаемых клиентов API Service Bus. Поддерживаемые API будут успешны в операции отправки только если сообщение было сохранено в очереди или теме.

  • Чтобы убедиться, что сообщения в шине обрабатываются, следует использовать режим получения PeekLock. Этот режим обеспечивает обработку как минимум один раз. Ниже описан процесс.

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

Обработка идемпотентных сообщений

В RFC 7231 гипертекстовый протокол передачи утверждает: "A ... метод считается идемпотентным , если предполагаемое влияние на сервер нескольких идентичных запросов с этим методом совпадает с эффектом для одного такого запроса".

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

  • Может возникнуть ситуация, когда обработка сообщения включает операции базы данных, в частности вставку новых записей с идентификаторами, созданными базой данных. Новые сообщения можно отправлять брокеру, который содержит эти идентификаторы. Так как не существует распределенных транзакций, охватывающих базу данных и брокер сообщений, могут возникнуть осложнения, если процесс, запускающий код, завершается сбоем. Рассмотрим следующие примеры:
    • Код, создающий сообщения, может выполняться до фиксации транзакции базы данных, как это принято у многих разработчиков, работающих с помощью шаблона Unit of Work. Эти сообщения могут утечь, если происходит сбой между вызовом брокера и запросом фиксации транзакции базы данных. По мере возврата транзакции эти идентификаторы, созданные базой данных, также отменяются, и они становятся доступными для другого кода, который может выполняться одновременно. Это может привести к тому, что получатели экранированных сообщений обрабатывают неправильные записи базы данных, что повреждает общую согласованность и правильность системы.
    • Если разработчики помещают код, который выдает сообщение после завершения транзакции базы данных, процесс по-прежнему может завершиться ошибкой между этими операциями (транзакция зафиксирована — отправлено сообщение). Когда это произойдет, сообщение снова пройдет обработку, но на этот раз защитная конструкция идемпотентности определит, что оно уже обработано (на основе данных, хранящихся в базе данных). Предложение пропустит сообщение, создающее код, полагая, что все было сделано успешно в последний раз. Подчиненные системы, которые ожидали получать уведомления о завершенном процессе, не получают ничего. Эта ситуация снова приводит к общему состоянию несоответствия.
  • Решение ранее описанных проблем включает использование шаблона "Транзакционный исходящий ящик", где исходящие сообщения хранятся в отдельной области в том же хранилище транзакций, что и бизнес-данные. Затем сообщения передаются брокеру сообщений, когда первоначальное сообщение успешно обработано.
  • Так как многие разработчики не знакомы с этими проблемами или их решениями, чтобы гарантировать, что эти методы применяются последовательно в критически важной системе, мы рекомендуем иметь функциональные возможности исходящих ящиков и взаимодействие с брокером сообщений, упакованным в какую-то библиотеку. Весь процесс обработки кода и отправки транзакционно значимых сообщений должен использовать эту библиотеку, а не взаимодействовать напрямую с брокером сообщений.
    • Библиотеки, реализующие эту функцию в .NET, включают NServiceBus и MassTransit.

Высокий уровень доступности и аварийное восстановление

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

  • Чтобы обеспечить максимальную доступность с помощью Служебной Шины, используйте «Премиум-уровень», который поддерживает зоны доступности в поддерживаемых регионах. С зонами доступности сообщения и метаданные реплицируются в трех разных центрах обработки данных в одном регионе.
  • Используйте поддерживаемые пакеты SDK для Service Bus или Event Hubs для автоматического повтора операций чтения или записи.
  • Рассмотрите active-active репликацию или active-passive репликацию в качестве моделей для защиты от региональных бедствий.

Примечание.

Геоизбыточное восстановление в служебной шине Azure реплицирует только метаданные между регионами. Эта функция не реплицирует сообщения.

Наблюдение

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

  • Дросселирование указывает, что у системы нет необходимых ресурсов для обработки запроса. Как служебная шина, так и Центры событий поддерживают мониторинг регулируемых запросов. Вы должны оповестить об этом индикаторе.
  • Глубина очереди . Глубина очереди, которая растет, может указывать на то, что процессоры сообщений не работают или недостаточно процессоров для обработки текущей нагрузки. Глубину очереди можно использовать для информирования логики автоматического масштабирования обработчиков.
    • Для Service Bus глубина очереди предоставляется в виде количества сообщений.
    • Для центров событий потребители должны вычислить глубину очереди на секцию и отправить метрику в программное обеспечение мониторинга. Для каждого чтения потребитель получает порядковый номер текущего события и свойства последнего события в очереди. Потребитель может вычислить смещение.
  • Очередь недоставленных писем — сообщения в очереди недоставленных писем представляют сообщения, которые не удалось обработать. Обычно эти сообщения требуют вмешательства вручную. Оповещения должны быть заданы в очереди недоставленных писем.
    • Служебная шина имеет очередь недоставленных сообщений и метрику DeadLetteredMessages.
    • Для Event Hubs эта функция должна быть кастомной логикой, интегрированной в потребителя.
  • Использование ЦП и памяти — ЦП и память должны отслеживаться, чтобы система обмена сообщениями была достаточно ресурсов для обработки текущей нагрузки. Как Шина обслуживания уровня "Премиум", так и Центры событий уровня "Премиум" отображают использование ЦП и памяти.
    • Единицы обмена сообщениями (MU) используются в Service Bus для изоляции ресурсов, таких как ЦП и память для пространства имен. ЦП и память, увеличивающиеся выше порогового значения, могут указывать на то, что настроено недостаточно единиц MUs, а снижение ниже других пороговых значений может указывать на то, что настроено слишком много единиц MUs. Эти индикаторы можно использовать для автоматического масштабирования MUS.
    • Уровень "Премиум" центров событий использует единицы обработки (PUS) для изоляции ресурсов, а стандартный уровень использует единицы пропускной способности (TUS). Для этих уровней не требуется взаимодействие с ЦП или памятью для автоматического раздувания PUS или TUS.

Проверка здоровья

Работоспособность системы обмена сообщениями должна рассматриваться в проверках работоспособности критически важного приложения. Обратите внимание на следующие факторы:

  • Система обмена сообщениями выступает в качестве буфера между производителями сообщений и потребителями. Метка может рассматриваться как работоспособная, если производители могут успешно отправлять сообщения брокеру и если потребители смогут успешно обрабатывать сообщения от брокера.
  • Проверка работоспособности должна гарантировать, что сообщения можно отправлять в систему сообщений.

Следующие шаги