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


Привязка триггера Базы данных Azure для MySQL для функций Azure

Привязки триггеров Базы данных Azure для MySQL отслеживают таблицу пользователя для изменений (вставок и обновлений) и вызывают функцию с обновленными данными строки.

Привязки триггеров базы данных Azure для MySQL используются az_func_updated_at и данные столбцов для отслеживания изменений в таблице пользователя. Таким образом, необходимо изменить структуру таблицы, чтобы разрешить отслеживание изменений в таблице MySQL, прежде чем использовать поддержку триггера. Отслеживание изменений в таблице можно включить с помощью следующего запроса. Например, включите его в Products таблице:

ALTER TABLE Products
ADD az_func_updated_at TIMESTAMP DEFAULT 
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

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

Общие сведения о функциях

При запуске функции триггера запускается два отдельных цикла: цикл опроса изменений и цикл продления аренды. Эти циклы выполняются непрерывно до остановки функции.

Привязка триггера Базы данных Azure для MySQL использует цикл опроса для проверки изменений. Цикл опроса активирует пользовательную функцию при обнаружении изменений. На высоком уровне цикл выглядит следующим образом:

while (true) {
    1. Get list of changes on table - up to a maximum number controlled by the MySql_Trigger_MaxBatchSize setting
    2. Trigger function with list of changes
    3. Wait for delay controlled by MySql_Trigger_PollingIntervalMs setting
}

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

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

Примечание.

В настоящее время управляемые удостоверения не поддерживаются для подключений между функциями Azure и Базой данных Azure для MySQL.

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

Дополнительные примеры триггера База данных Azure для MySQL доступны в репозитории GitHub.

Пример ссылается на Product класс и соответствующую таблицу базы данных:

namespace AzureMySqlSamples.Common
{
    public class Product
    {
        public int? ProductId { get; set; }

        public string Name { get; set; }

        public int Cost { get; set; }

        public override bool Equals(object obj)
        {
            if (obj is Product)
            {
                var that = obj as Product;
                return this.ProductId == that.ProductId && this.Name == that.Name && this.Cost == that.Cost;
            }
            return false;
        }
    }
DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Чтобы включить отслеживание изменений в базе данных, добавьте один столбец в таблицу:

ALTER TABLE <table name>  
ADD COLUMN az_func_updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP;

Триггер Базы данных Azure для MySQL привязывается к IReadOnlyList<MySqlChange<T>>объектам.MySqlChange Каждый объект имеет два свойства:

  • Item: измененный элемент. Тип элемента должен соответствовать схеме таблицы, как показано в ToDoItem классе.
  • Operation: значение из MySqlChangeOperation перечисления. Возможное значение — Update как для вставок, так и для обновлений.

В следующем примере показана функция C# , вызываемая при изменении в Product таблице:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.MySql;
using Microsoft.Extensions.Logging;
using AzureMySqlSamples.Common;

namespace AzureMySqlSamples.TriggerBindingSamples
{
        private static readonly Action<ILogger, string, Exception> _loggerMessage = LoggerMessage.Define<string>(LogLevel.Information, eventId: new EventId(0, "INFO"), formatString: "{Message}");

        [Function(nameof(ProductsTrigger))]
        public static void Run(
            [MySqlTrigger("Products", "MySqlConnectionString")]
            IReadOnlyList<MySqlChange<Product>> changes, FunctionContext context)
        {
            ILogger logger = context.GetLogger("ProductsTrigger");
            // The output is used to inspect the trigger binding parameter in test methods.
            foreach (MySqlChange<Product> change in changes)
            {
                Product product = change.Item;
                _loggerMessage(logger, $"Change operation: {change.Operation}", null);
                _loggerMessage(logger, $"Product Id: {product.ProductId}, Name: {product.Name}, Cost: {product.Cost}", null);
            }
        }
}

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

Дополнительные примеры триггера База данных Azure для MySQL доступны в репозитории GitHub.

Пример относится к классу Product , классу, MySqlChangeProductMySqlChangeOperation перечислению и соответствующей таблице базы данных.

В отдельном файле с именем Product.java:

package com.function.Common;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {
    @JsonProperty("ProductId")
    private int ProductId;
    @JsonProperty("Name")
    private String Name;
    @JsonProperty("Cost")
    private int Cost;

    public Product() {
    }

    public Product(int productId, String name, int cost) {
        ProductId = productId;
        Name = name;
        Cost = cost;
    }
}

В отдельном файле с именем MySqlChangeProduct.java:

package com.function.Common;

public class MySqlChangeProduct {
    private MySqlChangeOperation Operation;
    private Product Item;

    public MySqlChangeProduct() {
    }

    public MySqlChangeProduct(MySqlChangeOperation operation, Product item) {
        this.Operation = operation;
        this.Item = item;
    }
}

В отдельном файле с именем MySqlChangeOperation.java:

package com.function.Common;

import com.google.gson.annotations.SerializedName;

public enum MySqlChangeOperation {
    @SerializedName("0")
    Update
}
DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Чтобы включить отслеживание изменений в базе данных, добавьте в таблицу следующий столбец:

ALTER TABLE <table name>  
ADD COLUMN az_func_updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP;

Триггер Базы данных Azure для MySQL привязывается к MySqlChangeProduct[]массиву MySqlChangeProduct объектов. Каждый объект имеет два свойства:

  • item: измененный элемент. Тип элемента должен соответствовать схеме таблицы, как показано в Product классе.
  • operation: значение из MySqlChangeOperation перечисления. Возможное значение — Update как для вставок, так и для обновлений.

В следующем примере показана функция Java, вызываемая при изменении в Product таблице:

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 */

package com.function;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.mysql.annotation.MySqlTrigger;
import com.function.Common.MySqlChangeProduct;
import com.google.gson.Gson;

import java.util.logging.Level;

public class ProductsTrigger {
    @FunctionName("ProductsTrigger")
    public void run(
            @MySqlTrigger(
                name = "changes",
                tableName = "Products",
                connectionStringSetting = "MySqlConnectionString")
                MySqlChangeProduct[] changes,
            ExecutionContext context) {

        context.getLogger().log(Level.INFO, "MySql Changes: " + new Gson().toJson(changes));
    }
}

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

Дополнительные примеры триггера База данных Azure для MySQL доступны в репозитории GitHub.

Пример ссылается на таблицу Product базы данных:

DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Чтобы включить отслеживание изменений в базе данных, добавьте один столбец в таблицу:

ALTER TABLE <table name>  
ADD COLUMN az_func_updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP;

Триггер Базы данных Azure для MySQL привязывается к Productобъектам. Каждый объект имеет два свойства:

  • item: измененный элемент. Структура элемента соответствует схеме таблицы.
  • operation: возможное значение — Update как для вставок, так и для обновлений.

В следующем примере показана функция PowerShell, вызываемая при изменении в Product таблице.

В следующем примере приведены данные привязки в файле function.json:

{
    "bindings": [
      {
        "name": "changes",
        "type": "mysqlTrigger",
        "direction": "in",
        "tableName": "Products",
        "connectionStringSetting": "MySqlConnectionString"
      }
    ],
    "disabled": false
  }

В разделе "Конфигурация" описаны эти свойства.

Ниже приведен пример кода PowerShell для функции в файле run.ps1:

using namespace System.Net

param($changes)
# The output is used to inspect the trigger binding parameter in test methods.
# Use -Compress to remove new lines and spaces for testing purposes.
$changesJson = $changes | ConvertTo-Json -Compress
Write-Host "MySql Changes: $changesJson"

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

Дополнительные примеры триггера База данных Azure для MySQL доступны в репозитории GitHub.

Пример ссылается на таблицу Product базы данных:

DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Чтобы включить отслеживание изменений в базе данных, добавьте один столбец в таблицу:

ALTER TABLE <table name>  
ADD COLUMN az_func_updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP;

Триггер Базы данных Azure для MySQL привязывается к Changesмассиву объектов. Каждый объект имеет два свойства:

  • item: измененный элемент. Структура элемента соответствует схеме таблицы.
  • operation: возможное значение — Update как для вставок, так и для обновлений.

В следующем примере показана функция JavaScript, вызываемая при изменении в Product таблице.

В следующем примере приведены данные привязки в файле function.json:

{
    "bindings": [
      {
        "name": "changes",
        "type": "mysqlTrigger",
        "direction": "in",
        "tableName": "Products",
        "connectionStringSetting": "MySqlConnectionString",
      }
    ],
    "disabled": false
  }

В разделе "Конфигурация" описаны эти свойства.

В следующем примере приведен пример кода JavaScript для функции в index.js файле:

module.exports = async function (context, changes) {
    context.log(`MySql Changes: ${JSON.stringify(changes)}`)
}

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

Дополнительные примеры триггера База данных Azure для MySQL доступны в репозитории GitHub.

Пример ссылается на таблицу Product базы данных:

DROP TABLE IF EXISTS Products;

CREATE TABLE Products (
  ProductId int PRIMARY KEY,
  Name varchar(100) NULL,
  Cost int NULL
);

Чтобы включить отслеживание изменений в базе данных, добавьте один столбец в таблицу:

ALTER TABLE <table name>  
ADD COLUMN az_func_updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP;

Примечание.

Для Python необходимо использовать функции Azure версии 1.22.0b4.

Триггер Базы данных Azure для MySQL привязывается к переменной с именем Product, которая перечисляет объекты. Каждый объект имеет два свойства:

  • item: измененный элемент. Структура элемента соответствует схеме таблицы.
  • operation: возможное значение — Update как для вставок, так и для обновлений.

В следующем примере показана функция Python, вызываемая при изменении в Product таблице.

Ниже приведен пример кода Python для файла function_app.py:

import json
import logging
import azure.functions as func

app = func.FunctionApp()

# The function is triggered when a change (insert, update)
# is made to the Products table.
@app.function_name(name="ProductsTrigger")
@app.mysql_trigger(arg_name="products",
table_name="Products",
connection_string_setting="MySqlConnectionString")

def products_trigger(products: str) -> None:
logging.info("MySQL Changes: %s", json.loads(products))

Атрибуты

Свойство атрибута Описание
TableName Обязательный. Имя таблицы, отслеживаемой триггером.
ConnectionStringSetting Обязательный. Имя параметра приложения, содержащего строку подключения для базы данных, которая содержит таблицу, отслеживаемую для изменений. Имя параметра строки подключения соответствует параметру приложения (в local.settings.json для локальной разработки), который содержит строку подключения к Базе данных Azure для MySQL.
LeasesTableName Необязательно. Имя таблицы для хранения аренд. Если он не указан, это имя Leases_{FunctionId}_{TableId}.

Заметки

В библиотеке среды выполнения функций Java используйте заметку @MySQLTrigger о параметрах, значения которых будут поступать из Базы данных Azure для MySQL. Эта заметка поддерживает следующие элементы:

Элемент Описание
name Обязательный. Имя параметра, к которому привязывается триггер.
tableName Обязательный. Имя таблицы, отслеживаемой триггером.
connectionStringSetting Обязательный. Имя параметра приложения, содержащего строку подключения для базы данных, которая содержит таблицу, отслеживаемую для изменений. Имя параметра строки подключения соответствует параметру приложения (в local.settings.json для локальной разработки), который содержит строку подключения к Базе данных Azure для MySQL.
LeasesTableName Необязательно. Имя таблицы для хранения аренд. Если он не указан, это имя Leases_{FunctionId}_{TableId}.

Настройка

В следующей таблице описываются свойства конфигурации привязки, заданные в файле function.json:

Недвижимость Описание
name Обязательный. Имя параметра, к которому привязывается триггер.
type Обязательный. Должен иметь значениеMysqlTrigger.
direction Обязательный. Должен иметь значениеin.
tableName Обязательный. Имя таблицы, отслеживаемой триггером.
connectionStringSetting Обязательный. Имя параметра приложения, содержащего строку подключения для базы данных, которая содержит таблицу, отслеживаемую для изменений. Имя параметра строки подключения соответствует параметру приложения (в local.settings.json для локальной разработки), который содержит строку подключения к Базе данных Azure для MySQL.
LeasesTableName Необязательно. Имя таблицы для хранения аренд. Если он не указан, это имя Leases_{FunctionId}_{TableId}.

Дополнительные настройки

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

host.json

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

Параметр По умолчанию. Описание
MaxBatchSize 100 Максимальное количество изменений, обработанных с каждой итерацией цикла триггера перед отправкой в триггерную функцию.
PollingIntervalMs 1000 Задержка в миллисекундах между обработкой каждого пакета изменений. (1000 мс составляет 1 секунду.)
MaxChangesPerWorker 1000 Верхний предел числа ожидающих изменений в таблице пользователей, разрешенных для рабочей роли приложения. Если количество изменений превышает это ограничение, это может привести к горизонтальному масштабированию. Этот параметр применяется только для приложений-функций Azure с включенным масштабированием на основе среды выполнения.

Пример файла host.json

Ниже приведен пример host.json файла с необязательными параметрами:

{
  "version": "2.0",
  "extensions": {
      "MySql": {
        "MaxBatchSize": 300,
        "PollingIntervalMs": 1000,
        "MaxChangesPerWorker": 100
      }
  },
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    },
    "logLevel": {
      "default": "Trace"
    }
  }
}

local.setting.json

Файл local.settings.json хранит параметры и параметры приложения, используемые локальными средствами разработки. Параметры в файле local.settings.json используются только при локальном выполнении проекта. При публикации проекта в Azure обязательно добавьте все необходимые параметры в параметры приложения для приложения-функции.

Внимание

Так как файл local.settings.json может содержать секреты, такие как строки подключения, никогда не следует хранить его в удаленном репозитории. Средства, поддерживающие Функции Azure, предоставляют способы синхронизации параметров в файле local.settings.json с параметрами приложения в приложении-функции, в котором развертывается проект.

Параметр По умолчанию. Описание
MySql_Trigger_BatchSize 100 Максимальное количество изменений, обработанных с каждой итерацией цикла триггера перед отправкой в триггерную функцию.
MySql_Trigger_PollingIntervalMs 1000 Задержка в миллисекундах между обработкой каждого пакета изменений. (1000 мс составляет 1 секунду.)
MySql_Trigger_MaxChangesPerWorker 1000 Верхний предел числа ожидающих изменений в таблице пользователей, разрешенных для рабочей роли приложения. Если количество изменений превышает это ограничение, это может привести к горизонтальному масштабированию. Этот параметр применяется только для приложений-функций Azure с включенным масштабированием на основе среды выполнения.

Пример файла local.settings.json

Ниже приведен пример файла local.settings.json с дополнительными параметрами:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "MySqlConnectionString": "",
    "MySql_Trigger_MaxBatchSize": 300,
    "MySql_Trigger_PollingIntervalMs": 1000,
    "MySql_Trigger_MaxChangesPerWorker": 100
  }
}

Настройка отслеживания изменений (обязательно)

Настройка отслеживания изменений для использования с триггером Базы данных Azure для MySQL требует добавления столбца в таблицу с помощью функции. Эти действия можно выполнить из любого средства MySQL, поддерживающего выполнение запросов, включая Visual Studio Code или Azure Data Studio.

Привязки триггеров базы данных Azure для MySQL используются az_func_updated_at и данные столбцов для отслеживания изменений в таблице пользователя. Таким образом, необходимо изменить структуру таблицы, чтобы разрешить отслеживание изменений в таблице MySQL, прежде чем использовать поддержку триггера. Отслеживание изменений в таблице можно включить с помощью следующего запроса. Например, включите его в Products таблице:

ALTER TABLE Products;
ADD az_func_updated_at 
TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
ON UPDATE CURRENT_TIMESTAMP;

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

Включение масштабирования на основе среды выполнения

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

  1. На портале Azure в приложении-функции выберите "Конфигурация".

  2. На вкладке "Параметры среды выполнения функции " для мониторинга масштабирования среды выполнения нажмите кнопку "Вкл.".

    Снимок экрана: область портала Azure для включения масштабирования среды выполнения.

Поддержка повторных попыток

Повторные попытки запуска

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

Повторные попытки исключения функций

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

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