本文介绍触发器的高级系统功能。
使用说明
本文介绍的高级功能只适用于自定义事件源触发器,包括轻量消息队列(原 MNS)队列触发器、RocketMQ触发器、RabbitMQ触发器、Kafka触发器和DTS触发器。
调用方式
函数计算的触发器支持同步调用和异步调用两种调用方式。两种调用方式的限制如下所示。
调用模式 |
| 超时时间上限 |
同步调用 | 32 MB | 5分钟 |
异步调用 | 128 KB | 5分钟 |
推送配置
批量推送需结合body
大小限制决定是否减少聚合消息数。关于body
大小限制,请参见调用方式。
批量推送
批量推送需设置批量推送条数和推量推送间隔。
批量推送条数:一次调用函数发送的最大批量消息条数,当积压的消息数量到达设定值时才会发送请求。取值范围为[1,10000]。
推量推送间隔:调用函数的时间间隔,系统每到间隔时间点会将消息聚合后发给函数计算。取值范围为[0,15],单位为秒。0秒表示无需等待,实时投递。
批量推送帮助您批量聚合多个事件,当批量推送条数和批量推送间隔两者条件满足其中一个时,触发函数执行,将请求消息批量推送到函数计算。
批量推送案例
案例一
您设置的批量推送条数为100条,每条消息大小为1 KB,批量推送间隔为15s。在10s内消息条数累积100条,则立即触发推送,无需等到15s再推送。
案例二
您设置的批量推送条数为100条,每条消息大小为1 KB,批量推送间隔为15s。在15s内消息积累50条,则立即触发推送,无需等待消息积累到100条后再推送。
案例三
您设置的批量推送条数为100条,每条消息大小为2 KB,推量推送间隔为15s,调用方式为异步调用。在10s内消息积累100条(消息累积大小100*2KB=200KB),达到异步调用
body
大小限制数,则立即触发推送,第一批聚合64条消息推送到函数计算,第二批聚合36条消息推送到函数计算。
推送格式
用于指定函数入口参数Event中每个数据元素的格式。
CloudEvents:以通用格式描述事件数据的规范,旨在简化不同服务和平台间的事件声明和传输。
RawData:只投递CloudEvents中数据字段的内容,不包含CloudEvents格式中的其它元数据信息。
以轻量消息队列(原 MNS)队列触发器为例,事件模式下,CloudEvents和RawData类型的Event格式如下。
CloudEvents
{
"id":"c2g71017-6f65-fhcf-a814-a396fc8d****",
"source":"MNS-Function-mnstrigger",
"specversion":"1.0",
"type":"mns:Queue:SendMessage",
"datacontenttype":"application/json; charset=utf-8",
"subject":"acs:mns:cn-hangzhou:164901546557****:queues/zeus",
"time":"2021-04-08T06:28:17.093Z",
"aliyunaccountid":"164901546557****",
"aliyunpublishtime":"2021-10-15T07:06:34.028Z",
"aliyunoriginalaccountid":"164901546557****",
"aliyuneventbusname":"MNS-Function-mnstrigger",
"aliyunregionid":"cn-chengdu",
"aliyunpublishaddr":"42.120.XX.XX",
"data":{
"requestId":"606EA3074344430D4C81****",
"messageId":"C6DB60D1574661357FA227277445****",
"messageBody":"TEST"
}
}
RawData
{
"requestId":"606EA3074344430D4C81****",
"messageId":"C6DB60D1574661357FA227277445****",
"messageBody":"TEST"
}
事件流模式下,CloudEvents和RawData类型的Event格式如下。
CloudEvents
[
{
"id":"c2g71017-6f65-fhcf-a814-a396fc8d****",
"source":"MNS-Function-mnstrigger",
"specversion":"1.0",
"type":"mns:Queue:SendMessage",
"datacontenttype":"application/json; charset=utf-8",
"subject":"acs:mns:cn-hangzhou:164901546557****:queues/zeus",
"time":"2021-04-08T06:28:17.093Z",
"aliyunaccountid":"164901546557****",
"aliyunpublishtime":"2021-10-15T07:06:34.028Z",
"aliyunoriginalaccountid":"164901546557****",
"aliyuneventbusname":"MNS-Function-mnstrigger",
"aliyunregionid":"cn-chengdu",
"aliyunpublishaddr":"42.120.XX.XX",
"data":{
"requestId":"606EA3074344430D4C81****",
"messageId":"C6DB60D1574661357FA227277445****",
"messageBody":"TEST"
}
},
{
"id":"d2g71017-6f65-fhcf-a814-a396fc8d****",
"source":"MNS-Function-mnstrigger",
"specversion":"1.0",
"type":"mns:Queue:SendMessage",
"datacontenttype":"application/json; charset=utf-8",
"subject":"acs:mns:cn-hangzhou:164901546557****:queues/zeus",
"time":"2021-04-08T06:28:17.093Z",
"aliyunaccountid":"164901546557****",
"aliyunpublishtime":"2021-10-15T07:06:34.028Z",
"aliyunoriginalaccountid":"164901546557****",
"aliyuneventbusname":"MNS-Function-mnstrigger",
"aliyunregionid":"cn-chengdu",
"aliyunpublishaddr":"42.120.XX.XX",
"data":{
"requestId":"606EA3074344430D4C81****",
"messageId":"C6DB60D1574661357FA227277445****",
"messageBody":"TEST"
}
}
]
RawData
[
{
"requestId":"606EA3074344430D4C81****",
"messageId":"C6DB60D1574661357FA227277445****",
"messageBody":"TEST"
},
{
"requestId":"606EA3074344430D4C81****",
"messageId":"C6DB60D1574661357FA227277445****",
"messageBody":"TEST"
}
]
重试策略
函数请求在部分失败场景下,可按配置的重试策略进行重试。重试策略选项如下。
退避重试:重试3次,每次重试的时间间隔为介于10s~20s的随机值。
指数衰减重试:默认重试策略。重试176次,每次重试的时间间隔按照指数递增至512s,总计重试时间为24小时,即重试时间间隔为1s、2s、4s、8s、16s、32s、64s、128s、256s、512s……512s(共计167次间隔512s)。
触发重试的场景
429
错误:指请求被函数计算限流。限流是短暂的,因此会触发重试。5xx
错误:指函数计算系统异常导致函数无法执行。函数执行出错:指因函数实现引发的函数执行出错。
常见问题FAQ
Q:因函数实现问题引发的函数执行出错是否会触发执行重试策略?
A:会,函数执行出错会触发重试策略。
容错策略
当发生错误时是否选择容错。
允许容错
请求失败且重试失败后,跳过此请求,继续处理下一条请求。
禁止容错
请求失败且重试失败后,消费任务阻塞。
死信队列
仅当开启允许容错时,可配置死信队列。
如果启用死信队列,未被处理或超过重试次数的消息会被投递到目标服务中。函数计算支持的目标服务包括轻量消息队列(原 MNS)、云消息队列 RocketMQ 版、云消息队列 Kafka 版和事件总线EventBridge,您可以根据需求选择不同的队列类型。
如果未启用死信队列,超过重试次数的消息会被丢弃。
并发消费
您可以通过设置并发消费线程数提高吞吐,目前仅Kafka触发器支持设置并发配额,云消息队列 Kafka 版并发消费需配合Topic分区共同实现,包括以下几种场景。
Topic分区数=并发消费数:一个线程消费一个Topic分区。
Topic分区数>并发消费数:多个并发消费会均摊所有分区消费。
Topic分区数<并发消费数:一个线程消费一个Topic分区,多出的消费数无效。
为保证您的资源被充分利用,建议您选择Topic分区数=并发消费数或Topic分区数>并发消费数场景。