Sdílet prostřednictvím


Vazba triggeru Azure Database for MySQL pro Azure Functions

Aktivační vazby triggeru Azure Database for MySQL monitorují tabulku uživatelů pro změny (vkládání a aktualizace) a vyvolávají funkci s aktualizovanými daty řádků.

Vazby triggeru Azure Database for MySQL používají az_func_updated_at a data sloupců k monitorování změn v tabulce uživatelů. Proto je potřeba před použitím podpory triggeru změnit strukturu tabulky tak, aby umožňovala sledování změn v tabulce MySQL. Sledování změn v tabulce můžete povolit pomocí následujícího dotazu. Můžete ji například povolit v Products tabulce:

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

Tabulka pro zapůjčení obsahuje všechny sloupce, které odpovídají primárnímu klíči z tabulky uživatelů, a tři další sloupce: az_func_AttemptCount, az_func_LeaseExpirationTimea az_func_SyncCompletedTime. Pokud některý ze sloupců primárního klíče má stejný název, výsledkem je chybová zpráva, která obsahuje konflikty. V tomto případě je potřeba přejmenovat sloupce primárního klíče, aby trigger fungoval.

Přehled funkcí

Při spuštění funkce triggeru zahájí dvě samostatné smyčky: smyčku dotazování změn a smyčku prodlužování zapůjčení. Tyto smyčky běží nepřetržitě, dokud se funkce nezastaví.

Vazba triggeru Azure Database for MySQL používá smyčku dotazování ke kontrole změn. Smyčka dotazování aktivuje uživatelskou funkci, když zjistí změny. Na nejvyšší úrovni smyčka vypadá jako v tomto příkladu:

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
}

Změny se zpracovávají v pořadí, v jakém se provádějí. Nejstarší změny se zpracovávají jako první. Zvažte tyto body týkající se zpracování změn:

  • Pokud dojde ke změnám ve více řádcích najednou, přesné pořadí, ve kterém se do funkce odesílají, je založeno na vzestupném pořadí sloupců a sloupců primárního az_func_updated_at klíče.
  • Změny se zařadí do dávek pro řádek. Pokud mezi jednotlivými iteracemi smyčky dojde k více změnám, považuje se za něj pouze nejnovější položka změny, která pro tento řádek existuje.

Poznámka:

Spravované identity se v současné době nepodporují pro připojení mezi Službami Azure Functions a Azure Database for MySQL.

Příklad využití

Další ukázky pro trigger Azure Database for MySQL jsou k dispozici v úložišti GitHub.

Příklad odkazuje na Product třídu a odpovídající tabulku databáze:

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
);

Sledování změn v databázi povolíte přidáním jednoho sloupce do tabulky:

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

Aktivační událost Azure Database for MySQL je svázána se seznamem IReadOnlyList<MySqlChange<T>>MySqlChange objektů. Každý objekt má dvě vlastnosti:

  • Item: Položka, která byla změněna. Typ položky by měl následovat podle schématu tabulky, jak je vidět ve ToDoItem třídě.
  • Operation: Hodnota z výčtu MySqlChangeOperation . Možnou hodnotou je Update vložení i aktualizace.

Následující příklad ukazuje funkci jazyka C# , která se vyvolá, když dojde ke změnám v Product tabulce:

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);
            }
        }
}

Příklad využití

Další ukázky pro trigger Azure Database for MySQL jsou k dispozici v úložišti GitHub.

Příklad odkazuje na Product třídu, MySqlChangeProduct třídu, MySqlChangeOperation výčet a odpovídající tabulku databáze.

V samostatném souboru s názvem 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;
    }
}

V samostatném souboru s názvem 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;
    }
}

V samostatném souboru s názvem 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
);

Sledování změn v databázi povolíte přidáním následujícího sloupce do tabulky:

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

Aktivační událost Azure Database for MySQL je svázaná s MySqlChangeProduct[]polem MySqlChangeProduct objektů. Každý objekt má dvě vlastnosti:

  • item: Položka, která byla změněna. Typ položky by měl následovat podle schématu tabulky, jak je vidět ve Product třídě.
  • operation: Hodnota z výčtu MySqlChangeOperation . Možnou hodnotou je Update vložení i aktualizace.

Následující příklad ukazuje funkci Java, která se vyvolá při změnách v Product tabulce:

/**
 * 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));
    }
}

Příklad využití

Další ukázky pro trigger Azure Database for MySQL jsou k dispozici v úložišti GitHub.

Příklad odkazuje na Product tabulku databáze:

DROP TABLE IF EXISTS Products;

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

Sledování změn v databázi povolíte přidáním jednoho sloupce do tabulky:

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

Aktivační událost Azure Database for MySQL je svázána se seznamem Productobjektů. Každý objekt má dvě vlastnosti:

  • item: Položka, která byla změněna. Struktura položky se řídí schématem tabulky.
  • operation: Možná hodnota je Update pro vložení i aktualizace.

Následující příklad ukazuje funkci PowerShellu, která se vyvolá, když dojde ke změnám Product v tabulce.

Následující příklad je svázání dat v souboru function.json:

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

V části Konfigurace jsou vysvětleny tyto vlastnosti.

Následující příklad je ukázkový kód PowerShellu pro funkci v souboru 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"

Příklad využití

Další ukázky pro trigger Azure Database for MySQL jsou k dispozici v úložišti GitHub.

Příklad odkazuje na Product tabulku databáze:

DROP TABLE IF EXISTS Products;

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

Sledování změn v databázi povolíte přidáním jednoho sloupce do tabulky:

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

Aktivační událost Azure Database for MySQL je svázaná s Changespolem objektů. Každý objekt má dvě vlastnosti:

  • item: Položka, která byla změněna. Struktura položky se řídí schématem tabulky.
  • operation: Možná hodnota je Update pro vložení i aktualizace.

Následující příklad ukazuje funkci JavaScriptu, která se vyvolá při změnách v Product tabulce.

Následující příklad je svázání dat v souboru function.json:

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

V části Konfigurace jsou vysvětleny tyto vlastnosti.

Následující příklad je ukázkový kód JavaScriptu pro funkci v index.js souboru:

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

Příklad využití

Další ukázky pro trigger Azure Database for MySQL jsou k dispozici v úložišti GitHub.

Příklad odkazuje na Product tabulku databáze:

DROP TABLE IF EXISTS Products;

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

Sledování změn v databázi povolíte přidáním jednoho sloupce do tabulky:

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

Poznámka:

Musíte použít Azure Functions verze 1.22.0b4 pro Python.

Trigger Azure Database for MySQL vytvoří vazbu na proměnnou s názvem Product, která vypíše objekty. Každý objekt má dvě vlastnosti:

  • item: Položka, která byla změněna. Struktura položky se řídí schématem tabulky.
  • operation: Možná hodnota je Update pro vložení i aktualizace.

Následující příklad ukazuje funkci Pythonu, která se vyvolá, když dojde ke změnám Product v tabulce.

Následující příklad je ukázkový kód Pythonu pro soubor 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))

Atributy

Vlastnost atributu Popis
TableName Povinný: Název tabulky, kterou trigger monitoruje.
ConnectionStringSetting Povinný: Název nastavení aplikace, které obsahuje připojovací řetězec pro databázi, která obsahuje tabulku monitorovanou pro změny. Název nastavení připojovacího řetězce odpovídá nastavení aplikace (v local.settings.json pro místní vývoj), které obsahuje připojovací řetězec ke službě Azure Database for MySQL.
LeasesTableName Nepovinné. Název tabulky pro ukládání zapůjčení Pokud není zadaný, název je Leases_{FunctionId}_{TableId}.

Poznámky

V knihovně modulu runtime funkcí Java použijte poznámku @MySQLTrigger k parametrům, jejichž hodnoty pocházejí ze služby Azure Database for MySQL. Tato poznámka podporuje následující prvky:

Element (Prvek) Popis
name Povinný: Název parametru, ke kterému trigger vytvoří vazbu.
tableName Povinný: Název tabulky, kterou trigger monitoruje.
connectionStringSetting Povinný: Název nastavení aplikace, které obsahuje připojovací řetězec pro databázi, která obsahuje tabulku monitorovanou pro změny. Název nastavení připojovacího řetězce odpovídá nastavení aplikace (v local.settings.json pro místní vývoj), které obsahuje připojovací řetězec ke službě Azure Database for MySQL.
LeasesTableName Nepovinné. Název tabulky pro ukládání zapůjčení Pokud není zadaný, název je Leases_{FunctionId}_{TableId}.

Konfigurace

Následující tabulka vysvětluje vlastnosti konfigurace vazby, které jste nastavili v souboru function.json:

Vlastnictví Popis
name Povinný: Název parametru, ke kterému trigger vytvoří vazbu.
type Povinný: Musí být nastavena na MysqlTriggerhodnotu .
direction Povinný: Musí být nastavena na inhodnotu .
tableName Povinný: Název tabulky, kterou trigger monitoruje.
connectionStringSetting Povinný: Název nastavení aplikace, které obsahuje připojovací řetězec pro databázi, která obsahuje tabulku monitorovanou pro změny. Název nastavení připojovacího řetězce odpovídá nastavení aplikace (v local.settings.json pro místní vývoj), které obsahuje připojovací řetězec ke službě Azure Database for MySQL.
LeasesTableName Nepovinné. Název tabulky pro ukládání zapůjčení Pokud není zadaný, název je Leases_{FunctionId}_{TableId}.

Volitelná konfigurace

Pro trigger Azure Database for MySQL pro místní vývoj nebo pro cloudová nasazení můžete nakonfigurovat následující volitelná nastavení.

host.json

Tato část popisuje nastavení konfigurace dostupné pro tuto vazbu ve verzi 2.x a novější. Nastavení v souboru host.json platí pro všechny funkce v instanci aplikace funkcí. Další informace o nastavení konfigurace aplikace funkcí najdete v host.json referenčních informacích ke službě Azure Functions.

Nastavení Výchozí Popis
MaxBatchSize 100 Maximální počet změn zpracovaných při každé iteraci smyčky triggeru před odesláním do aktivované funkce.
PollingIntervalMs 1000 Zpoždění v milisekundách mezi zpracováním jednotlivých dávek změn. (1 000 ms je 1 sekunda.)
MaxChangesPerWorker 1000 Horní limit počtu čekajících změn v tabulce uživatelů, které jsou povolené pro pracovní proces aplikace. Pokud počet změn tento limit překročí, může dojít k horizontálnímu navýšení kapacity. Nastavení platí jenom pro aplikace funkcí Azure s povoleným škálováním řízeným modulem runtime.

Příklad souboru host.json

Tady je příklad souboru host.json s volitelným nastavením:

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

local.setting.json

Soubor local.settings.json ukládá nastavení a nastavení aplikace, které používají místní vývojové nástroje. Nastavení v souboru local.settings.json se používají jenom v místním prostředí projektu. Při publikování projektu do Azure nezapomeňte do nastavení aplikace pro aplikaci funkcí přidat všechna požadovaná nastavení.

Důležité

Protože soubor local.settings.json může obsahovat tajné kódy, jako jsou připojovací řetězce, nikdy byste ho neměli ukládat do vzdáleného úložiště. Nástroje, které podporují Azure Functions, poskytují způsoby synchronizace nastavení v souboru local.settings.json s nastavením aplikace v aplikaci funkcí, do které je projekt nasazený.

Nastavení Výchozí Popis
MySql_Trigger_BatchSize 100 Maximální počet změn zpracovaných při každé iteraci smyčky triggeru před odesláním do aktivované funkce.
MySql_Trigger_PollingIntervalMs 1000 Zpoždění v milisekundách mezi zpracováním jednotlivých dávek změn. (1 000 ms je 1 sekunda.)
MySql_Trigger_MaxChangesPerWorker 1000 Horní limit počtu čekajících změn v tabulce uživatelů, které jsou povolené pro pracovní proces aplikace. Pokud počet změn tento limit překročí, může dojít k horizontálnímu navýšení kapacity. Nastavení platí jenom pro aplikace funkcí Azure s povoleným škálováním řízeným modulem runtime.

Příklad souboru local.settings.json

Tady je příklad souboru local.settings.json s volitelným nastavením:

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

Nastavení sledování změn (povinné)

Nastavení sledování změn pro použití s triggerem Azure Database for MySQL vyžaduje přidání sloupce do tabulky pomocí funkce. Tyto kroky můžete provést z libovolného nástroje MySQL, který podporuje spouštění dotazů, včetně editoru Visual Studio Code nebo Azure Data Studia.

Vazby triggeru Azure Database for MySQL používají az_func_updated_at a data sloupců k monitorování změn v tabulce uživatelů. Proto je potřeba před použitím podpory triggeru změnit strukturu tabulky tak, aby umožňovala sledování změn v tabulce MySQL. Sledování změn v tabulce můžete povolit pomocí následujícího dotazu. Můžete ji například povolit v Products tabulce:

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

Tabulka zapůjčení obsahuje všechny sloupce, které odpovídají primárnímu klíči z tabulky uživatele, a dva další sloupce: az_func_AttemptCount a az_func_LeaseExpirationTime. Pokud některý ze sloupců primárního klíče má stejný název, výsledkem je chybová zpráva, která obsahuje konflikty. V tomto případě je potřeba přejmenovat sloupce primárního klíče, aby trigger fungoval.

Povolení škálování řízeného modulem runtime

Volitelně můžete funkce škálovat automaticky na základě počtu změn, které čekají na zpracování v tabulce uživatelů. Pokud chcete, aby se funkce při použití triggerů Azure Database for MySQL správně škálovaly v plánu Premium, musíte povolit monitorování škálování modulu runtime.

  1. Na webu Azure Portal ve vaší aplikaci funkcí vyberte Konfigurace.

  2. Na kartě Nastavení modulu runtime funkce pro monitorování škálování modulu runtime vyberte Zapnuto.

    Snímek obrazovky oblasti webu Azure Portal pro povolení škálování za běhu

Podpora opakování

Opakované pokusy po spuštění

Pokud při spuštění dojde k výjimce, modul runtime hostitele se automaticky pokusí restartovat naslouchací proces triggeru s exponenciální strategií zpoždování. Tyto opakované pokusy budou pokračovat, dokud se naslouchací proces úspěšně nespustí nebo se zruší spuštění.

Opakování výjimek funkce

Pokud během zpracování změn dojde k výjimce uživatelské funkce, dávka řádků, které se právě zpracovávají, se opakuje za 60 sekund. Během této doby se zpracovávají jiné změny jako normální, ale řádky v dávce, které způsobily výjimku, se ignorují, dokud nevyplyne časový limit.

Pokud provádění funkce selže pět po sobě jdoucích časů pro konkrétní řádek, bude tento řádek ignorován pro všechny budoucí změny. Vzhledem k tomu, že řádky v dávce nejsou deterministické, můžou řádky v neúspěšné dávce skončit v různých dávkách v následných vyvolání. Toto chování znamená, že ne všechny řádky v dávce, které selhaly, se nutně ignorují. Pokud výjimky způsobily jiné řádky v dávce, můžou se řádky "dobré" skončit v jiné dávce, která v budoucích vyvolání neselže.