本文介紹觸發器的進階系統功能。
使用說明
本文介紹的進階功能只適用於自訂事件來源觸發器,包括輕量訊息佇列(原 MNS)隊列觸發器、RocketMQ觸發器、RabbitMQ觸發器、Kafka觸發器和DTS觸發器。
調用方式
Function Compute的觸發器支援同步調用和非同步呼叫兩種調用方式。兩種調用方式的限制如下所示。
調用模式 |
| 逾時時間上限 |
同步調用 | 32 MB | 5分鐘 |
非同步呼叫 | 128 KB | 5分鐘 |
推送配置
批量推送需結合body
大小限制決定是否減少彙總訊息數。關於body
大小限制,請參見調用方式。
批量推送
批量推送需設定批量推送條數和推量推送間隔。
批量推送條數:一次調用函數發送的最大批量訊息條數,當積壓的訊息數量到達設定值時才會發送請求。取值範圍為[1,10000]。
推量推送間隔:調用函數的時間間隔,系統每到間隔時間點會將訊息彙總後發給Function Compute。取值範圍為[0,15],單位為秒。0秒錶示無需等待,即時投遞。
批量推送協助您批量彙總多個事件,當批量推送條數和批量推送間隔兩者條件滿足其中一個時,觸發函數執行,將請求訊息批量推送到Function Compute。
批量推送案例
案例一
您設定的批量推送條數為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條訊息推送到Function Compute,第二批彙總36條訊息推送到Function Compute。
推送格式
用於指定函數入口參數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
錯誤:指請求被Function Compute限流。限流是短暫的,因此會觸發重試。5xx
錯誤:指Function Compute系統異常導致函數無法執行。函數執行出錯:指因函數實現引發的函數執行出錯。
常見問題FAQ
Q:因函數實現問題引發的函數執行出錯是否會觸發執行重試策略?
A:會,函數執行出錯會觸發重試策略。
容錯策略
當發生錯誤時是否選擇容錯。
允許容錯
請求失敗且重試失敗後,跳過此請求,繼續處理下一條請求。
禁止容錯
請求失敗且重試失敗後,消費任務阻塞。
無效信件佇列
僅當開啟允許容錯時,可配置無效信件佇列。
如果啟用無效信件佇列,未被處理或超過重試次數的訊息會被投遞到目標服務中。Function Compute支援的目標服務包括輕量訊息佇列(原 MNS)、雲訊息佇列 RocketMQ 版、雲訊息佇列 Kafka 版和事件匯流排EventBridge,您可以根據需求選擇不同的隊列類型。
如果未啟用無效信件佇列,超過重試次數的訊息會被丟棄。
並發消費
您可以通過設定並發消費線程數提高吞吐,目前僅Kafka觸發器支援設定並發配額,雲訊息佇列 Kafka 版並發消費需配合Topic分區共同實現,包括以下幾種情境。
Topic分區數=並發消費數:一個線程消費一個Topic分區。
Topic分區數>並發消費數:多個並發消費會均攤所有分區消費。
Topic分區數<並發消費數:一個線程消費一個Topic分區,多出的消費數無效。
為保證您的資源被充分利用,建議您選擇Topic分區數=並發消費數或Topic分區數>並發消費數情境。