このトピックでは、トリガーの高度なシステム機能について説明します。
注意事項
このトピックで説明する高度な機能は、Simple Message Queue (旧称:MNS) キュートリガー、RocketMQ トリガー、RabbitMQ トリガー、Kafka トリガー、DTS トリガーなどのカスタムイベントソーストリガーにのみ適用されます。
呼び出しメソッド
Function Compute のトリガーは、同期と非同期の 2 つの呼び出しメソッドをサポートしています。両方の呼び出しメソッドの制限は次のとおりです。
呼び出しモード |
| 最大タイムアウト |
同期呼び出し | 32 MB | 5 分 |
非同期呼び出し | 128 KB | 5 分 |
プッシュ設定
バッチプッシュでは、body サイズの制限を考慮して、集約するメッセージ数を減らす必要があるかどうかを判断する必要があります。body サイズの制限については、「呼び出しメソッド」をご参照ください。
バッチプッシュ
バッチプッシュを有効にした後、一括プッシュ件数 と 一括プッシュ間隔 を設定します。
一括プッシュ件数:1 回の関数呼び出しで送信されるメッセージの最大数。蓄積されたメッセージ数が設定値に達した場合にのみ、リクエストが送信されます。有効値の範囲は [1, 10000] です。
一括プッシュ間隔:関数を呼び出す時間間隔。システムはメッセージを集約し、各間隔で Function Compute に送信します。有効値の範囲は [0, 15] (秒) です。0 秒は待機なしで、リアルタイムで配信されることを意味します。
バッチプッシュは、複数のイベントをバッチで集約するのに役立ちます。一括プッシュ件数 または 一括プッシュ間隔 のいずれかの条件が満たされると、トリガーが起動し、リクエストメッセージがバッチで Function Compute にプッシュされます。
バッチプッシュの例
例 1
一括プッシュ件数 を 100 メッセージ、各メッセージサイズを 1 KB、一括プッシュ間隔 を 15 秒に設定します。10 秒以内に 100 メッセージが蓄積された場合、15 秒待たずにプッシュがすぐにトリガーされます。
例 2
一括プッシュ件数 を 100 メッセージ、各メッセージサイズを 1 KB、一括プッシュ間隔 を 15 秒に設定します。15 秒以内に 50 メッセージが蓄積された場合、100 メッセージが蓄積されるのを待たずにプッシュがすぐにトリガーされます。
例 3
一括プッシュ件数 を 100 メッセージ、各メッセージサイズを 2 KB、一括プッシュ間隔 を 15 秒、呼び出しメソッド を 非同期呼び出し に設定します。10 秒以内に 100 メッセージが蓄積されると (合計メッセージサイズ 100 × 2 KB = 200 KB)、非同期呼び出しの
bodyサイズ制限に達するため、プッシュがすぐにトリガーされます。最初のバッチでは 64 メッセージが集約されて Function Compute にプッシュされ、2 番目のバッチでは 36 メッセージが集約されて Function Compute にプッシュされます。
プッシュフォーマット
関数エントリポイントの Event パラメーターで、各データ要素のフォーマットを指定します。
CloudEvents:イベントデータを汎用的なフォーマットで記述する仕様で、異なるサービスやプラットフォーム間でのイベントの宣言と転送を簡素化することを目的としています。
RawData:CloudEvents フォーマットの他のメタデータ情報を含まず、CloudEvents の data フィールドのコンテンツのみを配信します。
例として Simple Message Queue (旧称: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"
}
},
{
"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 回リトライします。各リトライの間隔は 10 秒から 20 秒のランダムな間隔です。
指数関数的減衰の再試行:デフォルトのリトライポリシー。176 回リトライし、リトライ間隔は指数関数的に増加して最大 512 秒になります。合計リトライ時間は 24 時間です。リトライ間隔は 1 秒、2 秒、4 秒、8 秒、16 秒、32 秒、64 秒、128 秒、256 秒、512 秒... 512 秒 (合計 167 回の間隔が 512 秒) となります。
リトライがトリガーされるシナリオ
429エラー:Function Compute がリクエストをスロットリングしていることを示します。スロットリングは一時的なものであるため、リトライがトリガーされます。5xxエラー:Function Compute のシステム例外により、関数が実行できないことを示します。
よくある質問
Q:関数実装の問題による関数実行エラーは、リトライポリシーをトリガーしますか?
A:同期呼び出しの場合、関数実装の問題はリトライポリシーをトリガーします。非同期呼び出しの場合、関数実装の問題はリトライポリシーをトリガーしませんが、非同期呼び出しのリトライポリシーをトリガーします。詳細については、「リトライポリシー」をご参照ください。
関数実行エラーのリトライには、次の 2 種類があります。
リトライによって成功する可能性がある場合
リトライポリシーを実行する必要はありません。関数内でリトライを実装してください。
リトライは成功することはありません。
リトライは無意味であり、リトライコストが増加するだけです。
フォールトトレランスポリシー
エラー発生時にフォールトトレランスを有効にするかどうかを選択します。
フォールトトレランスの許可
リクエストが失敗し、リトライも失敗した場合、このリクエストをスキップして次のリクエストの処理を続行します。
フォールトトレランスの禁止
リクエストが失敗し、リトライも失敗した場合、コンシュームタスクはブロックされます。
デッドレターキュー
デッドレターキューは、フォールトトレランスの許可 が有効になっている場合にのみ設定します。
デッドレターキューを有効にすると、処理されなかったメッセージやリトライ回数の上限を超えたメッセージは、ターゲットサービスに配信されます。Function Compute は、ターゲットサービスとして Simple Message Queue (formerly MNS)、ApsaraMQ for RocketMQ、ApsaraMQ for Kafka、EventBridge をサポートしています。必要に応じて、異なるキュータイプを選択してください。
デッドレターキューを有効にしない場合、リトライ回数の上限を超えたメッセージは破棄されます。
非同期呼び出しのシナリオでは、関数でエラーが発生した場合、メッセージはトリガーのデッドレターキューには配信されません。代わりに、Function Compute 側で設定された非同期呼び出しのターゲットサービスに配信されます。詳細については、「結果のコールバック」をご参照ください。