Aerospike 支持在數據庫服務端執行 Lua 腳本(UDF),實現數據處理下推,減少網絡傳輸。C 客戶端提供 aerospike_udf_put() 注冊/更新、aerospike_udf_remove() 移除 UDF 模塊的完整 API。本文詳解從讀取 Lua 文件到集群分發驗證的完整代碼流程。
aerospike_udf_put(as, &err, policy, module_name, AS_UDF_TYPE_LUA, &udf_content):注冊或更新 UDF 模塊。模塊名在集群內唯一。aerospike_udf_remove(as, &err, policy, module_name):從集群移除 UDF 模塊。註:目前僅支持 Lua 語言(AS_UDF_TYPE_LUA)。
FILE* fp = fopen("myudf.lua", "r");
if (!fp) { /* 錯誤處理 */ }
uint8_t* content = (uint8_t*)malloc(1024 * 1024); // 1MB 緩衝
uint8_t* p_write = content;
int read, size = 0;
while ((read = fread(p_write, 1, 512, fp)) > 0) {
size += read;
p_write += read;
}
fclose(fp);
// 包裝為 as_bytes 對象(零拷貝)
as_bytes udf_content;
as_bytes_init_wrap(&udf_content, content, size, true); // true: 釋放時 free 內存
as_error err;
if (aerospike_udf_put(&as, &err, NULL, "myudf", AS_UDF_TYPE_LUA, &udf_content) != AEROSPIKE_OK) {
fprintf(stderr, "UDF 注冊失敗: %d - %s\n", err.code, err.message);
}
// 釋放 as_bytes 包裝器(會自動 free 內容緩衝區)
as_bytes_destroy(&udf_content);
關鍵機制:調用將 UDF 發送到集群任一節點,該節點負責通過 gossip 協議將 UDF **自動傳播到所有節點**。通常幾秒內全集群生效。
同名調用 aerospike_udf_put() 即可覆蓋更新,版本號自動遞增,集群自動滾動升級。
推薦使用 aql (Aerospike Query Language) 工具**:
$ aql -c "SHOW MODULES"
-- 或
$ aql -c "DESCRIBE MODULE myudf"
as_error err;
if (aerospike_udf_remove(&as, &err, NULL, "myudf") != AEROSPIKE_OK) {
fprintf(stderr, "UDF 移除失敗: %d - %s\n", err.code, err.message);
}
移除操作同樣會在集群內傳播,所有節點協同刪除模塊文件。
billing_, session_)避免衝突。as_bytes_init_wrap 最後一個參數 true 表示銷燬時自動 free(),若緩衝區為靜態/棧內存需設為 false 並手動管理。as_error 結構體,常見錯誤碼:ERR_UDF (UDF 編譯錯誤)、ERR_CLIENT (網絡/參數錯誤)。Aerospike C 客戶端 UDF 管理 API 設計簡潔:文件讀取 → as_bytes 包裝 → udf_put 注冊 → aql 驗證 → udf_remove 清理。掌握零拷貝內存包裝、集群自動傳播機制、版本更新語義,即可在生產環境安全高效地管理服務端 Lua 計算邏輯,實現計算下推、降低延遲、節省帶寬。