- 使用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访问地址。
您可以直接通过请求路径调用:https://464d86ec641d45a683c5919ac57f3823.apig.projectID.huaweicloudapis.com/apig-demo/subpath
也可以通过添加请求参数调用:
https://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函数是否支持环境变量?
创建函数时可以设置环境变量,无需对代码进行任何更改,可以设置动态参数,传递到函数代码和库。
能否在函数环境变量中存储敏感信息?
定义环境变量时,系统会明文展示所有输入信息,请不要输入敏感信息(如账户密码等),以防止信息泄露。