適用於 MySQL 的 Azure 資料庫觸發程式系結會監視使用者數據表是否有變更(插入和更新),並使用更新的數據列數據叫用函式。
適用於 MySQL 的 Azure 資料庫觸發程式系結會使用 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。 如果任一主鍵數據行具有相同的名稱,結果就會是列出衝突的錯誤訊息。 在此情況下,必須重新命名列出的主鍵數據行,觸發程式才能運作。
功能概觀
觸發程式函式啟動時,它會起始兩個不同的迴圈:變更輪詢迴圈和租用更新迴圈。 這些迴圈會持續執行,直到函式停止為止。
適用於 MySQL 的 Azure 資料庫觸發程式系結會使用輪詢迴圈來檢查變更。 輪詢迴圈會在偵測到變更時觸發使用者函式。 概括而言,迴圈看起來會像下列範例:
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 Functions 與適用於 MySQL 的 Azure 資料庫之間的連線不支援受控識別。
範例使用方式
GitHub 存放庫中提供更多 適用於 MySQL 的 Azure 資料庫 觸發程式的範例。
這些範例會參考 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;
適用於 MySQL 的 Azure 資料庫觸發程式會系結至 IReadOnlyList<MySqlChange<T>>,其中會列出 MySqlChange 物件。 每個物件都有兩個屬性:
-
Item:已變更的專案。 專案的型別應該遵循數據表架構,如 類別所示ToDoItem。 -
Operation:列舉中的MySqlChangeOperation值。 可能的值為Update插入和更新。
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);
}
}
}
範例使用方式
GitHub 存放庫中提供更多 適用於 MySQL 的 Azure 資料庫 觸發程式的範例。
此範例會參考類別 Product 、類別 MySqlChangeProduct 、 MySqlChangeOperation 列舉和對應的資料庫數據表。
在名為 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;
適用於 MySQL 的 Azure 資料庫觸發程式會繫結至 MySqlChangeProduct[],這是 對象的陣列 MySqlChangeProduct 。 每個物件都有兩個屬性:
-
item:已變更的專案。 專案的型別應該遵循數據表架構,如 類別所示Product。 -
operation:列舉中的MySqlChangeOperation值。 可能的值為Update插入和更新。
下列範例示範在資料表中發生變更時叫用的 Product Java 函式:
/**
* 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));
}
}
範例使用方式
GitHub 存放庫中提供更多 適用於 MySQL 的 Azure 資料庫 觸發程式的範例。
此範例會參考 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;
適用於 MySQL 的 Azure 資料庫觸發程式會系結至 Product,其中會列出物件。 每個物件都有兩個屬性:
-
item:已變更的專案。 項目的結構會遵循數據表架構。 -
operation:可能的值為Update插入和更新。
下列範例顯示當數據表發生變更時叫用的 Product PowerShell 函式。
下列範例是系結function.json檔案中的數據:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString"
}
],
"disabled": false
}
組 態 區段說明這些屬性。
下列範例是 run.ps1 檔案中 函式的範例 PowerShell 程式代碼:
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"
範例使用方式
GitHub 存放庫中提供更多 適用於 MySQL 的 Azure 資料庫 觸發程式的範例。
此範例會參考 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;
適用於 MySQL 的 Azure 資料庫觸發程式會繫結至 Changes,這是 對象的陣列。 每個物件都有兩個屬性:
-
item:已變更的專案。 項目的結構會遵循數據表架構。 -
operation:可能的值為Update插入和更新。
下列範例示範在數據表中發生變更時叫用的 Product JavaScript 函式。
下列範例是系結function.json檔案中的數據:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString",
}
],
"disabled": false
}
組 態 區段說明這些屬性。
下列範例是 檔案中 函式的 index.js 範例 JavaScript 程式代碼:
module.exports = async function (context, changes) {
context.log(`MySql Changes: ${JSON.stringify(changes)}`)
}
範例使用方式
GitHub 存放庫中提供更多 適用於 MySQL 的 Azure 資料庫 觸發程式的範例。
此範例會參考 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 Functions 1.22.0b4 版。
適用於 MySQL 的 Azure 資料庫觸發程式會系結至名為的 Product變數,其中會列出物件。 每個物件都有兩個屬性:
-
item:已變更的專案。 項目的結構會遵循數據表架構。 -
operation:可能的值為Update插入和更新。
下列範例顯示當數據表發生變更時叫用的 Product Python 函式。
下列範例是 function_app.py 檔案的 Python 程式代碼範例:
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 中),其中包含適用於 MySQL 的 Azure 資料庫的 連接字串 。 |
LeasesTableName |
選擇性。 用於儲存租用的數據表名稱。 如果未指定,則名稱為 Leases_{FunctionId}_{TableId}。 |
註釋
在 Java 函式運行時間連結庫中,對 @MySQLTrigger 值來自適用於 MySQL 的 Azure 資料庫的參數使用註釋。 此批註支援下列元素:
| 元素 | 描述 |
|---|---|
name |
必要。 觸發程式系結至的參數名稱。 |
tableName |
必要。 觸發程式所監視的數據表名稱。 |
connectionStringSetting |
必要。 應用程式設定的名稱,其中包含資料庫連接字串,其中包含監視變更的數據表。 連接字串設定的名稱會對應至應用程式設定(在本機開發 local.settings.json 中),其中包含適用於 MySQL 的 Azure 資料庫的 連接字串 。 |
LeasesTableName |
選擇性。 用於儲存租用的數據表名稱。 如果未指定,則名稱為 Leases_{FunctionId}_{TableId}。 |
組態
下表說明您在 function.json 檔案中設定的系結組態屬性:
| 財產 | 描述 |
|---|---|
name |
必要。 觸發程式系結至的參數名稱。 |
type |
必要。 必須設定為 MysqlTrigger。 |
direction |
必要。 必須設定為 in。 |
tableName |
必要。 觸發程式所監視的數據表名稱。 |
connectionStringSetting |
必要。 應用程式設定的名稱,其中包含資料庫連接字串,其中包含監視變更的數據表。 連接字串設定的名稱會對應至應用程式設定(在本機開發 local.settings.json 中),其中包含適用於 MySQL 的 Azure 資料庫的 連接字串 。 |
LeasesTableName |
選擇性。 用於儲存租用的數據表名稱。 如果未指定,則名稱為 Leases_{FunctionId}_{TableId}。 |
選用設定
您可以為適用於 MySQL 的 Azure 資料庫觸發程式設定下列選擇性設定,以進行本機開發或雲端部署。
host.json
本節說明 2.x 版和更新版本中此系結可用的組態設定。 host.json檔案中的設定會套用至函式應用程式實例中的所有函式。 如需函式應用程式組態設定的詳細資訊,請參閱 azure Functionshost.json 參考。
| 設定 | 預設 | 描述 |
|---|---|---|
MaxBatchSize |
100 |
在觸發程序迴圈的每個反覆專案處理變更數目上限,再傳送至觸發的函式。 |
PollingIntervalMs |
1000 |
處理每個變更批次之間的延遲以毫秒為單位。 (1,000 毫秒為 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 Functions 的工具會提供將 local.settings.json 檔案中的設定與部署專案之函式應用程式中 的應用程式設定 同步處理的方式。
| 設定 | 預設 | 描述 |
|---|---|---|
MySql_Trigger_BatchSize |
100 |
在觸發程序迴圈的每個反覆專案處理變更數目上限,再傳送至觸發的函式。 |
MySql_Trigger_PollingIntervalMs |
1000 |
處理每個變更批次之間的延遲以毫秒為單位。 (1,000 毫秒為 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
}
}
設定變更追蹤 (必要)
設定要與「適用於 MySQL 的 Azure 資料庫」觸發程式搭配使用的變更追蹤,需要您使用函式在數據表中新增數據行。 您可以從任何支援執行查詢的 MySQL 工具完成這些步驟,包括 Visual Studio Code 或 Azure Data Studio。
適用於 MySQL 的 Azure 資料庫觸發程式系結會使用 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。 如果任一主鍵數據行具有相同的名稱,結果就會是列出衝突的錯誤訊息。 在此情況下,必須重新命名列出的主鍵數據行,觸發程式才能運作。
啟用運行時間驅動調整
或者,您的函式可以根據擱置中的變更數目自動調整,以在用戶數據表中處理。 若要在您使用適用於 MySQL 的 Azure 資料庫觸發程式時,讓函式在進階方案上正確調整規模,您必須啟用運行時間調整監視。
在 Azure 入口網站的函式應用程式中,選取 [ 組態]。
在 [ 函式運行時間設定 ] 索引標籤上,針對 [ 運行時間調整監視],選取 [ 開啟]。
重試支援
啟動重試
如果啟動期間發生例外狀況,主機運行時間會自動嘗試使用指數輪詢策略重新啟動觸發程式接聽程式。 這些重試會繼續執行,直到接聽程式成功啟動或取消啟動為止。
函式例外狀況重試
如果在變更處理期間使用者函式中發生例外狀況,則會在 60 秒內重試目前正在處理的數據列批次。 在此期間,其他變更會正常處理,但造成例外狀況的批次中的數據列會忽略,直到逾時期間經過為止。
如果特定數據列的函式執行連續五次失敗,則所有未來的變更都會忽略該數據列。 由於批次中的數據列不具決定性,失敗批次中的數據列可能會在後續叫用中以不同的批次結束。 此行為表示失敗批次中的所有數據列不一定會被忽略。 如果批次中的其他數據列造成例外狀況,則「良好」數據列最終可能會出現在未來調用中不會失敗的不同批次中。