Tablestore adalah layanan penyimpanan data NoSQL terdistribusi yang dibangun di atas sistem Apsara. Pemicu Tablestore menghubungkan Tablestore sebagai sumber event untuk Function Compute. Ketika data dalam tabel Tablestore berubah, pemicu tersebut secara otomatis memanggil fungsi Anda untuk memproses data inkremental—tanpa perlu polling.
Kasus penggunaan khas: sebuah sumber data menulis ke Tabel A. Pembaruan tersebut memicu fungsi untuk membersihkan data dan menulis hasilnya ke Tabel B, siap untuk dibaca langsung. Seluruh pipeline berjalan sebagai aplikasi arsitektur tanpa server yang elastis dan dapat diskalakan.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Fungsi di Function Compute. Lihat Buat fungsi.
Instans Tablestore. Lihat Buat instans.
Tabel dalam instans tersebut. Lihat Buat tabel.
Batasan
Pemicu Tablestore didukung di wilayah berikut: Tiongkok (Beijing), Tiongkok (Hangzhou), Tiongkok (Shanghai), Tiongkok (Shenzhen), Jepang (Tokyo), Singapura, Jerman (Frankfurt), dan Tiongkok (Hong Kong).
Tabel Tablestore harus berada di wilayah yang sama dengan fungsi.
Eksekusi fungsi yang dipicu oleh pemicu Tablestore tidak boleh melebihi 1 menit.
Untuk mengakses Tablestore melalui jaringan internal, gunakan titik akhir Virtual Private Cloud (VPC) dalam format:
{instance}.{region}.vpc.tablestore.aliyuncs.com.
Catatan penggunaan
Hindari loop pemanggilan. Jika suatu fungsi menulis kembali ke tabel yang sama yang memicunya—misalnya, Tabel A memicu Fungsi B, dan Fungsi B memperbarui Tabel A—pemicu akan aktif kembali, menciptakan loop tak terbatas. Rancang alur data Anda agar output fungsi ditujukan ke tabel yang berbeda.
Perilaku pengulangan saat gagal. Jika eksekusi fungsi gagal, pemicu akan mencoba ulang hingga data log di Tablestore kedaluwarsa.
Kegagalan eksekusi fungsi terjadi dalam salah satu situasi berikut:
Instans fungsi dimulai tetapi kode tidak berjalan seperti yang diharapkan. Dalam kasus ini, biaya dikenakan untuk instans tersebut.
Instans fungsi gagal dimulai (misalnya, karena kesalahan perintah startup). Dalam kasus ini, tidak ada biaya yang dikenakan.
Untuk menghentikan pengulangan tak terbatas, nonaktifkan fitur Stream untuk tabel data tersebut. Sebelum menonaktifkan Stream, pastikan tidak ada pemicu lain yang menggunakan tabel yang sama.
Langkah 1: Aktifkan fitur Stream untuk tabel data
Fitur Stream Tablestore menangkap perubahan data inkremental dan mengirimkannya ke fungsi Anda. Aktifkan fitur ini pada tabel data sebelum membuat pemicu.
Masuk ke Konsol Tablestore.
Di bilah navigasi atas, pilih wilayah.
Di halaman Ikhtisar, klik alias instans atau klik Manage Instance di kolom Actions.
Di tab Instance Details, klik tab Data Tables. Lalu klik nama tabel dan pilih tab Stream, atau klik
dan pilih Stream.Di tab Stream, klik Enable di samping Informasi Stream.
Di kotak dialog Enable Stream, atur parameter Log Expiration Time dan klik Enable. Nilainya harus berupa bilangan bulat bukan nol dalam satuan jam. Maksimum: 168 jam.
Waktu kedaluwarsa log tidak dapat diubah setelah diatur. Pilih dengan cermat.
Langkah 2: Buat pemicu Tablestore
Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Di halaman Functions, klik fungsi yang ingin Anda konfigurasi.
Di halaman detail fungsi, klik tab Configurations. Di panel navigasi kiri, klik Triggers, lalu klik Create Trigger.
Di panel Create Trigger, konfigurasikan parameter berikut dan klik OK.
| Parameter | Deskripsi | Contoh |
|---|---|---|
| Trigger type | Jenis pemicu. Pilih Tablestore. | Tablestore |
| Name | Nama pemicu. | Tablestore-trigger |
| Version or alias | Versi atau alias fungsi yang akan di-bind. Default: LATEST. Untuk mengikat versi atau alias berbeda, pilih dari daftar drop-down Version or Alias di halaman detail fungsi. Lihat Kelola versi dan Kelola alias. | LATEST |
| Instance | Nama instans Tablestore yang sudah ada. | d00dd8xm\*\*\*\* |
| Table | Nama tabel yang sudah ada. | mytable |
| Role name | Peran RAM yang memberikan izin kepada Function Compute untuk membaca dari Stream Tablestore. Pilih AliyunTableStoreStreamNotificationRole. | AliyunTableStoreStreamNotificationRole |
Jika ini pertama kalinya Anda membuat pemicu jenis ini, klik Authorize Now di kotak dialog yang muncul.
Setelah pemicu dibuat, pemicu tersebut akan muncul di tab Triggers. Untuk memodifikasi atau menghapus pemicu, lihat Manajemen pemicu.
Langkah 3: Konfigurasikan parameter uji
Untuk menguji fungsi sebelum data tiba dari Tablestore, konfigurasikan event uji yang sesuai dengan format muatan pemicu Tablestore.
Di tab Code halaman detail fungsi, klik ikon
di samping Test Function dan pilih Configure Test Parameters.Di panel Configure Test Parameters, klik Create New Test Event atau Modify Existing Test Event, masukkan nama event dan konten event, lalu klik OK.
Pemicu Tablestore menyandikan data inkremental dalam format Concise Binary Object Representation (CBOR) dan meneruskannya ke fungsi Anda sebagai event. Contoh berikut menunjukkan muatan dengan tiga tipe catatan — PutRow, UpdateRow, dan DeleteRow — sehingga Anda dapat melihat bagaimana struktur bervariasi berdasarkan operasi:
{
"Version": "Sync-v1",
"Records": [
{
"Type": "PutRow",
"Info": {
"Timestamp": 1506416585740836
},
"PrimaryKey": [
{
"ColumnName": "pk_0",
"Value": 1506416585881590900
},
{
"ColumnName": "pk_1",
"Value": "2017-09-26 17:03:05.8815909 +0800 CST"
},
{
"ColumnName": "pk_2",
"Value": 1506416585741000
}
],
"Columns": [
{
"Type": "Put",
"ColumnName": "attr_0",
"Value": "hello_table_store",
"Timestamp": 1506416585741
},
{
"Type": "Put",
"ColumnName": "attr_1",
"Value": 1506416585881590900,
"Timestamp": 1506416585741
}
]
},
{
"Type": "UpdateRow",
"Info": {
"Timestamp": 1506416600000000
},
"PrimaryKey": [
{
"ColumnName": "pk_0",
"Value": 1506416585881590900
}
],
"Columns": [
{
"Type": "Put",
"ColumnName": "attr_0",
"Value": "updated_value",
"Timestamp": 1506416600000
},
{
"Type": "DeleteOneVersion",
"ColumnName": "attr_1",
"Timestamp": 1506416585741
}
]
},
{
"Type": "DeleteRow",
"Info": {
"Timestamp": 1506416700000000
},
"PrimaryKey": [
{
"ColumnName": "pk_0",
"Value": 1506416585881590900
}
],
"Columns": []
}
]
}Tabel berikut menjelaskan field event tersebut.
| Field | Deskripsi |
|---|---|
Version | Versi muatan. Nilai: Sync-v1 (string). |
Records | Array baris data inkremental. Setiap elemen berisi Type, Info, PrimaryKey, dan Columns. |
Type (row) | Jenis operasi untuk baris tersebut. Nilai yang valid: PutRow, UpdateRow, DeleteRow (string). |
Info | Metadata baris. Berisi Timestamp: waktu UTC saat baris terakhir dimodifikasi (INT64). |
PrimaryKey | Array kolom kunci primer. Setiap elemen berisi ColumnName (string) dan Value (INTEGER, STRING, atau BLOB). |
Columns | Array kolom atribut. Setiap elemen berisi: Type (operasi pada kolom: Put, DeleteOneVersion, atau DeleteAllVersions), ColumnName (string), Value (INTEGER, BOOLEAN, DOUBLE, STRING, atau BLOB), dan Timestamp (waktu UTC modifikasi terakhir, INT64). |
Langkah 4: Tulis dan uji kode fungsi
Setelah pemicu dibuat, tulis kode fungsi Anda untuk memproses muatan event Tablestore. Fungsi tersebut akan dipanggil secara otomatis ketika data dalam tabel berubah.
Di halaman detail fungsi, klik tab Code, masukkan kode fungsi Anda, dan klik Deploy. Contoh Python berikut membaca catatan event Tablestore dan mengekstraksi nilai kolom kunci primer dan kolom atribut:
import logging import cbor import json def get_attribute_value(record, column): attrs = record[u'Columns'] for x in attrs: if x[u'ColumnName'] == column: return x['Value'] def get_pk_value(record, column): attrs = record[u'PrimaryKey'] for x in attrs: if x['ColumnName'] == column: return x['Value'] def handler(event, context): logger = logging.getLogger() logger.info("Begin to handle event") #records = cbor.loads(event) records = json.loads(event) for record in records['Records']: logger.info("Handle record: %s", record) pk_0 = get_pk_value(record, "pk_0") attr_0 = get_attribute_value(record, "attr_0") return 'OK'Untuk contoh dalam runtime Node.js, PHP, Java, dan C#, lihat Gunakan Tablestore untuk memicu Function Compute dalam runtime Node.js, PHP, Java, dan C#.
Klik Test Function.
Setelah eksekusi, lihat hasilnya di tab Code.
FAQ
Mengapa pembuatan pemicu gagal di wilayah tertentu?
Pemicu Tablestore hanya tersedia di wilayah tertentu. Periksa bagian Batasan untuk memastikan wilayah Anda didukung.
Mengapa saya tidak dapat menemukan tabel Tablestore saya saat membuat pemicu?
Tabel Tablestore harus berada di wilayah yang sama dengan fungsi. Jika tabel berada di wilayah berbeda, tabel tersebut tidak akan muncul dalam konfigurasi pemicu.
Mengapa saya terus melihat error "Invocation canceled by client"?
Error ini biasanya berarti timeout sisi klien lebih pendek daripada durasi eksekusi fungsi yang sebenarnya. Tingkatkan periode timeout klien. Untuk detailnya, lihat Apa yang harus saya lakukan jika klien terputus dan muncul pesan "Invocation canceled by client"?
Mengapa pemicu Tablestore saya tidak aktif setelah data ditulis ke tabel?
Periksa hal berikut:
Pastikan fitur Stream diaktifkan untuk tabel tersebut. Lihat Langkah 1: Aktifkan fitur Stream untuk tabel data.
Pastikan peran yang benar (
AliyunTableStoreStreamNotificationRole) dikonfigurasi saat membuat pemicu. Lihat Langkah 2: Buat pemicu Tablestore.Periksa log eksekusi fungsi untuk melihat apakah eksekusi gagal. Jika fungsi gagal berulang kali, sistem akan mencoba ulang hingga data log kedaluwarsa. Lihat Apa yang harus saya lakukan jika pemicu tidak dapat memicu eksekusi fungsi?