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:
| Skenario | ID Tugas Disediakan? | Perilaku |
|---|---|---|
| Tidak ada ID tugas | Tidak | Function Compute memulai eksekusi baru tanpa deduplikasi |
| ID tugas baru | Ya | Function Compute memulai eksekusi baru |
| ID tugas duplikat | Ya | Function Compute menolak permintaan dan mengembalikan 409 |
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.
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.