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


Рекомендации по оптимизации кода и инфраструктуры

Применяется к этой рекомендации по повышению эффективности производительности Azure Well-Architected Framework:

PE:07 Оптимизация кода и инфраструктуры. Используйте код, который является производительным, и убедитесь, что он выгружает обязанности на платформу. Используйте код и инфраструктуру только для их основных целей и только при необходимости.

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

Определения

Термин Определение
Параллелизм Если одновременно выполняется несколько задач или процессов, но не обязательно в одно и то же время.
Архитектура ЦП. Компоненты и принципы, влияющие на работу компьютера.
Сжатие данных Уменьшение размера файлов путем минимизации избыточных данных.
Куча Область в памяти, используемая для выделения памяти среды выполнения.
Утечки памяти Если рабочей нагрузке не удается освободить выделенную память после того, как память больше не нужна.
Parallelism При одновременном выполнении нескольких задач или процессов.

Ключевые стратегии проектирования

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

Оптимизация производительности кода

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

Инструментирование кода

Инструментирование кода относится к практике добавления фрагментов кода или библиотек в код, который собирает данные и отслеживает производительность кода во время выполнения. Инструментирование кода позволяет разработчикам собирать сведения о ключевых метриках, таких как потребление ресурсов (ЦП, использование памяти) и время выполнения. Инструментируя код, разработчики могут получать аналитические сведения о горячих путях кода, выявлять узкие места производительности и оптимизировать код для повышения производительности.

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

Компромисс. Средства мониторинга кода, скорее всего, увеличат затраты.

Определение горячих путей

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

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

  • Измерение производительности. Используйте средства профилирования или платформы тестирования производительности для измерения времени выполнения и потребления ресурсов различными путями кода. Это помогает выявить узкие места и области для улучшения.

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

Оптимизация логики кода

Оптимизация логики кода — это уточнение структуры и структуры кода для выполнения задач с меньшим количеством ресурсов. Улучшенная логика сокращает ненужные операции. Это обеспечивает более быстрое выполнение при меньшем потреблении ресурсов. Следует удалить все ненужные операции в пути кода, которые могут повлиять на производительность. Назначайте приоритет оптимизации горячих путей, чтобы добиться наибольшего повышения производительности. Чтобы оптимизировать логику кода, рассмотрите следующие стратегии:

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

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

  • Оптимизация циклов и условных условий. Анализируйте циклы и условные выражения в коде и выявляйте ненужные итерации или условия, которые можно устранить. Упрощение и оптимизация этих структур может повысить производительность кода. Сведите к минимуму вызовы функций в циклах и исключите избыточные вычисления. Рассмотрите возможность перемещения вычислений за пределы цикла или с помощью раскрутки цикла.

  • Сокращение ненужной обработки данных. Проверьте код на наличие ненужных операций обработки данных, таких как избыточные вычисления или преобразования. Исключите эти ненужные операции, чтобы повысить эффективность кода.

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

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

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

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

  • Используйте оптимизированные для производительности пакеты SDK и библиотеки. Используйте собственные пакеты SDK или библиотеки, оптимизированные для производительности. Собственные пакеты SDK предназначены для взаимодействия со службами и ресурсами на платформе или в рамках платформы. Например, пакеты SDK, ориентированные на облако, лучше работают с плоскостями данных облачных служб, чем с пользовательским доступом к API. Пакеты SDK отлично обрабатывают сетевые запросы и оптимизируют взаимодействие. Оптимизированные для производительности библиотеки, такие как Math.NET, содержат оптимизированные для производительности функции. При соответствующем применении функций можно повысить производительность рабочей нагрузки.

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

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

Компромиссы:

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

Оптимизация управления памятью

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

Проблемы с памятью отладки. Дампы памяти — это моментальные снимки памяти приложения. Они фиксируют состояние памяти приложения в определенный момент времени. Дампы памяти позволяют выполнять ретроспективный анализ проблем, связанных с памятью. Выберите соответствующий тип дампа памяти в зависимости от характера проблемы, которую вы пытаетесь диагностировать, и доступных ресурсов. Следует использовать миниатюрные дампы для обычной отладки и полные дампы для сложных, критически важных проблем. Эта стратегия обеспечивает баланс между использованием ресурсов и возможностями диагностики. Многие службы размещения кода поддерживают отладку памяти. Следует отдавать предпочтение службам, поддерживающим анализ памяти, а не тем службам, которые этого не делать. Ниже приведены основные шаги по отладке проблем с памятью.

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

  2. Анализ дампов памяти. После сбора дампов памяти проанализируйте их. В проверке этих дампов можно использовать множество средств, например WinDbg для приложений Windows или GDB для систем под управлением Unix.

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

  4. Исправление и тестирование. При выявлении проблемного кода сосредоточьтесь на устранении проблем с памятью. Решения могут включать в себя правильное освобождение памяти, оптимизацию структур данных или переоценку методов управления памятью. Убедитесь, что ваши решения проходят тщательное тестирование, чтобы убедиться в их эффективности.

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

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

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

Кэши хранят часто используемые данные рядом с процессором, что повышает производительность. При минимизации выделения памяти уменьшается количество состязаний за пространство кэша, что позволяет эффективно использовать кэш. Большое количество выделений памяти может снизить производительность приложения и привести к ошибкам. Другие способы свести к минимуму выделение памяти:

  • Локальные переменные. Используйте локальные переменные вместо глобальных переменных, чтобы свести к минимуму потребление памяти.

  • Отложенная инициализация. Реализуйте отложенную инициализацию, чтобы отложить создание объектов или ресурсов до тех пор, пока они не понадобятся.

  • Буферы. Эффективно управляйте буферами, чтобы избежать выделения больших буферов памяти.

  • Объединение объектов в пул. Рекомендуется использовать пулы объектов для повторного использования больших объектов вместо выделения и освобождения их.

Дополнительные сведения см. в разделах Сокращение выделения памяти и Куча больших объектов в системах Windows.

Использование параллелизма и параллелизма

Использование параллелизма и параллелизма предполагает одновременное или перекрывающееся выполнение нескольких задач или процессов для эффективного использования вычислительных ресурсов. Эти методы повышают общую пропускную способность и количество задач, которые может обрабатывать рабочая нагрузка. При параллельном или параллельном выполнении задач это сокращает время выполнения приложения, уменьшает задержку и увеличивает время отклика. Параллелизм и параллелизм обеспечивают эффективное использование вычислительных ресурсов, таких как ядра ЦП или распределенные системы. Параллелизм и параллелизм эффективно распределяют рабочую нагрузку между вычислительными ресурсами.

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

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

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

    Существует множество асинхронных методов и шаблонов программирования в зависимости от языка программирования и платформы. Одним из распространенных подходов является использование асинхронных ключевых слов и конструкций, таких как и await, в таких языках, как async C#. С помощью этих ключевых слов можно определить асинхронные методы. Для трафика HTTP рекомендуется использовать шаблон асинхронных Request-Reply.

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

  • Очереди. Очередь — это буфер хранилища, расположенный между запрашивающим компонентом (производителем) и компонентом обработки (потребителем) рабочей нагрузки. Для одной очереди может быть несколько потребителей. По мере увеличения задач следует масштабировать потребителей в соответствии с потребностями. Производитель помещает задачи в очередь. Очередь хранит задачи до тех пор, пока потребитель не овьет емкости. Очередь часто является лучшим способом передачи работы в службу обработки, которая испытывает пик спроса. Дополнительные сведения см. в разделах Шаблон выравнивания нагрузки на основе очередей и Очереди хранилища и Очереди служебной шины.

Использование пула соединений

Пул подключений — это практика повторного использования установленных подключения к базе данных вместо создания нового подключения для каждого запроса. Установка подключения к базе данных может оказаться затратной. Необходимо создать сетевое подключение с проверкой подлинности к удаленному серверу базы данных. Подключения к базе данных особенно дороги для приложений, которые часто открывают новые подключения. Пул подключений повторно использует существующие подключения и исключает затраты на открытие нового подключения для каждого запроса. Использование пулов подключений сокращает задержку подключения и обеспечивает высокую пропускную способность базы данных (количество транзакций в секунду) на сервере. Следует выбрать размер пула, который может обрабатывать больше подключений, чем у вас сейчас. Цель состоит в том, чтобы пул подключений быстро обрабатывал новые входящие запросы.

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

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

Риск. Пул подключений может привести к фрагментации пулов и снижению производительности.

Оптимизация фоновых заданий

Для многих приложений требуются фоновые задачи, которые выполняются независимо от пользовательского интерфейса. Приложение может запустить задание и продолжить обработку интерактивных запросов от пользователей. Примеры фоновых заданий включают пакетные задания, задачи с интенсивным использованием процессора и длительные процессы, такие как рабочие процессы. Фоновые задачи не должны блокировать приложение или вызывать несоответствия из-за отложенной операции, когда система находится под нагрузкой. Чтобы повысить производительность, можно масштабировать вычислительные экземпляры, на которых размещаются фоновые задачи. Дополнительные сведения см. в разделах Фоновые задания и Рекомендации по масштабированию и производительности.

Оптимизация производительности инфраструктуры

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

Добавление ограничений на использование. Вы можете реализовать ограничения использования для некоторых компонентов рабочей нагрузки. Например, чтобы удалить нестабильные модули pod, можно определить ограничения ЦП и памяти pod в Служба Azure Kubernetes (AKS). Для оптимизации производительности можно определить ограничения памяти на виртуальных машинах Java.

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

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

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

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

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

  • Сетевые протоколы. Обновление до современных протоколов, таких как HTTP/2, которые позволяют отправлять несколько запросов через одно подключение. Современные протоколы сокращают затраты на установку новых подключений.

    Компромисс. Современные протоколы могут исключить старые клиенты.

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

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

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

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

  • Сжатие данных. Сжимайте и объединяйте содержимое HTTP и данные файлов , чтобы обеспечить быструю передачу между клиентами и серверами. Сжатие сжимает данные, возвращаемые страницей или API, и отправляет обратно в браузер или клиентское приложение. Сжатие оптимизирует сетевой трафик, что может ускорить взаимодействие с приложениями.

    Компромисс. Сжатие добавляет обработку на стороне сервера и клиента. Приложение должно сжимать, отправлять и распаковывать данные. Многоадресная рассылка или обмен данными с несколькими получателями может создать издержки на распаковку. Необходимо протестировать и измерить различия производительности до и после реализации сжатия данных, чтобы определить, подходит ли оно для вашей рабочей нагрузки. Дополнительные сведения см. в разделе Сжатие ответов в ASP.NET Core.

Упрощение azure

Код инструментирования. Azure Monitor Application Insights поддерживает автоматическое инструментирование (автоинструментация) и инструментирование кода приложения вручную. Автоинструментация позволяет выполнять сбор данных телеметрии без касания кода приложения. Инструментирование вручную требует внесения изменений в код для реализации API Application Insights или OpenTelemetry. Вы можете использовать Application Insights Profiler для оптимизации горячих путей.

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

Оптимизация управления памятью. Используйте функцию интеллектуального обнаружения Application Insights для анализа потребления памяти и выявления и устранения утечек памяти.

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

Использование параллелизма и параллелизма. Разные службы Azure предоставляют уникальную поддержку параллелизма, например Azure Cosmos DB, Функции Azure и хранилище BLOB-объектов. Для параллелизма службы AKS поддерживают развертывание контейнерных приложений, что улучшает параллельную обработку.

пакетная служба Azure — это облачная служба планирования заданий, которую можно использовать для реализации параллельных и высокопроизводительных вычислений без необходимости настройки инфраструктуры. Дополнительные сведения см. в разделе Фоновые задания.

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

Для асинхронного программирования используйте масштабируемые службы очередей, такие как хранилище очередей Azure и Служебная шина Azure, чтобы упростить асинхронное программирование. Задачи можно ставить в очередь и самостоятельно обрабатывать их. Для поддержки асинхронных операций Azure Marketplace предлагает сторонние очереди и средства, которые можно интегрировать со службами Azure.

Контрольный список для оптимизации производительности

Ознакомьтесь с полным набором рекомендаций.