Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az Azure Database for MySQL triggerkötései figyelik a felhasználói táblát a módosítások (beszúrások és frissítések) után, és frissített soradatokkal meghívják a függvényt.
Az Azure Database for MySQL-eseményindító kötései és oszlopadatai a felhasználói tábla változásainak figyelésére használhatók az_func_updated_at . Ezért módosítania kell a táblastruktúrát, hogy lehetővé tegye a változáskövetést a MySQL-táblán az eseményindító támogatásának használata előtt. A tábla változáskövetését az alábbi lekérdezéssel engedélyezheti. Engedélyezze például a Products táblában:
ALTER TABLE Products
ADD az_func_updated_at TIMESTAMP DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
A bérletek táblája tartalmazza a felhasználói tábla elsődleges kulcsának megfelelő összes oszlopot, valamint további három oszlopot: az_func_AttemptCount, az_func_LeaseExpirationTimeés az_func_SyncCompletedTime. Ha az elsődleges kulcsoszlopok bármelyikének ugyanaz a neve, az eredmény egy ütközéseket listázó hibaüzenet. Ebben az esetben a felsorolt elsődleges kulcsoszlopokat át kell nevezni az eseményindító működéséhez.
A funkciók áttekintése
Az eseményindító függvény indításakor két különálló ciklust indít el: a változás lekérdezési ciklusát és a bérlet megújítási ciklusát. Ezek a hurkok folyamatosan futnak, amíg a függvény le nem áll.
Az Azure Database for MySQL-eseményindító kötése a lekérdezési ciklus használatával ellenőrzi a módosításokat. A lekérdezési ciklus aktiválja a felhasználói függvényt, amikor változásokat észlel. Magas szinten a hurok az alábbi példához hasonlóan néz ki:
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
}
A módosítások feldolgozása a végrehajtott sorrendben történik. A rendszer először a legrégebbi módosításokat dolgozza fel. Fontolja meg az alábbi szempontokat a változásfeldolgozással kapcsolatban:
- Ha a módosítások egyszerre több sorban történnek, a függvénynek küldött pontos sorrend az oszlop és az
az_func_updated_atelsődleges kulcsoszlopok növekvő sorrendjén alapul. - A módosítások kötegelve vannak egy sorhoz. Ha a ciklus egyes iterációi között több módosítás is történik, a rendszer csak az adott sorhoz tartozó legújabb módosítási bejegyzést veszi figyelembe.
Feljegyzés
A felügyelt identitások jelenleg nem támogatottak az Azure Functions és az Azure Database for MySQL közötti kapcsolatokhoz.
Példa használatra
Az Azure Database for MySQL-eseményindítóhoz további minták érhetők el a GitHub-adattárban.
A példa egy Product osztályra és egy megfelelő adatbázistáblára hivatkozik:
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
);
A változáskövetést úgy engedélyezheti az adatbázisban, hogy egy oszlopot ad hozzá a táblához:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Az Azure Database for MySQL-eseményindító az objektumokat IReadOnlyList<MySqlChange<T>>listázóhoz MySqlChange kapcsolódik. Mindegyik objektum két tulajdonsággal rendelkezik:
-
Item: A módosított elem. Az elem típusának a táblázat sémáját kell követnie, ahogy az azToDoItemosztályban látható. -
Operation: Az enumerálásból származóMySqlChangeOperationérték. A lehetséges érték mind a beszúrások, mind aUpdatefrissítések esetében.
Az alábbi példa egy C#-függvényt mutat be, amely akkor lesz meghívva, amikor változások történnek a Product táblában:
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élda használatra
Az Azure Database for MySQL-eseményindítóhoz további minták érhetők el a GitHub-adattárban.
A példa egy Product osztályra, egy osztályra MySqlChangeProduct , egy enumerálásra MySqlChangeOperation és egy megfelelő adatbázistáblára hivatkozik.
Egy Product.java nevű külön fájlban:
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;
}
}
Egy MySqlChangeProduct.java nevű külön fájlban:
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;
}
}
Egy MySqlChangeOperation.java nevű külön fájlban:
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
);
A változáskövetést úgy engedélyezheti az adatbázisban, hogy hozzáadja a következő oszlopot a táblához:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Az Azure Database for MySQL-eseményindító objektumtömbhöz MySqlChangeProduct[] kapcsolódikMySqlChangeProduct. Mindegyik objektum két tulajdonsággal rendelkezik:
-
item: A módosított elem. Az elem típusának a táblázat sémáját kell követnie, ahogy az azProductosztályban látható. -
operation: Az enumerálásból származóMySqlChangeOperationérték. A lehetséges érték mind a beszúrások, mind aUpdatefrissítések esetében.
Az alábbi példa egy Java-függvényt mutat be, amely akkor lesz meghívva, amikor változások történnek a Product táblában:
/**
* 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élda használatra
Az Azure Database for MySQL-eseményindítóhoz további minták érhetők el a GitHub-adattárban.
A példa egy Product adatbázistáblára hivatkozik:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
A változáskövetést úgy engedélyezheti az adatbázisban, hogy egy oszlopot ad hozzá a táblához:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Az Azure Database for MySQL-eseményindító az objektumokat Productlistázóhoz kapcsolódik. Mindegyik objektum két tulajdonsággal rendelkezik:
-
item: A módosított elem. Az elem struktúrája a táblázatsémát követi. -
operation: A lehetséges érték mind a beszúrások, mind aUpdatefrissítések esetében.
Az alábbi példa egy PowerShell-függvényt mutat be, amely akkor lesz meghívva, amikor változások történnek a Product táblában.
A következő példa a kötési adatok a function.json fájlban:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString"
}
],
"disabled": false
}
A Konfiguráció szakasz ezeket a tulajdonságokat ismerteti.
Az alábbi példa a run.ps1 fájlban található függvény PowerShell-kódjának mintája:
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élda használatra
Az Azure Database for MySQL-eseményindítóhoz további minták érhetők el a GitHub-adattárban.
A példa egy Product adatbázistáblára hivatkozik:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
A változáskövetést úgy engedélyezheti az adatbázisban, hogy egy oszlopot ad hozzá a táblához:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Az Azure Database for MySQL-eseményindító objektumtömbhöz kapcsolódik Changes. Mindegyik objektum két tulajdonsággal rendelkezik:
-
item: A módosított elem. Az elem struktúrája a táblázatsémát követi. -
operation: A lehetséges érték mind a beszúrások, mind aUpdatefrissítések esetében.
Az alábbi példa egy JavaScript-függvényt mutat be, amely akkor lesz meghívva, amikor változások történnek a Product táblában.
A következő példa a kötési adatok a function.json fájlban:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString",
}
],
"disabled": false
}
A Konfiguráció szakasz ezeket a tulajdonságokat ismerteti.
Az alábbi példa a fájlban lévő index.js függvényhez tartozó JavaScript-mintakód:
module.exports = async function (context, changes) {
context.log(`MySql Changes: ${JSON.stringify(changes)}`)
}
Példa használatra
Az Azure Database for MySQL-eseményindítóhoz további minták érhetők el a GitHub-adattárban.
A példa egy Product adatbázistáblára hivatkozik:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
A változáskövetést úgy engedélyezheti az adatbázisban, hogy egy oszlopot ad hozzá a táblához:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Feljegyzés
A Pythonhoz az Azure Functions 1.22.0b4-es verzióját kell használnia.
Az Azure Database for MySQL-eseményindító egy objektumokat listázó nevű változóhoz Productkapcsolódik. Mindegyik objektum két tulajdonsággal rendelkezik:
-
item: A módosított elem. Az elem struktúrája a táblázatsémát követi. -
operation: A lehetséges érték mind a beszúrások, mind aUpdatefrissítések esetében.
Az alábbi példa egy Python-függvényt mutat be, amely akkor lesz meghívva, amikor változások történnek a Product táblában.
Az alábbi példa a function_app.py fájlhoz tartozó Python-mintakód:
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))
Attribútumok
| Attribútumtulajdonság | Leírás |
|---|---|
TableName |
Szükséges. Annak a táblának a neve, amelyet az eseményindító figyel. |
ConnectionStringSetting |
Szükséges. Annak az alkalmazásbeállításnak a neve, amely a módosításokat figyelő táblát tartalmazó adatbázis kapcsolati sztringét tartalmazza. A kapcsolati sztring-beállítás neve megegyezik az Azure Database for MySQL-hez tartozó kapcsolati sztringet tartalmazó alkalmazásbeállítással (a helyi fejlesztéshez local.settings.json). |
LeasesTableName |
Opcionális. A bérletek tárolására szolgáló tábla neve. Ha nincs megadva, a név .Leases_{FunctionId}_{TableId} |
Jegyzetek
A Java-függvények futtatókörnyezeti kódtárában használja a széljegyzetet azon @MySQLTrigger paramétereken, amelyek értékei az Azure Database for MySQL-ből származnának. Ez a széljegyzet a következő elemeket támogatja:
| Elem | Leírás |
|---|---|
name |
Szükséges. Annak a paraméternek a neve, amelyhez az eseményindító kapcsolódik. |
tableName |
Szükséges. Annak a táblának a neve, amelyet az eseményindító figyel. |
connectionStringSetting |
Szükséges. Annak az alkalmazásbeállításnak a neve, amely a módosításokat figyelő táblát tartalmazó adatbázis kapcsolati sztringét tartalmazza. A kapcsolati sztring-beállítás neve megegyezik az Azure Database for MySQL-hez tartozó kapcsolati sztringet tartalmazó alkalmazásbeállítással (a helyi fejlesztéshez local.settings.json). |
LeasesTableName |
Opcionális. A bérletek tárolására szolgáló tábla neve. Ha nincs megadva, a név .Leases_{FunctionId}_{TableId} |
Konfiguráció
Az alábbi táblázat a function.json fájlban beállított kötéskonfigurációs tulajdonságokat ismerteti:
| Ingatlan | Leírás |
|---|---|
name |
Szükséges. Annak a paraméternek a neve, amelyhez az eseményindító kapcsolódik. |
type |
Szükséges. A beállításnak a MysqlTriggerkövetkezőnek kell lennie: . |
direction |
Szükséges. A beállításnak a inkövetkezőnek kell lennie: . |
tableName |
Szükséges. Annak a táblának a neve, amelyet az eseményindító figyel. |
connectionStringSetting |
Szükséges. Annak az alkalmazásbeállításnak a neve, amely a módosításokat figyelő táblát tartalmazó adatbázis kapcsolati sztringét tartalmazza. A kapcsolati sztring-beállítás neve megegyezik az Azure Database for MySQL-hez tartozó kapcsolati sztringet tartalmazó alkalmazásbeállítással (a helyi fejlesztéshez local.settings.json). |
LeasesTableName |
Opcionális. A bérletek tárolására szolgáló tábla neve. Ha nincs megadva, a név .Leases_{FunctionId}_{TableId} |
Választható konfiguráció
A következő választható beállításokat konfigurálhatja az Azure Database for MySQL-eseményindítóhoz helyi fejlesztéshez vagy felhőbeli üzemelő példányokhoz.
host.json
Ez a szakasz a kötéshez elérhető konfigurációs beállításokat ismerteti a 2.x és újabb verzióban. A host.json fájl beállításai a függvényalkalmazás-példány összes függvényére vonatkoznak. A függvényalkalmazás konfigurációs beállításaival kapcsolatos további információkért lásd host.json Azure Functionsre vonatkozó referenciát.
| Beállítás | Alapértelmezett | Leírás |
|---|---|---|
MaxBatchSize |
100 |
Az eseményindító ciklus minden iterációjával feldolgozott módosítások maximális száma, mielőtt elküldené őket az aktivált függvénynek. |
PollingIntervalMs |
1000 |
A módosítások egyes kötegeinek feldolgozása közötti ezredmásodpercben bekövetkező késés. (1000 ms 1 másodperc.) |
MaxChangesPerWorker |
1000 |
Az alkalmazás-feldolgozónként engedélyezett függőben lévő módosítások számának felső korlátja a felhasználói táblában. Ha a módosítások száma meghaladja ezt a korlátot, az vertikális felskálázást eredményezhet. A beállítás csak olyan Azure-függvényalkalmazásokra vonatkozik, amelyekben engedélyezve van a futásidejű skálázás. |
Példa host.json fájlra
Íme egy példa host.json fájlra az opcionális beállításokkal:
{
"version": "2.0",
"extensions": {
"MySql": {
"MaxBatchSize": 300,
"PollingIntervalMs": 1000,
"MaxChangesPerWorker": 100
}
},
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
},
"logLevel": {
"default": "Trace"
}
}
}
local.setting.json
A local.settings.json fájl tárolja a helyi fejlesztési eszközök által használt alkalmazásbeállításokat és beállításokat. A local.settings.json fájl beállításait csak akkor használja a rendszer, ha helyileg futtatja a projektet. Amikor közzéteszi a projektet az Azure-ban, mindenképpen adja hozzá a szükséges beállításokat a függvényalkalmazás alkalmazásbeállításaihoz.
Fontos
Mivel a local.settings.json fájl titkos kódokat, például kapcsolati sztringeket tartalmazhat, soha ne tárolja távoli adattárban. Az Azure Functionst támogató eszközök lehetővé teszik a local.settings.json fájl beállításainak szinkronizálását abban a függvényalkalmazásban, amelyre a projektet üzembe helyezték.
| Beállítás | Alapértelmezett | Leírás |
|---|---|---|
MySql_Trigger_BatchSize |
100 |
Az eseményindító ciklus minden iterációjával feldolgozott módosítások maximális száma, mielőtt elküldené őket az aktivált függvénynek. |
MySql_Trigger_PollingIntervalMs |
1000 |
A módosítások egyes kötegeinek feldolgozása közötti ezredmásodpercben bekövetkező késés. (1000 ms 1 másodperc.) |
MySql_Trigger_MaxChangesPerWorker |
1000 |
Az alkalmazás-feldolgozónként engedélyezett függőben lévő módosítások számának felső korlátja a felhasználói táblában. Ha a módosítások száma meghaladja ezt a korlátot, az vertikális felskálázást eredményezhet. A beállítás csak olyan Azure-függvényalkalmazásokra vonatkozik, amelyekben engedélyezve van a futásidejű skálázás. |
Példa local.settings.json fájlra
Íme egy példa local.settings.json fájlra az opcionális beállításokkal:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"MySqlConnectionString": "",
"MySql_Trigger_MaxBatchSize": 300,
"MySql_Trigger_PollingIntervalMs": 1000,
"MySql_Trigger_MaxChangesPerWorker": 100
}
}
Változáskövetés beállítása (kötelező)
Az Azure Database for MySQL-eseményindítóval való használatra történő változáskövetés beállításához egy oszlopot kell hozzáadnia egy táblához egy függvény használatával. Ezeket a lépéseket bármely olyan MySQL-eszközből elvégezheti, amely támogatja a lekérdezések futtatását, beleértve a Visual Studio Code-ot vagy az Azure Data Studiót.
Az Azure Database for MySQL-eseményindító kötései és oszlopadatai a felhasználói tábla változásainak figyelésére használhatók az_func_updated_at . Ezért módosítania kell a táblastruktúrát, hogy lehetővé tegye a változáskövetést a MySQL-táblán az eseményindító támogatásának használata előtt. A tábla változáskövetését az alábbi lekérdezéssel engedélyezheti. Engedélyezze például a Products táblában:
ALTER TABLE Products;
ADD az_func_updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
A bérletek táblája tartalmazza a felhasználói tábla elsődleges kulcsának megfelelő összes oszlopot, valamint két további oszlopot: az_func_AttemptCount és az_func_LeaseExpirationTime. Ha az elsődleges kulcsoszlopok bármelyikének ugyanaz a neve, az eredmény egy ütközéseket listázó hibaüzenet. Ebben az esetben a felsorolt elsődleges kulcsoszlopokat át kell nevezni az eseményindító működéséhez.
Futtatókörnyezet-alapú skálázás engedélyezése
Opcionálisan a függvények automatikusan skálázhatók a felhasználói táblában feldolgozandó módosítások száma alapján. Ahhoz, hogy a függvények megfelelően skálázhatók legyenek a Prémium csomagban az Azure Database for MySQL-eseményindítók használatakor, engedélyeznie kell a futtatókörnyezeti skálázás monitorozását.
Az Azure Portal függvényalkalmazásában válassza a Konfiguráció lehetőséget.
A Függvény futtatókörnyezet beállításai lapon válassza a Futtatókörnyezet skálázásának monitorozásalehetőséget.
Újrapróbálkozás támogatása
Újrapróbálkozás indítása
Ha az indítás során kivétel történik, a gazdagép futtatókörnyezete automatikusan megkísérli újraindítani az eseményindító-figyelőt exponenciális háttérstratégiával. Ezek az újrapróbálkozások mindaddig folytatódnak, amíg a figyelő sikeresen el nem indul, vagy az indítás megszakad.
Függvénykivétel újrapróbálkozásai
Ha a módosítás feldolgozása során kivétel történik a felhasználói függvényben, a jelenleg feldolgozott sorok kötegét 60 másodperc múlva újrapróbálja a rendszer. Ez idő alatt a többi módosítás a szokásos módon lesz feldolgozva, de a kivételt okozó köteg sorait a rendszer figyelmen kívül hagyja mindaddig, amíg az időtúllépési időszak el nem telik.
Ha egy adott sor esetében a függvény végrehajtása öt egymást követő alkalommal meghiúsul, a rendszer figyelmen kívül hagyja ezt a sort az összes jövőbeli módosításnál. Mivel a köteg sorai nem determinisztikusak, előfordulhat, hogy egy sikertelen köteg sorai különböző kötegekben végződnek a későbbi meghívásokban. Ez a viselkedés azt jelenti, hogy a sikertelen köteg nem minden sorát hagyja figyelmen kívül. Ha a köteg többi sora okozta a kivételt, előfordulhat, hogy a "jó" sorok egy másik kötegbe kerülnek, amely a jövőbeni meghívások során nem hiúsul meg.