節操のないリトライ
Cloud Functionsには失敗時に再試行する機能があるんです。
ただ、この連コインが節度なく、秒間数回の割合で送られてくるのです。
そのため、例えば、Cloud Functionsからアクセスされるサーバでシステム障害でエラーが出ていた場合、
その様相たるや、永パが際限なく続くようなものであります。
リトライ制限
そのような状況を防ぐには、こうします。
一定時間経ったらリクエストを拒否するようにします。
// 受信メイン処理
func main(ctx context.Context, e GCSEvent) error {
meta, err := metadata.FromContext(ctx)
if err != nil {
return fmt.Errorf("metadata.FromContext: %v", err)
}
// メッセージ発行時と現在時を比較して古すぎた場合は処理を終了
expiration := meta.Timestamp.Add(10 * time.Second)
if time.Now().After(expiration) {
log.Printf("event timeout: halting retries for expired event '%q'", meta.EventID)
return nil
}
// メインロジック
return logic(ctx, e)
}
現場からは以上です。