Delen via


Azure Database for MySQL-triggerbinding voor Azure Functions

Azure Database for MySQL-triggerbindingen bewaken de gebruikerstabel op wijzigingen (invoegingen en updates) en roepen de functie aan met bijgewerkte rijgegevens.

Azure Database for MySQL-triggerbindingen gebruiken az_func_updated_at en kolomgegevens om de gebruikerstabel te controleren op wijzigingen. Daarom moet u de tabelstructuur wijzigen om wijzigingen bij te houden in de MySQL-tabel voordat u de triggerondersteuning gebruikt. U kunt het bijhouden van wijzigingen in een tabel inschakelen via de volgende query. Schakel deze bijvoorbeeld in voor de Products tabel:

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

De tabel voor leases bevat alle kolommen die overeenkomen met de primaire sleutel uit de gebruikerstabel en drie kolommen: az_func_AttemptCount, az_func_LeaseExpirationTimeen az_func_SyncCompletedTime. Als een van de primaire-sleutelkolommen dezelfde naam heeft, is het resultaat een foutbericht met conflicten. In dit geval moeten de vermelde primaire-sleutelkolommen worden gewijzigd om de trigger te laten werken.

Overzicht van functionaliteit

Wanneer de triggerfunctie wordt gestart, worden er twee afzonderlijke lussen gestart: de pollinglus voor wijzigingen en de leasevernieuwingslus. Deze lussen worden continu uitgevoerd totdat de functie is gestopt.

De Azure Database for MySQL-triggerbinding maakt gebruik van de polling-lus om te controleren op wijzigingen. De polling-lus activeert de gebruikersfunctie wanneer wijzigingen worden gedetecteerd. Op hoog niveau ziet de lus er als volgt uit:

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
}

Wijzigingen worden verwerkt in de volgorde waarin ze worden aangebracht. De oudste wijzigingen worden eerst verwerkt. Houd rekening met deze punten over wijzigingsverwerking:

  • Als er in meerdere rijen tegelijk wijzigingen optreden, is de exacte volgorde waarin ze naar de functie worden verzonden, gebaseerd op de oplopende volgorde van de az_func_updated_at kolom- en primaire-sleutelkolommen.
  • Wijzigingen worden gebatcheerd voor een rij. Als er meerdere wijzigingen optreden in een rij tussen elke iteratie van de lus, wordt alleen de meest recente wijzigingsvermelding voor die rij overwogen.

Notitie

Op dit moment worden beheerde identiteiten niet ondersteund voor verbindingen tussen Azure Functions en Azure Database for MySQL.

Voorbeeld van gebruik

Meer voorbeelden voor de Azure Database for MySQL-trigger zijn beschikbaar in de GitHub-opslagplaats.

Het voorbeeld verwijst naar een Product klasse en een bijbehorende databasetabel:

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

U schakelt wijzigingen bijhouden in de database in door één kolom toe te voegen aan de tabel:

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

De Azure Database for MySQL-trigger bindt aan IReadOnlyList<MySqlChange<T>>, waarin objecten worden vermeld MySqlChange . Elk object heeft twee eigenschappen:

  • Item: Het item dat is gewijzigd. Het type item moet het tabelschema volgen, zoals te zien is in de ToDoItem klasse.
  • Operation: Een waarde uit de MySqlChangeOperation opsomming. De mogelijke waarde is Update voor zowel invoegingen als updates.

In het volgende voorbeeld ziet u een C#-functie die wordt aangeroepen wanneer er wijzigingen in de Product tabel optreden:

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

Voorbeeld van gebruik

Meer voorbeelden voor de Azure Database for MySQL-trigger zijn beschikbaar in de GitHub-opslagplaats.

Het voorbeeld verwijst naar een Product klasse, een MySqlChangeProduct klasse, een MySqlChangeOperation opsomming en een bijbehorende databasetabel.

In een afzonderlijk bestand met de naam 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;
    }
}

In een afzonderlijk bestand met de naam 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;
    }
}

In een afzonderlijk bestand met de naam 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
);

U schakelt wijzigingen bijhouden in de database in door de volgende kolom toe te voegen aan de tabel:

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

De Azure Database for MySQL-trigger bindt aan MySqlChangeProduct[], een matrix met MySqlChangeProduct objecten. Elk object heeft twee eigenschappen:

  • item: Het item dat is gewijzigd. Het type item moet het tabelschema volgen, zoals te zien is in de Product klasse.
  • operation: Een waarde uit de MySqlChangeOperation opsomming. De mogelijke waarde is Update voor zowel invoegingen als updates.

In het volgende voorbeeld ziet u een Java-functie die wordt aangeroepen wanneer er wijzigingen in de Product tabel optreden:

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

Voorbeeld van gebruik

Meer voorbeelden voor de Azure Database for MySQL-trigger zijn beschikbaar in de GitHub-opslagplaats.

Het voorbeeld verwijst naar een Product databasetabel:

DROP TABLE IF EXISTS Products;

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

U schakelt wijzigingen bijhouden in de database in door één kolom toe te voegen aan de tabel:

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

De Azure Database for MySQL-trigger bindt aan Product, waarin objecten worden vermeld. Elk object heeft twee eigenschappen:

  • item: Het item dat is gewijzigd. De structuur van het item volgt het tabelschema.
  • operation: De mogelijke waarde is Update voor zowel invoegingen als updates.

In het volgende voorbeeld ziet u een PowerShell-functie die wordt aangeroepen wanneer er wijzigingen in de Product tabel optreden.

Het volgende voorbeeld bestaat uit bindingsgegevens in het function.json-bestand:

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

In de sectie Configuratie worden deze eigenschappen uitgelegd.

Het volgende voorbeeld is PowerShell-voorbeeldcode voor de functie in het run.ps1-bestand:

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"

Voorbeeld van gebruik

Meer voorbeelden voor de Azure Database for MySQL-trigger zijn beschikbaar in de GitHub-opslagplaats.

Het voorbeeld verwijst naar een Product databasetabel:

DROP TABLE IF EXISTS Products;

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

U schakelt wijzigingen bijhouden in de database in door één kolom toe te voegen aan de tabel:

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

De Azure Database for MySQL-trigger bindt aan Changes, een matrix met objecten. Elk object heeft twee eigenschappen:

  • item: Het item dat is gewijzigd. De structuur van het item volgt het tabelschema.
  • operation: De mogelijke waarde is Update voor zowel invoegingen als updates.

In het volgende voorbeeld ziet u een JavaScript-functie die wordt aangeroepen wanneer er wijzigingen in de Product tabel optreden.

Het volgende voorbeeld bestaat uit bindingsgegevens in het function.json-bestand:

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

In de sectie Configuratie worden deze eigenschappen uitgelegd.

Het volgende voorbeeld is javaScript-voorbeeldcode voor de functie in het index.js bestand:

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

Voorbeeld van gebruik

Meer voorbeelden voor de Azure Database for MySQL-trigger zijn beschikbaar in de GitHub-opslagplaats.

Het voorbeeld verwijst naar een Product databasetabel:

DROP TABLE IF EXISTS Products;

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

U schakelt wijzigingen bijhouden in de database in door één kolom toe te voegen aan de tabel:

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

Notitie

U moet Azure Functions versie 1.22.0b4 voor Python gebruiken.

De Azure Database for MySQL-trigger bindt aan een variabele met de naam Product, waarin objecten worden weergegeven. Elk object heeft twee eigenschappen:

  • item: Het item dat is gewijzigd. De structuur van het item volgt het tabelschema.
  • operation: De mogelijke waarde is Update voor zowel invoegingen als updates.

In het volgende voorbeeld ziet u een Python-functie die wordt aangeroepen wanneer er wijzigingen in de Product tabel optreden.

Het volgende voorbeeld is python-voorbeeldcode voor het function_app.py-bestand:

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

Kenmerken

Kenmerkeigenschap Beschrijving
TableName Vereist. De naam van de tabel die door de trigger wordt bewaakt.
ConnectionStringSetting Vereist. De naam van een app-instelling die de verbindingsreeks bevat voor de database die de tabel bevat die wordt gecontroleerd op wijzigingen. De naam van de verbindingsreeksinstelling komt overeen met de toepassingsinstelling (in local.settings.json voor lokale ontwikkeling) die de verbindingsreeks bevat met Azure Database for MySQL.
LeasesTableName Optioneel. De naam van de tabel voor het opslaan van leases. Als deze niet is opgegeven, is Leases_{FunctionId}_{TableId}de naam .

Aantekeningen

Gebruik in de Runtime-bibliotheek van Java-functies de @MySQLTrigger aantekening voor parameters waarvan de waarden afkomstig zijn van Azure Database for MySQL. Deze aantekening ondersteunt de volgende elementen:

Onderdeel Beschrijving
name Vereist. De naam van de parameter waaraan de trigger is gekoppeld.
tableName Vereist. De naam van de tabel die door de trigger wordt bewaakt.
connectionStringSetting Vereist. De naam van een app-instelling die de verbindingsreeks bevat voor de database die de tabel bevat die wordt gecontroleerd op wijzigingen. De naam van de verbindingsreeksinstelling komt overeen met de toepassingsinstelling (in local.settings.json voor lokale ontwikkeling) die de verbindingsreeks bevat met Azure Database for MySQL.
LeasesTableName Optioneel. De naam van de tabel voor het opslaan van leases. Als deze niet is opgegeven, is Leases_{FunctionId}_{TableId}de naam .

Configuratie

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u in het function.json-bestand hebt ingesteld:

Vastgoed Beschrijving
name Vereist. De naam van de parameter waaraan de trigger is gekoppeld.
type Vereist. Moet worden ingesteld op MysqlTrigger.
direction Vereist. Moet worden ingesteld op in.
tableName Vereist. De naam van de tabel die door de trigger wordt bewaakt.
connectionStringSetting Vereist. De naam van een app-instelling die de verbindingsreeks bevat voor de database die de tabel bevat die wordt gecontroleerd op wijzigingen. De naam van de verbindingsreeksinstelling komt overeen met de toepassingsinstelling (in local.settings.json voor lokale ontwikkeling) die de verbindingsreeks bevat met Azure Database for MySQL.
LeasesTableName Optioneel. De naam van de tabel voor het opslaan van leases. Als deze niet is opgegeven, is Leases_{FunctionId}_{TableId}de naam .

Optionele configuratie

U kunt de volgende optionele instellingen configureren voor de Azure Database for MySQL-trigger voor lokale ontwikkeling of voor cloudimplementaties.

host.json

In deze sectie worden de configuratie-instellingen beschreven die beschikbaar zijn voor deze binding in versie 2.x en hoger. Instellingen in het bestand host.json zijn van toepassing op alle functies in een exemplaar van een functie-app. Zie host.json naslaginformatie voor Azure Functions voor meer informatie over configuratie-instellingen voor functie-apps.

Instelling Verstek Beschrijving
MaxBatchSize 100 Het maximum aantal wijzigingen dat wordt verwerkt met elke iteratie van de triggerlus voordat ze naar de geactiveerde functie worden verzonden.
PollingIntervalMs 1000 De vertraging in milliseconden tussen het verwerken van elke batch wijzigingen. (1.000 ms is 1 seconde.)
MaxChangesPerWorker 1000 De bovengrens voor het aantal wijzigingen in behandeling in de gebruikerstabel dat per toepassingsmedewerker is toegestaan. Als het aantal wijzigingen deze limiet overschrijdt, kan dit leiden tot uitschalen. De instelling geldt alleen voor Azure-functie-apps waarvoor runtimegestuurd schalen is ingeschakeld.

Voorbeeld van host.json bestand

Hier volgt een voorbeeld van host.json bestand met de optionele instellingen:

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

local.setting.json

In het local.settings.json-bestand worden app-instellingen en -instellingen opgeslagen die door lokale ontwikkelhulpprogramma's worden gebruikt. Instellingen in het local.settings.json-bestand worden alleen gebruikt wanneer u uw project lokaal uitvoert. Wanneer u uw project publiceert naar Azure, moet u ook alle vereiste instellingen toevoegen aan de app-instellingen voor de functie-app.

Belangrijk

Omdat het bestand local.settings.json geheimen kan bevatten, zoals verbindingsreeksen, moet u het nooit opslaan in een externe opslagplaats. Hulpprogramma's die Azure Functions ondersteunen, bieden manieren om instellingen in het local.settings.json-bestand te synchroniseren met de app-instellingen in de functie-app waarmee uw project wordt geïmplementeerd.

Instelling Verstek Beschrijving
MySql_Trigger_BatchSize 100 Het maximum aantal wijzigingen dat wordt verwerkt met elke iteratie van de triggerlus voordat ze naar de geactiveerde functie worden verzonden.
MySql_Trigger_PollingIntervalMs 1000 De vertraging in milliseconden tussen het verwerken van elke batch wijzigingen. (1.000 ms is 1 seconde.)
MySql_Trigger_MaxChangesPerWorker 1000 De bovengrens voor het aantal wijzigingen in behandeling in de gebruikerstabel dat per toepassingsmedewerker is toegestaan. Als het aantal wijzigingen deze limiet overschrijdt, kan dit leiden tot uitschalen. De instelling geldt alleen voor Azure-functie-apps waarvoor runtimegestuurd schalen is ingeschakeld.

Voorbeeld van local.settings.json bestand

Hier volgt een voorbeeld van local.settings.json bestand met de optionele instellingen:

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

Wijzigingen bijhouden instellen (vereist)

Als u wijzigingen bijhouden instelt voor gebruik met de Azure Database for MySQL-trigger, moet u een kolom in een tabel toevoegen met behulp van een functie. U kunt deze stappen uitvoeren vanuit elk MySQL-hulpprogramma dat ondersteuning biedt voor het uitvoeren van query's, waaronder Visual Studio Code of Azure Data Studio.

Azure Database for MySQL-triggerbindingen gebruiken az_func_updated_at en kolomgegevens om de gebruikerstabel te controleren op wijzigingen. Daarom moet u de tabelstructuur wijzigen om wijzigingen bij te houden in de MySQL-tabel voordat u de triggerondersteuning gebruikt. U kunt het bijhouden van wijzigingen in een tabel inschakelen via de volgende query. Schakel deze bijvoorbeeld in voor de Products tabel:

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

De tabel voor leases bevat alle kolommen die overeenkomen met de primaire sleutel uit de gebruikerstabel en twee meer kolommen: az_func_AttemptCount en az_func_LeaseExpirationTime. Als een van de primaire-sleutelkolommen dezelfde naam heeft, is het resultaat een foutbericht met conflicten. In dit geval moeten de vermelde primaire-sleutelkolommen worden gewijzigd om de trigger te laten werken.

Runtimegestuurd schalen inschakelen

Desgewenst kunnen uw functies automatisch worden geschaald op basis van het aantal wijzigingen dat in behandeling is voor verwerking in de gebruikerstabel. Als u wilt dat uw functies op de juiste manier kunnen worden geschaald in het Premium-abonnement wanneer u Azure Database for MySQL-triggers gebruikt, moet u bewaking van runtimeschaal inschakelen.

  1. Selecteer Configuratie in de Azure-portal in uw functie-app.

  2. Selecteer op het tabblad Runtime-instellingen voor Runtime-schaalbewaking de optie Aan.

    Schermopname van het gebied azure Portal voor het inschakelen van runtime-schaalaanpassing.

Ondersteuning voor opnieuw proberen

Nieuwe pogingen voor opstarten

Als er een uitzondering optreedt tijdens het opstarten, probeert de hostruntime de triggerlistener automatisch opnieuw op te starten met een strategie voor exponentieel uitstel. Deze nieuwe pogingen worden voortgezet totdat de listener is gestart of het opstarten wordt geannuleerd.

Nieuwe pogingen voor functie-uitzonderingen

Als er een uitzondering optreedt in de gebruikersfunctie tijdens het verwerken van wijzigingen, wordt de batch met rijen die momenteel worden verwerkt, binnen 60 seconden opnieuw geprobeerd. Andere wijzigingen worden in deze periode als normaal verwerkt, maar de rijen in de batch die de uitzondering hebben veroorzaakt, worden genegeerd totdat de time-outperiode is verstreken.

Als de uitvoering van de functie vijf opeenvolgende keren mislukt voor een bepaalde rij, wordt die rij genegeerd voor alle toekomstige wijzigingen. Omdat de rijen in een batch niet deterministisch zijn, kunnen rijen in een mislukte batch in verschillende batches terechtkomen in volgende aanroepen. Dit gedrag betekent dat niet alle rijen in de mislukte batch noodzakelijkerwijs worden genegeerd. Als andere rijen in de batch de uitzondering hebben veroorzaakt, kunnen de 'goede' rijen in een andere batch terechtkomen die in toekomstige aanroepen niet mislukken.