Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
Azure Cosmos DB обеспечивает интегрированное с языком, транзакционное выполнение JavaScript. При использовании API для NoSQL в Azure Cosmos DB можно создавать хранимые процедуры, триггеры и определяемые пользователем функции (ОПРЕДЕЛЯЕМЫЕ пользователем функции) на языке JavaScript. Логику можно написать в JavaScript, которая выполняется внутри ядра СУБД. Вы можете создавать и выполнять триггеры, хранимые процедуры и определяемые пользователем функции с помощью портала Azure, интегрированного API для запросов на языке JavaScript в Azure Cosmos DB или клиентских SDK для NoSQL в Azure Cosmos DB.
Преимущества использования программирования на стороне сервера
Написание хранимых процедур, триггеров и пользовательских функций (UDF) в JavaScript позволяет создавать многофункциональные приложения, которые обладают следующими преимуществами.
Процедурная логика: JavaScript — это высокоуровневый язык программирования, предоставляющий широкий и знакомый интерфейс для выражения бизнес-логики. Вы можете выполнять последовательность сложных операций с данными.
Атомарные транзакции. Операции с базой данных, выполняемые в одной хранимой процедуре или триггере, являются атомарными. Атомарная функциональность позволяет приложению объединить связанные операции в один пакет, чтобы либо все выполняются успешно, либо не выполняется ни одна.
Производительность. Данные JSON изначально сопоставлены с системой типов языка JavaScript. Это сопоставление позволяет выполнять ряд оптимизаций, таких как отложенная материализация документов JSON в пуле буферов и предоставление их по требованию исполняемому коду. Существуют и другие преимущества производительности, связанные с перемещением бизнес-логики в базу данных, включая:
Пакетная обработка: Вы можете группировать операции, такие как вставка, и отправлять их единым пакетом. Затраты на задержку сетевого трафика и накладные расходы, связанные с созданием отдельных операций, значительно сокращаются.
Предварительная компиляция: хранимые процедуры, триггеры и функции, заданные пользователем, неявно предварительно компилируются в байт-код, чтобы избежать затрат на компиляцию во время каждого вызова скрипта. Благодаря предварительной компиляции вызов хранимых процедур происходит быстро и имеет малое воздействие на ресурсы.
Последовательность. Иногда операциям нужен механизм триггера, который может выполнять одно обновление или несколько дополнительных обновлений данных. Помимо атомарности, выполнение на стороне сервера также дает преимущество в отношении производительности.
Инкапсуляция. Хранимые процедуры могут быть использованы для группировки логических алгоритмов в одном месте. Инкапсуляция добавляет уровень абстракции поверх данных, что позволяет вам развивать свои приложения независимо от данных. Этот уровень абстракции полезен, когда данные не содержат схем, и вам не нужно внедрять дополнительную логику непосредственно в ваше приложение. Абстракция позволяет обеспечить безопасность данных, упрощая доступ из скриптов.
Совет
Хранимые процедуры лучше всего подходят для операций с интенсивной записью, требующих транзакции, охватывающей значение ключа секции. При принятии решения об использовании хранимых процедур следует оптимизировать инкапсуляцию так, чтобы охватить максимальное количество записей. Как правило, хранимые процедуры не являются наиболее эффективным средством для выполнения большого количества операций чтения или запроса, поэтому использование хранимых процедур для пакетной обработки большого количества операций чтения для возврата клиенту не даст желаемого преимущества. Для повышения производительности эти операции с большим объемом чтения должны выполняться на стороне клиента с помощью пакета SDK Azure Cosmos DB.
Использование хранимых процедур с строгой согласованностью не рекомендуется, так как мутации являются локальными.
Примечание.
Функции JavaScript на стороне сервера, включая хранимые процедуры, триггеры и определяемые пользователем функции, не поддерживают импорт модулей.
Транзакции
Транзакции в типичной базе данных могут быть определены как последовательность операций, выполняемых в одной логической единице работы. Каждая транзакция предоставляет гарантию соблюдения принципа ACID. Широко известный акроним ACID обозначает четыре свойства: Atomicity (атомарность), Consistency (согласованность), Isolation (изолированность) и Durability (устойчивость).
Атомарность гарантирует, что все операции в транзакции рассматриваются как единое целое, и либо все они фиксируются, либо ни одна из них не фиксируется.
Согласованность гарантирует, что данные между транзакциями всегда находятся в допустимом состоянии.
Изоляция гарантирует, что две транзакции не вмешиваются друг в друга, многие коммерческие системы обеспечивают несколько уровней изоляции, которые можно использовать в зависимости от потребностей приложения.
Устойчивость гарантирует, что любое зафиксированное в базе данных изменение всегда будет в ней присутствовать.
В Azure Cosmos DB среда выполнения JavaScript включена в ядро базы данных. Следовательно, запросы в хранимых процедурах и триггерах выполняются в том же пространстве базы данных сессии. Эта возможность позволяет Azure Cosmos DB соблюдать принцип ACID для всех операций, которые являются частью хранимой процедуры или триггера. Примеры см. в статье Как реализовать транзакции.
Совет
Для поддержки транзакций в Azure Cosmos DB для NoSQL можно также реализовать пакет транзакций с помощью предпочтительного клиентского пакета SDK. Дополнительные сведения см. в разделе "Транзакционные пакетные операции" в Azure Cosmos DB для NoSQL.
Область транзакции
Хранимые процедуры связаны с контейнером Azure Cosmos DB и выполнение хранимой процедуры ограничивается ключом логического раздела. Хранимые процедуры во время выполнения должны использовать значение ключа логической секции, определяющее логическую секцию для области выполнения транзакции. Дополнительные сведения см. в статье Секционирование в Azure Cosmos DB.
Фиксация и откат транзакций
Транзакции изначально интегрированы в модель программирования JavaScript в Azure Cosmos DB. В функции JavaScript все операции автоматически встроены в одну транзакцию. Если логика JavaScript в хранимой процедуре завершается без каких-либо исключений, то все операции транзакции передаются в базу данных. Такие операторы как BEGIN TRANSACTION
и COMMIT TRANSACTION
(знакомые по реляционным базам данных) неявно присутствуют в Azure Cosmos DB. Если в сценарии есть исключения, среда выполнения JavaScript в Azure Cosmos DB откатит всю транзакцию. Таким образом, вызов исключения фактически эквивалентен ROLLBACK TRANSACTION
в базе данных Azure Cosmos DB.
Согласованность данных
Хранимые процедуры и триггеры всегда выполняются на первичной реплике контейнера Azure Cosmos DB. Эта возможность гарантирует, что операции чтения в хранимых процедурах обеспечивают сильную согласованность. Запросы с использованием пользовательских функций могут выполняться на первичной либо на любой вторичной реплике. Хранимые процедуры и триггеры предназначены для поддержки транзакционных записей. В то же время логика только для чтения лучше всего реализована как логика на стороне приложения и запросы с помощью SDK Azure Cosmos DB для NoSQL, которые помогут вам обеспечить пропускную способность базы данных.
Совет
В запросах, выполняемых в хранимой процедуре или триггере, могут не отражаться изменения элементов, внесенные в той же транзакции скрипта. Это относится как к запросам SQL, таким как getContent().getCollection().queryDocuments()
, так и к запросам встроенного языка, таким как getContext().getCollection().filter()
.
Ограниченное выполнение
Все операции Azure Cosmos DB должны завершиться в течение указанного времени ожидания. Время ожидания для хранимых процедур составляет 5 секунд. Это ограничение применяется к функциям JavaScript — хранимым процедурам, триггерам и пользовательским функциям. Если операция не завершена в течение этого периода времени, транзакция откатится.
Вы можете или завершить функции JavaScript за определенный период времени или поддерживать модель продолжения работы для пакетной или поэтапной обработки. Чтобы упростить разработку хранимых процедур и триггеров для обработки ограничений времени, все функции в контейнере Azure Cosmos DB (например, создание, чтение, обновление и удаление элементов) возвращают логическое значение, представляющее, будет ли эта операция завершена. Если это значение равно false, это означает, что процедура должна быть завершена, так как скрипт занимает больше времени или подготовленную пропускную способность, чем настроенное значение. Операции, поставленные в очередь до первой непринятой операции хранения, гарантированно завершаются, если хранимая процедура завершится вовремя и не поставит в очередь больше запросов. Таким образом, операции должны формировать очередь поочередно, используя соглашение обратного вызова JavaScript для управления потоком выполнения скрипта. Так как скрипты выполняются в серверной среде, они строго управляются. Сценарии, которые неоднократно нарушают границы выполнения, могут получить метку о неактивности и не могут выполняться. Их необходимо создать заново для соблюдения границ выполнения.
Функции JavaScript также подлежат выделенной пропускной способности. Функции JavaScript потенциально могут использовать большое количество блоков запросов в течение короткого времени и могут быть ограничены по скорости, если достигнут предела пропускной способности. Важно отметить, что скрипты потребляют дополнительную пропускную способность, помимо той, что используется на выполнение операций с базой данных, хотя эти операции обходятся немного дешевле, чем те же операции, выполненные на клиенте.
Триггеры
Azure Cosmos DB поддерживает два типа триггеров:
Предварительные триггеры
Azure Cosmos DB предоставляет триггеры, которые можно вызвать, выполнив операцию с элементом Azure Cosmos DB. Например, можно указать предварительный триггер при создании элемента. В этом случае предтриггер сработает до создания элемента. Предварительные триггеры не могут иметь входные параметры. При необходимости объект запроса можно использовать для обновления текста документа из исходного запроса. При регистрации триггеров пользователи могут указать операции, с которыми они запускаются. Если триггер был создан с использованием TriggerOperation.Create
, это означает, что его использование в операции замены не разрешается. Примеры см. в статье Как записать триггеры.
Пост-триггеры
Аналогично предварительным триггерам, пост-триггеры также связаны с операцией в элементе Azure Cosmos DB и не требуют входных параметров. Они запускаются после завершения операции и получают доступ к ответному сообщению, которое отправляется клиенту. Примеры см. в статье Как записать триггеры.
Примечание.
Зарегистрированные триггеры не запускаются автоматически при выполнении соответствующих операций (create, delete, replace или update). При выполнении этих операций их приходится вызывать явным образом. Дополнительные сведения см. в статье о запуске триггеров.
Пользовательские функции
Определяемые пользователем функции используются для расширения синтаксиса языка запросов NOSQL и реализации пользовательской бизнес-логики. Их можно вызвать только внутри запросов. Определяемые пользователем функции не имеют доступа к объекту контекста и предназначены для использования в качестве JavaScript только для вычислений. Таким образом, определяемые пользователем функции могут запускаться на дополнительных репликах.
API запросов, интегрированное непосредственно в язык JavaScript
Помимо выдачи запросов с помощью синтаксиса запросов API для NoSQL, пакет SDK на стороне сервера позволяет выполнять запросы с помощью интерфейса JavaScript без каких-либо знаний о SQL. API запросов JavaScript позволяет программно создавать запросы, передавая предикатные функции в последовательность вызовов функций. Запросы анализируются средой выполнения JavaScript и эффективно выполняются в Azure Cosmos DB. Дополнительные сведения о поддержке API запросов JavaScript см. в статье Working with JavaScript language integrated query API (Как работать с API запросов с интегрированным языком JavaScript). Примеры см. в статье How to write stored procedures and triggers using JavaScript Query API (Как записывать хранимые процедуры и триггеры в Azure Cosmos DB с помощью API запросов JavaScript).
Следующие шаги
Дополнительные сведения о том, как записать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB, см. в этих статьях:
Как писать хранимые процедуры, триггеры и определяемые пользователем функции
Как использовать хранимые процедуры, триггеры и функции, определяемые пользователем
Working with JavaScript language integrated query API (Как работать с API запросов с интегрированным языком JavaScript)
Пытаетесь планировать ресурсы для миграции в Azure Cosmos DB? Для планирования ресурсов можно использовать сведения об имеющемся кластере базы данных.
- Если вам известно только количество виртуальных ядер и серверов в существующем кластере баз данных, см. сведения о оценке единиц запросов на основе виртуальных ядер (vCores) или виртуальных процессоров (vCPUs).
- Если вам известна стандартная частота запросов для текущей рабочей нагрузки базы данных, ознакомьтесь со статьей о расчете единиц запросов с помощью планировщика ресурсов Azure Cosmos DB