Tablestore, Apsara sistemi üzerine inşa edilmiş dağıtık bir NoSQL veri depolama hizmetidir. Tablestore tetikleyicisi, Tablestore'u Function Compute için bir olay kaynağı olarak bağlar. Bir Tablestore tablosundaki veriler değiştiğinde tetikleyici, artımlı verileri işlemek üzere işlevinizi otomatik olarak çağırır; yoklama (polling) gerekmez.
Tipik kullanım senaryosu: Bir veri kaynağı A Tablosuna yazar. Güncelleme, verileri temizlemek ve sonuçları doğrudan okumaya hazır olacak şekilde B Tablosuna yazmak için bir işlevi tetikler. Tüm işlem hattı esnek ve ölçeklenebilir bir sunucusuz uygulama olarak çalışır.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Function Compute içinde bir işlev. Bkz. İşlev oluşturma.
Bir Tablestore örneği. Bkz. Örnek oluşturma.
Bu örnek içinde bir tablo. Bkz. Tablo oluşturma.
Sınırlamalar
Tablestore tetikleyicileri aşağıdaki bölgelerde desteklenir: Çin (Pekin), Çin (Hangzhou), Çin (Şanghay), Çin (Shenzhen), Japonya (Tokyo), Singapur, Almanya (Frankfurt) ve Çin (Hong Kong).
Tablestore tablosu işlevle aynı bölgede bulunmalıdır.
Tablestore tetikleyicisi tarafından çağrılan işlev yürütmesi 1 dakikayı aşamaz.
Tablestore'a dahili ağ üzerinden erişmek için şu biçimde bir Sanal Özel Cloud (VPC) uç noktası kullanın:
{instance}.{region}.vpc.tablestore.aliyuncs.com.
Kullanım notları
Çağrı döngülerinden kaçının. Bir işlev kendisini tetikleyen aynı tabloya geri yazarsa (örneğin A Tablosu B İşlevini tetikler ve B İşlevi A Tablosunu güncellerse) tetikleyici tekrar devreye girerek sonsuz bir döngü oluşturur. Veri akışınızı işlev çıktısının farklı bir tabloya gideceği şekilde tasarlayın.
Hata durumunda yeniden deneme davranışı. Bir işlev yürütmesi başarısız olursa tetikleyici, Tablestore'daki günlük verilerinin süresi dolana kadar yeniden dener.
Aşağıdaki durumlarda işlev yürütme hatası oluşur:
Bir işlev örneği başlar ancak kod beklendiği gibi çalışmaz. Bu durumda örnek için ücretlendirilirsiniz.
Bir işlev örneği başlatılamaz (örneğin başlatma komutu hatası nedeniyle). Bu durumda ücretlendirilmezsiniz.
Sonsuz yeniden denemeleri durdurmak için veri tablosunun Akış özelliğini devre dışı bırakın. Akışı devre dışı bırakmadan önce başka hiçbir tetikleyicinin aynı tabloyu kullanmadığından emin olun.
Adım 1: Veri tablosu için Akış özelliğini etkinleştirin
Tablestore Akış özelliği artımlı veri değişikliklerini yakalar ve bunları işlevinize iletir. Tetikleyiciyi oluşturmadan önce veri tablosunda bu özelliği etkinleştirin.
Tablestore konsolu üzerinde oturum açın.
Üst gezinme çubuğunda bir bölge seçin.
Overview sayfasında örnek takma adına tıklayın veya Actions sütunundaki Manage Instance seçeneğine tıklayın.
Instance Details sekmesinde Data Tables sekmesine tıklayın. Ardından tablo adına tıklayın ve Stream sekmesini seçin ya da
simgesine tıklayıp Stream öğesini seçin.Stream sekmesinde Stream Information yanındaki Enable seçeneğine tıklayın.
Enable Stream iletişim kutusunda Log Expiration Time parametresini ayarlayın ve Enable seçeneğine tıklayın. Değer saat cinsinden sıfırdan farklı bir tamsayı olmalıdır. Maksimum değer 168 saattir.
Günlük Son Kullanma Süresi ayarlandıktan sonra değiştirilemez. Seçiminizi dikkatlice yapın.
Adım 2: Tablestore tetikleyicisi oluşturun
Function Compute konsolu üzerinde oturum açın. Sol gezinme bölmesinde Functions seçeneğine tıklayın.
Üst gezinme çubuğunda bir bölge seçin. Functions sayfasında yapılandırmak istediğiniz işleve tıklayın.
İşlev ayrıntıları sayfasında Configurations sekmesine tıklayın. Sol gezinme bölmesinde Triggers seçeneğine tıklayın ardından Create Trigger seçeneğine tıklayın.
Create Trigger panelinde aşağıdaki parametreleri yapılandırın ve OK seçeneğine tıklayın.
| Parameter | Description | Example |
|---|---|---|
| Trigger type | Tetikleyici türü. Tablestore seçeneğini belirleyin. | Tablestore |
| Name | Tetikleyicinin adı. | Tablestore-trigger |
| Version or alias | Bağlanacak işlev sürümü veya diğer adı. Varsayılan: LATEST. Farklı bir sürüm veya diğer ad bağlamak için işlev ayrıntıları sayfasındaki Version or Alias açılır listesinden seçim yapın. Bkz. Sürümleri yönetme ve Diğer adları yönetme. | LATEST |
| Instance | Mevcut Tablestore örneğinin adı. | d00dd8xm\\\\ |
| Table | Mevcut tablonun adı. | mytable |
| Role name | Function Compute'a Tablestore Akışından okuma izni veren RAM rolü. AliyunTableStoreStreamNotificationRole seçeneğini belirleyin. | AliyunTableStoreStreamNotificationRole |
Bu türde bir tetikleyiciyi ilk kez oluşturuyorsanız görünen iletişim kutusunda Authorize Now seçeneğine tıklayın.
Tetikleyici oluşturulduktan sonra Triggers sekmesinde görünür. Bir tetikleyiciyi değiştirmek veya silmek için bkz. Tetikleyici yönetimi.
Adım 3: Test parametrelerini yapılandırın
Tablestore'dan veri gelmeden önce işlevi test etmek için Tablestore tetikleyicisi yük formatıyla eşleşen bir test olayı yapılandırın.
İşlev ayrıntıları sayfasının Code sekmesinde Test Function yanındaki
simgesine tıklayın ve Configure Test Parameters seçeneğini belirleyin.Configure Test Parameters panelinde Create New Test Event veya Modify Existing Test Event seçeneğine tıklayın bir olay adı ve olay içeriği girin ardından OK seçeneğine tıklayın.
Tablestore tetikleyicisi artımlı verileri Concise Binary Object Representation (CBOR) formatında kodlar ve bunları işlevinize bir olay olarak iletir. Aşağıdaki örnekte yapıların işleme göre nasıl değiştiğini görebilmeniz için üç kayıt türü — PutRow, UpdateRow ve DeleteRow — içeren bir yük gösterilmektedir:
{
"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": []
}
]
}
Aşağıdaki tabloda olay alanları açıklanmaktadır.
| Field | Description |
|---|---|
Version |
Yük sürümü. Değer: Sync-v1 (dize). |
Records |
Artımlı veri satırlarından oluşan bir dizi. Her öğe Type, Info, PrimaryKey ve Columns içerir. |
Type (row) |
Satır için işlem türü. Geçerli değerler: PutRow, UpdateRow, DeleteRow (dize). |
Info |
Satır meta verileri. Timestamp içerir: satırın en son değiştirildiği UTC zamanı (INT64). |
PrimaryKey |
Birincil anahtar sütunlarından oluşan bir dizi. Her öğe ColumnName (dize) ve Value (INTEGER, STRING veya BLOB) içerir. |
Columns |
Öznitelik sütunlarından oluşan bir dizi. Her öğe şunları içerir: Type (sütun üzerindeki işlem: Put, DeleteOneVersion veya DeleteAllVersions), ColumnName (dize), Value (INTEGER, BOOLEAN, DOUBLE, STRING veya BLOB) ve Timestamp (en son değişikliğin UTC zamanı, INT64). |
Adım 4: İşlev kodunu yazın ve test edin
Tetikleyici oluşturulduktan sonra Tablestore olay yükünü işlemek üzere işlev kodunuzu yazın. Tablodaki veriler değiştiğinde işlev otomatik olarak çağrılır.
-
İşlev ayrıntıları sayfasında Code sekmesine tıklayın işlev kodunuzu girin ve Deploy seçeneğine tıklayın. Aşağıdaki Python örneği Tablestore olay kayıtlarını okur ve birincil anahtar ile öznitelik sütunu değerlerini çıkarır:
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' Test Function seçeneğine tıklayın.
Yürütmeden sonra sonuçları Code sekmesinde görüntüleyin.
SSS
Belirli bir bölgede tetikleyici oluşturma neden başarısız oluyor?
Tablestore tetikleyicileri yalnızca belirli bölgelerde kullanılabilir. Bölgenizin desteklendiğini doğrulamak için Sınırlamalar bölümünü kontrol edin.
Tetikleyici oluştururken Tablestore tablomu neden bulamıyorum?
Tablestore tablosu işlevle aynı bölgede bulunmalıdır. Tablo farklı bir bölgedeyse tetikleyici yapılandırmasında görünmez.
Neden sürekli olarak "Invocation canceled by client" hataları görüyorum?
Bu hata genellikle istemci tarafı zaman aşımının gerçek işlev yürütme süresinden daha kısa olduğunu gösterir. İstemci zaman aşımı süresini artırın. Ayrıntılar için bkz. İstemcinin bağlantısı kesilir ve "Invocation canceled by client" mesajı raporlanırsa ne yapmalıyım?
Tabloya veri yazıldıktan sonra Tablestore tetikleyicim neden çalışmıyor?
Aşağıdakileri kontrol edin:
Tablo için Akış özelliğinin etkinleştirildiğini doğrulayın. Bkz. Adım 1: Veri tablosu için Akış özelliğini etkinleştirin.
Tetikleyici oluşturulurken doğru rolün (
AliyunTableStoreStreamNotificationRole) yapılandırıldığını doğrulayın. Bkz. Adım 2: Tablestore tetikleyicisi oluşturun.Yürütmenin başarısız olup olmadığını görmek için işlev çalıştırma günlüklerini kontrol edin. İşlev tekrar tekrar başarısız olursa günlük verilerinin süresi dolana kadar yeniden dener. Bkz. Bir tetikleyici işlev yürütmeyi tetikleyemiyorsa ne yapmalıyım?