外观
代码开发
约 1799 字大约 6 分钟
2025-05-21
运行时提供针对不同语言在执行环境中运行的环境。运行时作为FuncX和您的函数之间的接力员,传递函数调用的事件(event)、上下文信息(context)和响应。您可以使用FuncX提供的运行时或构建您自己的运行时,还可以自行构建容器镜像(暂不支持)。
WebIDE在线开发
FuncX控制台提供了在线开发功能,您可以使用在线开发功能快速创建Web函数。
终端
FuncX控制台提供了终端功能,您可以使用终端功能快速执行相关命令。
运行时
在某些场景下,开发者可能需要使用非主流编程语言或特定版本的运行环境,此时可基于默认运行环境,打造专属运行环境。例如,定制个性化语言Rust或定制编程语言指定版本的运行环境Node.js 16。
默认运行环境
如需使用内置编程语言,需要配置环境变量方可使用。
名称 | 标识符 | 操作系统 | 架构 | 内置编程语言 |
---|---|---|---|---|
Debian12 | debian12 | Linux (Debian 12) | x86_64 | Python 3.11 (/usr/bin/python3) |
Debian11 | debian11 | Linux (Debian 11) | x86_64 | Python 3.12 (/var/fc/lang/python3.12) |
Debian10 | debian10 | Linux (Debian 10) | x86_64 | Node.js 20 (/var/fc/lang/nodejs20) Node.js 18 (/var/fc/lang/nodejs18) Python 3.10 (/var/fc/lang/python3.10) Python 2.7 |
Debian9 | debian9 | Linux (Debian 9) | x86_64 | Python 3.7.4 Node.js 10.16.2 OpenJDK 1.8.0 Ruby 2.7 Nginx 1.10.3 PHP 7.4.12 |
专属运行环境
当您打算使用某种语言打造专属运行环境时,但该语言不是内置语言时,您需要将该语言的解析器或运行时和代码文件一起打包部署到函数计算,实现您的预期目标。例如,当运行环境是Node.js 16时,您需要先下载Node.js 16所需的解释器到代码中,然后将打包后的代码部署到函数计算。具体操作如下。
- 下载Linux-x64版本的
node
到代码包目录。
wget http://mirrors.nju.edu.cn/nodejs/v16.14.2/node-v16.14.2-linux-x64.tar.gz -O node-v16.14.2-linux-x64.tar.gz && tar -zxvf node-v16.14.2-linux-x64.tar.gz && rm -rf node-v16.14.2-linux-x64.tar.gz
- 设置运行时使用
node
的启动命令。
给函数设置环境变量 PATH=/code/node-v16.14.2-linux-x64/bin:/usr/local/bin/apache-maven/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/ruby/bin。
设置完成后,可以直接使用node启动HTTP Server。
HTTP Server配置要求
创建HTTP Server时您需要满足以下要求:
- 启动的服务一定要监听0.0.0.0:CAPort或*:CAPort端口。如果您使用127.0.0.1:CAPort端口,会导致请求超时。 如果使用的监听端口是8080,那么您实现的HTTP Server监听的端口也必须是8080。
- Connection需要设置为Keep-Alive,Server端请求超时时间需设置在24小时(函数最大运行时间)及以上。示例如下:
//例如Node.js使用express时。
var server = app.listen(PORT, HOST);
server.timeout = 0; // never timeout
server.keepAliveTimeout = 0; // keepalive, never timeout
- HTTP Server需要在120秒内启动完毕。
基础信息
请求处理程序(HTTP Handler)
FuncX会将用户的请求,包括Method、Path、Body、Query和Headers以及FuncX生成的Common Header透传给HTTP Server。您可以平滑迁移已有的HTTP Web应用。
函数实例生命周期回调方法
按量模式的函数实例可供按需创建。闲置时,按量实例会被冻结,冻结一段时间会被销毁。当实例状态发生变化时,您可以配置实例生命周期回调方法,回调实例状态。FuncX支持Initializer
、PreFreeze
和PreStop
三种回调方法。
Initializer回调
Initializer回调在函数实例启动成功之后,执行请求处理程序之前执行。FuncX保证在一个实例生命周期内,成功执行且只能成功执行一次Initializer回调。如果Initializer回调执行失败,对于同步调用,系统会返回对应错误,对于异步调用,系统会基于用户配置的重试策略进行重试。
POST /initialize
- 请求体:无。
- 响应体:函数Initializer的返回值。
- 状态码:2xx:成功状态;非2xx:失败状态。正确响应
@app.route('/initialize', methods=['POST']) def init_invoke(): rid = request.headers.get(x-fc-request-id) print("FC Initialize Start RequestId: " + rid) # do your things print("FC Initialize End RequestId: " + rid) return "OK"
错误响应# 错误响应1 @app.route('/initialize', methods=['POST']) def init(): raise Exception("hahaha") return "OK", 200, [] # 错误响应2 @app.route('/initialize', methods=['POST']) def init(): return "OK", 404, []
PreFreeze回调
PreFreeze回调在函数实例冻结前执行,您可以使用PreFreeze回调完成实例冻结前的必要操作,例如,等待指标发送成功等。
POST /pre-freeze
- 请求体:无。
- 响应体:函数PreFreeze的返回值。
- 状态码:2xx:成功状态;非2xx:失败状态。正确响应
@app.route('/pre-freeze', methods=['POST']) def init_invoke(): rid = request.headers.get(x-fc-request-id) print("FC PreFreeze Start RequestId: " + rid) # do your things print("FC PreFreeze End RequestId: " + rid) return "OK"
错误响应# 错误响应1 @app.route('/pre-freeze', methods=['POST']) def init(): raise Exception("hahaha") return "OK", 200, [] # 错误响应2 @app.route('/pre-freeze', methods=['POST']) def init(): return "OK", 404, []
PreStop回调
PreStop回调在函数实例销毁前执行,您可以使用PreStop回调完成实例销毁前的必要操作,例如,关闭数据库链接,以及上报、更新状态等。
POST /pre-stop
- 请求体:无。
- 响应体:函数PreStop的返回值。
- 状态码:2xx:成功状态;非2xx:失败状态。正确响应
@app.route('/pre-stop', methods=['POST']) def init_invoke(): rid = request.headers.get(x-fc-request-id) print("FC PreStop Start RequestId: " + rid) # do your things print("FC PreStop End RequestId: " + rid) return "OK"
错误响应# 错误响应1 @app.route('/pre-stop', methods=['POST']) def init(): raise Exception("hahaha") return "OK", 200, [] # 错误响应2 @app.route('/pre-stop', methods=['POST']) def init(): return "OK", 404, []
重要
如果创建的函数不设置Initializer,就无需实现/initialize
。此时,即使HTTP Server实现了/initialize
,代码中的/initialize
逻辑也无法被调用执行。
日志记录
FuncX与日志记录集成,将函数调用的记录以及函数代码中打印的日志全部存储到日志库中。您可以使用FuncX提供的日志语句记录函数日志,方便调试及定位问题。各种编程语言的打印日志语句,如下表所示。
开发语言 | 编程语言内嵌的打印日志语句 | FuncX提供的日志语句 |
---|---|---|
Node.js | console.log() | context.logger.info() |
Python | print() | logging.getLogger().info() |
Java | System.out.println() | context.getLogger().info() |
PHP | echo "" . PHP_EOL | $GLOBALS['fcLogger']->info() |
C# | Console.WriteLine("") | context.Logger.LogInformation() |
Golang | log.Println() | fctx, _ := fccontext.FromContext(ctx) fctx.GetLogger().Info() |
使用编程语言内嵌的打印输出语句打印的日志也会被收集到日志库里,而使用FuncX提供的日志语句打印的每条日志前都会带上请求ID,方便日志的筛选。
操作系统环境
FuncX的内置运行时提供Debian9 LTS、Debian10 LTS、Debian11 LTS和Debian12 LTS四种操作系统,且当前仅提供x86_64架构的支持。
您可以通过设置环境变量来定制操作系统环境。以时区定制为例,函数实例默认以UTC时间运行,也就是0时区,当您设置环境变量TZ的值为Asia/Shanghai后,函数的时区被修改为东8区,即北京时间。