Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pengikatan pemicu Azure Database for MySQL memantau tabel pengguna untuk perubahan (penyisipan dan pembaruan) dan memanggil fungsi dengan data baris yang diperbarui.
Pengikatan pemicu Azure Database for MySQL menggunakan az_func_updated_at dan data kolom untuk memantau tabel pengguna untuk perubahan. Dengan demikian, Anda perlu mengubah struktur tabel untuk memungkinkan pelacakan perubahan pada tabel MySQL sebelum Anda menggunakan dukungan pemicu. Anda bisa mengaktifkan pelacakan perubahan pada tabel melalui kueri berikut. Misalnya, aktifkan pada Products tabel:
ALTER TABLE Products
ADD az_func_updated_at TIMESTAMP DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Tabel untuk sewa berisi semua kolom yang sesuai dengan kunci primer dari tabel pengguna dan tiga kolom lagi: az_func_AttemptCount, , az_func_LeaseExpirationTimedan az_func_SyncCompletedTime. Jika salah satu kolom kunci utama memiliki nama yang sama, hasilnya adalah pesan kesalahan yang mencantumkan konflik. Dalam hal ini, kolom kunci utama yang tercantum harus diganti namanya agar pemicu berfungsi.
Gambaran umum fungsionalitas
Ketika fungsi pemicu dimulai, fungsi ini memulai dua perulangan terpisah: perulangan polling perubahan dan perulangan perpanjangan sewa. Perulangan ini berjalan terus menerus sampai fungsi dihentikan.
Pengikatan pemicu Azure Database for MySQL menggunakan perulangan polling untuk memeriksa perubahan. Perulangan polling memicu fungsi pengguna saat mendeteksi perubahan. Pada tingkat tinggi, perulangan terlihat seperti contoh ini:
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
}
Perubahan diproses sesuai urutan pembuatannya. Perubahan terlama diproses terlebih dahulu. Pertimbangkan poin-poin ini tentang pemrosesan perubahan:
- Jika perubahan terjadi dalam beberapa baris sekaligus, urutan pasti di mana mereka dikirim ke fungsi didasarkan pada urutan
az_func_updated_atnaik kolom dan kolom kunci utama. - Perubahan di-batch untuk baris. Jika beberapa perubahan terjadi dalam baris antara setiap iterasi perulangan, hanya entri perubahan terbaru yang ada untuk baris tersebut yang dipertimbangkan.
Catatan
Saat ini, identitas terkelola tidak didukung untuk koneksi antara Azure Functions dan Azure Database for MySQL.
Contoh penggunaan
Sampel lainnya untuk pemicu Azure Database for MySQL tersedia di repositori GitHub.
Contoh mengacu pada Product kelas dan tabel database terkait:
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
);
Anda mengaktifkan pelacakan perubahan pada database dengan menambahkan satu kolom ke tabel:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Pemicu Azure Database for MySQL mengikat ke IReadOnlyList<MySqlChange<T>>, yang mencantumkan MySqlChange objek. Setiap objek memiliki dua properti:
-
Item: Item yang diubah. Jenis item harus mengikuti skema tabel, seperti yang terlihat diToDoItemkelas. -
Operation: Nilai dariMySqlChangeOperationenumerasi. Nilai yang mungkin adalahUpdateuntuk sisipan dan pembaruan.
Contoh berikut menunjukkan fungsi C# yang dipanggil saat perubahan terjadi dalam Product tabel:
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);
}
}
}
Contoh penggunaan
Sampel lainnya untuk pemicu Azure Database for MySQL tersedia di repositori GitHub.
Contohnya mengacu pada Product kelas, MySqlChangeProduct kelas, MySqlChangeOperation enumerasi, dan tabel database yang sesuai.
Dalam file terpisah bernama 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;
}
}
Dalam file terpisah bernama 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;
}
}
Dalam file terpisah bernama 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
);
Anda mengaktifkan pelacakan perubahan pada database dengan menambahkan kolom berikut ke tabel:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Pemicu Azure Database for MySQL mengikat ke MySqlChangeProduct[], yang merupakan array MySqlChangeProduct objek. Setiap objek memiliki dua properti:
-
item: Item yang diubah. Jenis item harus mengikuti skema tabel, seperti yang terlihat diProductkelas. -
operation: Nilai dariMySqlChangeOperationenumerasi. Nilai yang mungkin adalahUpdateuntuk sisipan dan pembaruan.
Contoh berikut menunjukkan fungsi Java yang dipanggil saat perubahan terjadi dalam Product tabel:
/**
* 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));
}
}
Contoh penggunaan
Sampel lainnya untuk pemicu Azure Database for MySQL tersedia di repositori GitHub.
Contoh mengacu pada Product tabel database:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Anda mengaktifkan pelacakan perubahan pada database dengan menambahkan satu kolom ke tabel:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Pemicu Azure Database for MySQL mengikat ke Product, yang mencantumkan objek. Setiap objek memiliki dua properti:
-
item: Item yang diubah. Struktur item mengikuti skema tabel. -
operation: Nilai yang mungkin adalahUpdateuntuk sisipan dan pembaruan.
Contoh berikut menunjukkan fungsi PowerShell yang dipanggil saat perubahan terjadi dalam Product tabel.
Contoh berikut adalah mengikat data dalam file function.json:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString"
}
],
"disabled": false
}
Bagian Konfigurasi menjelaskan properti ini.
Contoh berikut adalah contoh kode PowerShell untuk fungsi dalam file 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"
Contoh penggunaan
Sampel lainnya untuk pemicu Azure Database for MySQL tersedia di repositori GitHub.
Contoh mengacu pada Product tabel database:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Anda mengaktifkan pelacakan perubahan pada database dengan menambahkan satu kolom ke tabel:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Pemicu Azure Database for MySQL mengikat ke Changes, yang merupakan array objek. Setiap objek memiliki dua properti:
-
item: Item yang diubah. Struktur item mengikuti skema tabel. -
operation: Nilai yang mungkin adalahUpdateuntuk sisipan dan pembaruan.
Contoh berikut menunjukkan fungsi JavaScript yang dipanggil saat perubahan terjadi dalam Product tabel.
Contoh berikut adalah mengikat data dalam file function.json:
{
"bindings": [
{
"name": "changes",
"type": "mysqlTrigger",
"direction": "in",
"tableName": "Products",
"connectionStringSetting": "MySqlConnectionString",
}
],
"disabled": false
}
Bagian Konfigurasi menjelaskan properti ini.
Contoh berikut adalah contoh kode JavaScript untuk fungsi dalam index.js file:
module.exports = async function (context, changes) {
context.log(`MySql Changes: ${JSON.stringify(changes)}`)
}
Contoh penggunaan
Sampel lainnya untuk pemicu Azure Database for MySQL tersedia di repositori GitHub.
Contoh mengacu pada Product tabel database:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products (
ProductId int PRIMARY KEY,
Name varchar(100) NULL,
Cost int NULL
);
Anda mengaktifkan pelacakan perubahan pada database dengan menambahkan satu kolom ke tabel:
ALTER TABLE <table name>
ADD COLUMN az_func_updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Catatan
Anda harus menggunakan Azure Functions versi 1.22.0b4 untuk Python.
Pemicu Azure Database for MySQL mengikat ke variabel bernama Product, yang mencantumkan objek. Setiap objek memiliki dua properti:
-
item: Item yang diubah. Struktur item mengikuti skema tabel. -
operation: Nilai yang mungkin adalahUpdateuntuk sisipan dan pembaruan.
Contoh berikut menunjukkan fungsi Python yang dipanggil saat perubahan terjadi dalam Product tabel.
Contoh berikut adalah contoh kode Python untuk file 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))
Atribut
| Properti atribut | Deskripsi |
|---|---|
TableName |
Harus diisi. Nama tabel yang dipantau pemicu. |
ConnectionStringSetting |
Harus diisi. Nama pengaturan aplikasi yang berisi string koneksi untuk database yang berisi tabel yang dipantau untuk perubahan. Nama pengaturan string koneksi sesuai dengan pengaturan aplikasi (dalam local.settings.json untuk pengembangan lokal) yang berisi string koneksi ke Azure Database for MySQL. |
LeasesTableName |
Opsional. Nama tabel untuk menyimpan sewa. Jika tidak ditentukan, namanya adalah Leases_{FunctionId}_{TableId}. |
Anotasi
Di pustaka runtime fungsi Java, gunakan @MySQLTrigger anotasi pada parameter yang nilainya akan berasal dari Azure Database for MySQL. Anotasi ini mendukung elemen berikut:
| Elemen | Deskripsi |
|---|---|
name |
Harus diisi. Nama parameter yang diikat pemicu. |
tableName |
Harus diisi. Nama tabel yang dipantau pemicu. |
connectionStringSetting |
Harus diisi. Nama pengaturan aplikasi yang berisi string koneksi untuk database yang berisi tabel yang dipantau untuk perubahan. Nama pengaturan string koneksi sesuai dengan pengaturan aplikasi (dalam local.settings.json untuk pengembangan lokal) yang berisi string koneksi ke Azure Database for MySQL. |
LeasesTableName |
Opsional. Nama tabel untuk menyimpan sewa. Jika tidak ditentukan, namanya adalah Leases_{FunctionId}_{TableId}. |
Konfigurasi
Tabel berikut menjelaskan properti konfigurasi pengikatan yang Anda tetapkan dalam file function.json:
| Harta benda | Deskripsi |
|---|---|
name |
Harus diisi. Nama parameter yang diikat pemicu. |
type |
Harus diisi. Harus diatur ke MysqlTrigger. |
direction |
Harus diisi. Harus diatur ke in. |
tableName |
Harus diisi. Nama tabel yang dipantau pemicu. |
connectionStringSetting |
Harus diisi. Nama pengaturan aplikasi yang berisi string koneksi untuk database yang berisi tabel yang dipantau untuk perubahan. Nama pengaturan string koneksi sesuai dengan pengaturan aplikasi (dalam local.settings.json untuk pengembangan lokal) yang berisi string koneksi ke Azure Database for MySQL. |
LeasesTableName |
Opsional. Nama tabel untuk menyimpan sewa. Jika tidak ditentukan, namanya adalah Leases_{FunctionId}_{TableId}. |
Konfigurasi Opsional
Anda dapat mengonfigurasi pengaturan opsional berikut untuk pemicu Azure Database for MySQL untuk pengembangan lokal atau untuk penyebaran cloud.
host.json
Bagian ini menjelaskan pengaturan konfigurasi yang tersedia untuk pengikatan ini di versi 2.x dan yang lebih baru. Pengaturan dalam file host.json berlaku untuk semua fungsi dalam instans aplikasi fungsi. Untuk informasi selengkapnya tentang pengaturan konfigurasi aplikasi fungsi, lihat referensihost.json untuk Azure Functions.
| Pengaturan | Bawaan | Deskripsi |
|---|---|---|
MaxBatchSize |
100 |
Jumlah maksimum perubahan yang diproses dengan setiap perulangan pemicu sebelum dikirim ke fungsi yang dipicu. |
PollingIntervalMs |
1000 |
Penundaan dalam milidetik antara memproses setiap batch perubahan. (1.000 md adalah 1 detik.) |
MaxChangesPerWorker |
1000 |
Batas atas jumlah perubahan yang tertunda dalam tabel pengguna yang diizinkan per pekerja aplikasi. Jika jumlah perubahan melebihi batas ini, hal ini dapat mengakibatkan peluasan skala. Pengaturan hanya berlaku untuk aplikasi fungsi Azure dengan penskalaan berbasis runtime diaktifkan. |
Contoh file host.json
Berikut adalah contoh file host.json dengan pengaturan opsional:
{
"version": "2.0",
"extensions": {
"MySql": {
"MaxBatchSize": 300,
"PollingIntervalMs": 1000,
"MaxChangesPerWorker": 100
}
},
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
},
"logLevel": {
"default": "Trace"
}
}
}
local.setting.json
File local.settings.json menyimpan pengaturan dan pengaturan aplikasi yang digunakan alat pengembangan lokal. Pengaturan di file local.settings.json hanya digunakan saat Anda menjalankan proyek secara lokal. Saat Anda menerbitkan proyek ke Azure, pastikan juga untuk menambahkan pengaturan yang diperlukan ke pengaturan aplikasi untuk aplikasi fungsi.
Penting
Karena file local.settings.json mungkin berisi rahasia, seperti string koneksi, Anda tidak boleh menyimpannya di repositori jarak jauh. Alat yang mendukung Azure Functions menyediakan cara untuk menyinkronkan pengaturan dalam file local.settings.json dengan pengaturan aplikasi di aplikasi fungsi tempat proyek Anda disebarkan.
| Pengaturan | Bawaan | Deskripsi |
|---|---|---|
MySql_Trigger_BatchSize |
100 |
Jumlah maksimum perubahan yang diproses dengan setiap perulangan pemicu sebelum dikirim ke fungsi yang dipicu. |
MySql_Trigger_PollingIntervalMs |
1000 |
Penundaan dalam milidetik antara memproses setiap batch perubahan. (1.000 md adalah 1 detik.) |
MySql_Trigger_MaxChangesPerWorker |
1000 |
Batas atas jumlah perubahan yang tertunda dalam tabel pengguna yang diizinkan per pekerja aplikasi. Jika jumlah perubahan melebihi batas ini, hal ini dapat mengakibatkan peluasan skala. Pengaturan hanya berlaku untuk aplikasi fungsi Azure dengan penskalaan berbasis runtime diaktifkan. |
Contoh file local.settings.json
Berikut adalah contoh file local.settings.json dengan pengaturan opsional:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"MySqlConnectionString": "",
"MySql_Trigger_MaxBatchSize": 300,
"MySql_Trigger_PollingIntervalMs": 1000,
"MySql_Trigger_MaxChangesPerWorker": 100
}
}
Menyiapkan pelacakan perubahan (diperlukan)
Menyiapkan pelacakan perubahan untuk digunakan dengan pemicu Azure Database for MySQL mengharuskan Anda menambahkan kolom dalam tabel dengan menggunakan fungsi. Anda dapat menyelesaikan langkah-langkah ini dari alat MySQL apa pun yang mendukung menjalankan kueri, termasuk Visual Studio Code atau Azure Data Studio.
Pengikatan pemicu Azure Database for MySQL menggunakan az_func_updated_at dan data kolom untuk memantau tabel pengguna untuk perubahan. Dengan demikian, Anda perlu mengubah struktur tabel untuk memungkinkan pelacakan perubahan pada tabel MySQL sebelum Anda menggunakan dukungan pemicu. Anda bisa mengaktifkan pelacakan perubahan pada tabel melalui kueri berikut. Misalnya, aktifkan pada Products tabel:
ALTER TABLE Products;
ADD az_func_updated_at
TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP;
Tabel untuk sewa berisi semua kolom yang sesuai dengan kunci utama dari tabel pengguna dan dua kolom lagi: az_func_AttemptCount dan az_func_LeaseExpirationTime. Jika salah satu kolom kunci utama memiliki nama yang sama, hasilnya adalah pesan kesalahan yang mencantumkan konflik. Dalam hal ini, kolom kunci utama yang tercantum harus diganti namanya agar pemicu berfungsi.
Aktifkan penskalakan berbasis runtime
Secara opsional, fungsi Anda dapat menskalakan secara otomatis berdasarkan jumlah perubahan yang tertunda untuk diproses dalam tabel pengguna. Untuk memungkinkan fungsi Anda menskalakan dengan benar pada paket Premium saat Anda menggunakan pemicu Azure Database for MySQL, Anda perlu mengaktifkan pemantauan skala runtime.
Di portal Microsoft Azure, di aplikasi fungsi Anda, pilih Konfigurasi.
Pada tab Pengaturan runtime fungsi , untuk Pemantauan Skala Runtime, pilih Aktif.
Coba lagi dukungan
Percobaan ulang startup
Jika pengecualian terjadi selama startup, runtime host secara otomatis mencoba memulai ulang listener pemicu dengan strategi backoff eksponensial. Percobaan ulang ini berlanjut hingga pendengar berhasil dimulai atau pengaktifan dibatalkan.
Percobaan ulang pengecualian fungsi
Jika pengecualian terjadi dalam fungsi pengguna selama pemrosesan perubahan, batch baris yang saat ini sedang diproses dicoba lagi dalam 60 detik. Perubahan lain diproses seperti biasa selama waktu ini, tetapi baris dalam batch yang menyebabkan pengecualian diabaikan sampai periode waktu habis berlalu.
Jika eksekusi fungsi gagal lima kali berturut-turut untuk baris tertentu, baris tersebut diabaikan untuk semua perubahan di masa mendatang. Karena baris dalam batch tidak deterministik, baris dalam batch yang gagal mungkin berakhir dalam batch yang berbeda dalam pemanggilan berikutnya. Perilaku ini berarti bahwa tidak semua baris dalam batch yang gagal selalu diabaikan. Jika baris lain dalam batch menyebabkan pengecualian, baris "baik" mungkin berakhir dalam batch berbeda yang tidak gagal dalam pemanggilan di masa mendatang.