事件请求处理程序(Event Handler)

本文介绍Custom Container中事件请求处理程序的结构特点、使用示例和常见问题等。

背景介绍

针对Web Server模式的Custom Container函数,函数计算会将Common Headers、Body、POST方法以及/invoke/initialize路径转发给容器中的HTTP Server。您可以选择实现类似官方支持的Runtime(例如Golang Runtime)的contextevent函数签名。您也可以直接使用入参请求头(Headers)和请求体(Body)来编写函数的业务逻辑。更多信息,请参见Custom Runtime事件函数调用

针对非Web Server模式的Custom Container函数,函数计算会将Body通过环境变量的形式添加至容器启动环境中。您可以通过os.GetEnv("FC_CUSTOM_CONTAINER_EVENT")获取事件信息并进行任意处理。

函数调用说明

当Web Server模式函数是事件请求处理程序时,Http Server仅需实现Path为/invoke和Method为POST的对应逻辑即可。

Path

输入请求

预期响应

POST /invoke

  • 请求体:函数输入(InvokeFunction时指定的Payload)。

  • 请求头:Common Request Headers。具体信息,请参见函数计算公共请求头

    重要

    Content-Typeapplication/octet-stream

响应体:函数Handler的返回值,包括响应码和响应头。

  • 响应码StatusCode
    • 200:成功状态。
    • 404:失败状态。
  • 响应头x-fc-status
    • 200:成功状态。
    • 404:失败状态。
通过Headers中的x-fc-status响应,向函数计算汇报本地函数是否执行成功。
  • 不设置x-fc-status函数计算默认本次调用是成功执行的,但是您的函数可能有异常,没有向函数计算汇报,函数计算会认为这次函数执行没有报错,在业务逻辑上可能没有影响,但是在监控可观测性上会有影响。如下图所示:image8hanshujisuanruntime
  • 设置x-fc-status:当您的函数存在异常,通过x-fc-status响应向函数计算汇报本次函数执行失败,并将错误堆栈信息打印到日志中。如下图所示:image9runtimefc
说明 在返回的HTTP响应中,建议您同时设置StatusCodex-fc-status

Web Server模式代码示例

在以下Node.js Express示例中,POST方法和/initialize路径会在函数实例初始化时被函数计算调用,POST方法和/invoke路径为函数计算被调用时的Handler,通过req.headers以及req.body获取contextevent并将函数返回结果通过HTTP Response结构体输出。

'use strict';

const express = require('express');

// 常量
const PORT = 9000;
const HOST = '0.0.0.0';
const app = express();
// 解析JSON格式的请求体
app.use(express.json({type:['application/json', 'application/octet-stream']}))


// 初始化回调示例,需要在函数配置中配置初始化回调
app.post('/initialize', (req, res) => {
  console.log(req.body)
  res.send('Hello FunctionCompute, /initialize\n');
});


// 事件函数调用
app.post('/invoke', (req, res) => {
  console.log(req.body)
  res.send('Hello FunctionCompute, event function\n');
});

var server = app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

server.timeout = 0; // 设置从不超时
server.keepAliveTimeout = 0; // keepalive, never timeout

非Web Server模式代码示例

在以下Python镜像示例中,通过FC_CUSTOM_CONTAINER_EVENT获取事件触发的内容。

import os

if __name__ == '__main__':
    FC_EVENT = os.environ['FC_CUSTOM_CONTAINER_EVENT']
    print("Hello serverless image")
    print("FC event is: " + FC_EVENT)

多语言使用示例

使用Serverless Devs工具,您可以将您的应用一键迁移至函数计算。以下示例展示如何通过Serverless Devs工具快速部署和调用函数,您可以按需修改示例代码,实现二次开发。

常见问题