- 使用APIG觸發器調用一個返回String的FunctionGraph函數,報500錯誤,該如何解決?
- DIS觸發器中起始位置LATEST和TRIM_HORIZON是什么意思?
- Python函數有中文注釋報亂碼錯誤,該如何解決?
- 為什么無法通過API調用更新OBS觸發器狀態?
- 使用APIG觸發器,函數如何獲取請求路徑或請求參數?
- FunctionGraph和kafka必須在同一個子網內,才可以在FunctionGraph中配置Kafka觸發器嗎?
- 能否在函數代碼中使用線程和進程?
- FunctionGraph函數工程打包有哪些規范(限制)?
- ZIP工程包示例
- HTTP函數bootstrap啟動文件如何創建?
- FunctionGraph函數的執行需要多長時間?
- FunctionGraph函數的執行包含了哪些過程?
- FunctiongGraph函數的并發處理過程是什么?
- FunctiongGraph函數如何處理長時間不執行的實例?
- 首次訪問函數慢,如何優化?
- 怎樣獲取在函數運行過程中實際使用了多少內存?
- 為什么第一次請求會比較慢?
- 如何讀取函數的請求頭?
- 為什么函數實際使用內存大于預估內存,甚至觸發OOM?
- 函數內存超限返回“runtime memory limit exceeded”,如何查看內存占用大小?
- 如何定位自定義鏡像執行失敗“CrashLoopBackOff”的原因?
- 用戶使用相同的鏡像名更新鏡像,預留實例無法自動更新,會一直使用老鏡像,應如何處理?
- FunctionGraph函數是否支持環境變量?
- 能否在函數環境變量中存儲敏感信息?
使用APIG觸發器調用一個返回String的FunctionGraph函數,報500錯誤,該如何解決?
FunctionGraph函數對來自APIG調用的返回結果進行了封裝,APIG觸發器要求函數的返回結果中必須包含body(String)、statusCode(int)、headers(Map)和isBase64Encoded(boolean),才可以正確返回。
Node.js函數APIG觸發器調用返回結果定義示例如下:
exports.handler = function (event, context, callback) {
const response = {
'statusCode': 200,
'isBase64Encoded': false,
'headers': {
"Content-type": "application/json"
},
'body': 'Hello, FunctionGraph with APIG',
}
callback(null, response);
}
Java函數APIG觸發器調用返回結果定義示例如下:
import java.util.Map;
public HttpTriggerResponse index(String event, Context context){
String body = "<html><title>FunctionStage</title>"
+ "<h1>This is a simple APIG trigger test</h1><br>"
+ "<h2>This is a simple APIG trigger test</h2><br>"
+ "<h3>This is a simple APIG trigger test</h3>"
+ "</html>";
int code = 200;
boolean isBase64 = false;
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "text/html; charset=utf-8");
return new HttpTriggerResponse(body, headers, code, isBase64);
}
class HttpTriggerResponse {
private String body;
private Map<String, String> headers;
private int statusCode;
private boolean isBase64Encoded;
public HttpTriggerResponse(String body, Map<String,String> headers, int statusCode, boolean isBase64Encoded){
this.body = body;
this.headers = headers;
this.statusCode = statusCode;
this.isBase64Encoded = isBase64Encoded;
}
}
DIS觸發器中起始位置LATEST和TRIM_HORIZON是什么意思?
起始位置對應DIS服務中的游標類型,用來選擇從DIS通道中讀取數據的位置:
- TRIM_HORIZON:從最早被存儲至分區的有效記錄開始讀取。
例如,某租戶使用DIS的通道,分別上傳了三條數據A1,A2,A3。N天后(設定A1已過期,A2和A3仍在有效期范圍內),該租戶需要下載此三條數據,并選擇了TRIM_HORIZON這種下載方式。那么用戶可下載的數據將從A2開始讀取。
- LATEST:從分區中的最新記錄開始讀取,此設置可以保證總是讀到分區中最新記錄。
Python函數有中文注釋報亂碼錯誤,該如何解決?
使用Python語言在線編輯代碼,需要輸出中文時,請在編輯器中增加如下代碼:
# -*- coding:utf-8 -*-
import json
def handler (event, context):
output = 'Hello message: ' + json.dumps(event,ensure_ascii=False)
return output
為什么無法通過API調用更新OBS觸發器狀態?
OBS不支持pull類型觸發器,所以不能開啟和禁用。
使用APIG觸發器,函數如何獲取請求路徑或請求參數?
請求路徑或請求參數默認攜帶在event的入參中,FunctionGraph函數對APIG調用的傳入值為函數自帶的事件模板。您可以通過打印函數執行結果,獲取請求路徑或請求參數。
示例:

- queryStringParameters:GET請求中URL后面要帶的參數,當發起一次GET請求時,參數會以url string的形式進行傳遞。即?后的字符串則為其請求參數,并以&作為分隔符。
- path:API訪問地址。
您可以直接通過請求路徑調用://464d86ec641d45a683c5919ac57f3823.apig.projectID.huaweicloudapis.com/apig-demo/subpath
也可以通過添加請求參數調用:
//464d86ec641d45a683c5919ac57f3823.apig.projectID.huaweicloudapis.com/apig-demo/subpath?a=1&b=2
FunctionGraph和kafka必須在同一個子網內,才可以在FunctionGraph中配置Kafka觸發器嗎?
是必須的。在創建函數的時候會判斷子網是否相同,不允許一個VPC的不同子網進行連接。
能否在函數代碼中使用線程和進程?
用戶可使用編程語言和操作系統的功能,在函數中創建額外的線程和進程。
FunctionGraph函數工程打包有哪些規范(限制)?
函數除了支持在線編輯代碼,還支持上傳ZIP、JAR、引入OBS文件等方式上傳代碼。
打包規范說明
函數除了支持在線編輯代碼,還支持上傳ZIP、JAR、引入OBS文件等方式上傳代碼,函數工程的打包規范說明如表下表所示。
函數工程打包規范
| 編程語言 | JAR包 | ZIP包 | OBS文件 |
|---|---|---|---|
| Node.js | 不支持該方式 | 假如函數工程文件保存在“~/Code/”文件夾下,在打包的時候務必進入Code文件夾下選中所有工程文件進行打包,這樣做的目的是:入口函數是程序執行的入口,確保解壓后,入口函數所在的文件位于根目錄。 如果函數工程引入了第三方依賴,可以將第三方依賴打成ZIP包,在函數代碼界面設置外部依賴包;也可以將第三方依賴和函數工程文件一起打包。 |
將工程打成ZIP包,上傳到OBS存儲桶。 |
| Python 2.7 | 不支持該方式 | 假如函數工程文件保存在“~/Code/”文件夾下,在打包的時候務必進入Code文件夾下選中所有工程文件進行打包,這樣做的目的是:入口函數是程序執行的入口,確保解壓后,入口函數所在的文件位于根目錄。 如果函數工程引入了第三方依賴,可以將第三方依賴打成ZIP包,在函數代碼界面設置外部依賴包;也可以將第三方依賴和函數工程文件一起打包。 |
將工程打成ZIP包,上傳到OBS存儲桶。 |
| Python 3.6 | 不支持該方式 | 假如函數工程文件保存在“~/Code/”文件夾下,在打包的時候務必進入Code文件夾下選中所有工程文件進行打包,這樣做的目的是:入口函數是程序執行的入口,確保解壓后,入口函數所在的文件位于根目錄。 如果函數工程引入了第三方依賴,可以將第三方依賴打成ZIP包,在函數代碼界面設置外部依賴包;也可以將第三方依賴和函數工程文件一起打包。 |
將工程打成ZIP包,上傳到OBS存儲桶。 |
| Java 8 | 如果函數沒有引用第三方件, 可以直接將函數工程編譯成Jar包。 |
如果函數引用第三方件,將函數工程編譯成Jar包后,將所有依賴三方件和函數jar包打成ZIP包。 | 將工程打成ZIP包,上傳到OBS存儲桶。 |
| Go 1.x | 不支持該方式 | 必須在編譯之后打zip包,編譯后的二進制文件必須與執行函數入口保持一致,例如二進制名稱為Handler,則執行入口為Handler。 | 將工程打成ZIP包,上傳到OBS存儲桶。 |
ZIP工程包示例
-
Nods.js工程ZIP包目錄示例
Example.zip 示例工程包 |--- lib 業務文件目錄 |--- node_modules npm三方件目錄 |--- index.js 入口js文件(必選) |--- package.json npm項目管理文件 -
Python工程ZIP包目錄示例
Example.zip 示例工程包 |--- com 業務文件目錄 |--- PLI 第三方依賴PLI目錄 |--- index.py 入口py文件(必選) |--- watermark.py 實現打水印功能的py文件 |--- watermark.png 水印圖片 -
Java工程ZIP包目錄示例
Example.zip 示例工程包 |--- obstest.jar 業務功能JAR包 |--- esdk-obs-java-3.20.2.jar 第三方依賴JAR包 |--- jackson-core-2.10.0.jar 第三方依賴JAR包 |--- jackson-databind-2.10.0.jar 第三方依賴JAR包 |--- log4j-api-2.12.0.jar 第三方依賴JAR包 |--- log4j-core-2.12.0.jar 第三方依賴JAR包 |--- okhttp-3.14.2.jar 第三方依賴JAR包 |--- okio-1.17.2.jar 第三方依賴JAR包 -
Go工程ZIP包目錄示例
Example.zip 示例工程包 |--- testplugin.so 業務功能包 -
C#工程ZIP包目錄示例
Example.zip 示例工程包 |--- fssExampleCsharp2.0.deps.json 工程編譯產生文件 |--- fssExampleCsharp2.0.dll 工程編譯產生文件 |--- fssExampleCsharp2.0.pdb 工程編譯產生文件 |--- fssExampleCsharp2.0.runtimeconfig.json 工程編譯產生文件 |--- Handler 幫助文件,可直接使用 |--- HC.Serverless.Function.Common.dll 函數工作流提供的dll -
定制運行時
Example.zip 示例工程包 |--- bootstrap 可執行引導文件
HTTP函數bootstrap啟動文件如何創建?
如果您需要創建HTTP函數,需要用到bootstrap啟動文件,具體創建方法請參考創建HTTP函數。
FunctionGraph函數的執行需要多長時間?
調用函數的執行時間在900秒內,FunctionGraph函數默認的執行超時時間為3秒,您可以自行設置執行超時時間為3 ~ 900秒之間的任何整數。如果執行超時時間設置為3秒,超過3秒后,函數將終止執行。
FunctionGraph函數的執行包含了哪些過程?
FunctionGraph函數的執行過程包含兩步:
- 選擇一個相應內存的空閑實例。
- 執行用戶的指定運行代碼。
FunctiongGraph函數的并發處理過程是什么?
FunctionGraph會根據實際的請求情況自動彈性伸縮函數實例,并發變高時,會分配更多的函數實例來處理請求,并發減少時,相應的實例也會變少。
FunctiongGraph函數如何處理長時間不執行的實例?
如果一個函數在一段時間內一直沒有執行,那么所有與之相關的實例都會被釋放。
首次訪問函數慢,如何優化?
如果您使用的是C#或者Go語言,因為機制原因,啟動速度會比其他語言慢。此時,您可以通過以下設置,增加運行速度。
- 適當增加函數的內存。
- 精簡函數代碼,例如:刪除不必要的依賴包。
- 使用C#語言時,除了以上兩種方法,在非并發場景下,您還可以通過以下方法增加運行速度。
創建一個一分鐘一次的定時觸發器,確保至少有一個存活的實例。
怎樣獲取在函數運行過程中實際使用了多少內存?
函數調用的返回信息中會包含最大內存消耗等信息。也可以在執行結果界面查看。
為什么第一次請求會比較慢?
因為函數是冷啟動的,所以如果有初始化或者函數中有第一次執行比較耗時的操作,第一次請求會比較慢,后面接著的請求就會很快,因為此時容器還沒有銷毀。如果間隔一分鐘沒有請求,容器就會銷毀。
如何讀取函數的請求頭?
函數入口中的第一個參數里面包含請求頭,您可以打印函數執行結果,從而獲取想要的字段。
如下圖,event為函數入口的第一個參數,headers為請求頭。

為什么函數實際使用內存大于預估內存,甚至觸發OOM?
- 函數調用過程中,運行時會解析和緩存傳入的event事件, 這部分操作會消耗額外的內存。
- 函數調用結束后,回收的內存首先會放入內部內存池中,并不一定歸還給操作系統,導致內存偏高,在高并發場景下這種現象會更加明顯。
函數內存超限返回“runtime memory limit exceeded”,如何查看內存占用大小?
請在函數請求返回界面查看。
查看oom內存大小

如何定位自定義鏡像執行失敗“CrashLoopBackOff”的原因?
若出現“CrashLoopBackOff: The application inside the container keeps crashing”錯誤字段:
- 請根據頁面提示信息診斷原因。
查看執行結果

- 請參見開發HTTP函數示例章節進行容器鏡像自驗證。
- 排查鏡像是否為x86 linux架構,目前僅支持x86 linux架構鏡像。
用戶使用相同的鏡像名更新鏡像,預留實例無法自動更新,會一直使用老鏡像,應如何處理?
建議使用非latest的鏡像tag管理鏡像更新。避免使用完全相同的鏡像名。
FunctionGraph函數是否支持環境變量?
創建函數時可以設置環境變量,無需對代碼進行任何更改,可以設置動態參數,傳遞到函數代碼和庫。
能否在函數環境變量中存儲敏感信息?
定義環境變量時,系統會明文展示所有輸入信息,請不要輸入敏感信息(如賬戶密碼等),以防止信息泄露。