All Products
Search
Document Center

Function Compute:Deduplikasi Tugas

Last Updated:Apr 02, 2026

Ketika pemanggilan asinkron gagal akibat timeout atau kesalahan jaringan, percobaan ulang tanpa pengenal stabil dapat memicu eksekusi duplikat. Deduplikasi tugas mencegah hal ini dengan memungkinkan Anda menetapkan ID unik global untuk setiap tugas. Jika percobaan ulang menggunakan ID yang sama, Function Compute akan menolak duplikat tersebut dan mengembalikan error 409 alih-alih menjalankan tugas kembali.

Cara Kerja

Tetapkan ID tugas melalui header permintaan HTTP X-Fc-Stateful-Async-Invocation-Id saat mengirimkan pemanggilan asinkron. Ketika tugas masuk ke sistem, Function Compute memeriksa apakah ID tersebut pernah dikirim sebelumnya. Jika ID sudah ada, permintaan dianggap sebagai duplikat dan ditolak.

Tabel berikut menunjukkan cara Function Compute menangani pemanggilan berdasarkan apakah ID tugas disediakan:

SkenarioID Tugas Disediakan?Perilaku
Tidak ada ID tugasTidakFunction Compute memulai eksekusi baru tanpa deduplikasi
ID tugas baruYaFunction Compute memulai eksekusi baru
ID tugas duplikatYaFunction Compute menolak permintaan dan mengembalikan 409
Catatan

Function Compute juga menetapkan request ID untuk setiap pemanggilan. Jika Anda menetapkan request ID tetapi tidak menetapkan task ID, sistem secara otomatis menggunakan request ID sebagai task ID. Saat menggunakan tugas asinkron, selalu tetapkan task ID secara eksplisit dan biarkan request ID tidak diatur untuk memastikan perilaku deduplikasi yang benar.

Menetapkan ID Tugas

Kirimkan tugas melalui Konsol Function Compute, Serverless Devs, atau operasi API. Untuk menetapkan ID tugas, sertakan header X-Fc-Stateful-Async-Invocation-Id dalam permintaan pemanggilan.

Contoh Go berikut menetapkan ID tugas saat pemanggilan:

import fc "github.com/aliyun/fc-go-sdk"

func SubmitJob() {
    // Tetapkan ID tugas yang stabil dan memiliki makna bisnis untuk mengaktifkan deduplikasi.
    // Menggunakan ID yang sama saat mencoba ulang akan menggunakan tugas yang sudah ada,
    // bukan memulai tugas baru.
    invokeInput := fc.NewInvokeFunctionInput("ServiceName", "FunctionName")
    invokeInput = invokeInput.WithAsyncInvocation().WithStatefulAsyncInvocationID("TaskUUID")
    invokeOutput, err := fcClient.InvokeFunction(invokeInput)
    ...
}

Ganti TaskUUID dengan pengenal yang berasal dari sistem hulu Anda, seperti ID pesanan atau ID pekerjaan. ID yang stabil dan deterministik memastikan bahwa percobaan ulang setelah timeout atau kesalahan jaringan menggunakan ID tugas yang sama dan memicu deduplikasi, bukan menjalankan eksekusi kedua.

Catatan

Gunakan pengenal yang stabil dan memiliki makna bisnis (seperti ID pesanan atau ID transaksi) ketika Anda memerlukan eksekusi exactly-once. Gunakan ID yang dihasilkan secara acak hanya jika setiap pengiriman memang dimaksudkan sebagai tugas baru.