Idempotensi - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Idempotensi

Fungsi tahan lama menyediakan idempotensi bawaan untuk eksekusi dimulai melalui nama eksekusi. Saat Anda memberikan nama eksekusi, Lambda menggunakannya untuk mencegah eksekusi duplikat dan mengaktifkan percobaan ulang permintaan pemanggilan yang aman. Langkah-langkah memiliki semantik at-least-once eksekusi secara default—selama pemutaran ulang, SDK mengembalikan hasil pemeriksaan tanpa mengeksekusi ulang langkah yang telah diselesaikan, tetapi logika bisnis Anda harus idempoten untuk menangani percobaan ulang potensial sebelum selesai.

catatan

Pemetaan sumber acara Lambda (ESM) tidak mendukung idempotensi saat peluncuran. Oleh karena itu, setiap pemanggilan (termasuk percobaan ulang) memulai eksekusi baru yang tahan lama. Untuk memastikan eksekusi idempoten dengan pemetaan sumber peristiwa, terapkan logika idempotensi dalam kode fungsi Anda seperti dengan Powertools for AWS Lambda atau gunakan fungsi Lambda biasa sebagai proxy (dispatcher) untuk memanggil fungsi tahan lama dengan kunci idempotensi (parameter nama eksekusi).

Nama eksekusi

Anda dapat memberikan nama eksekusi saat menjalankan fungsi tahan lama. Nama eksekusi bertindak sebagai kunci idempotensi, memungkinkan Anda untuk mencoba kembali permintaan pemanggilan dengan aman tanpa membuat eksekusi duplikat. Jika Anda tidak memberikan nama, Lambda akan menghasilkan ID eksekusi unik secara otomatis.

Nama eksekusi harus unik dalam akun dan wilayah Anda. Saat Anda memanggil fungsi dengan nama eksekusi yang sudah ada, perilaku Lambda bergantung pada status eksekusi yang ada dan apakah payload cocok.

Perilaku idempotensi

Tabel berikut menjelaskan cara Lambda menangani permintaan pemanggilan berdasarkan apakah Anda memberikan nama eksekusi, status eksekusi yang ada, dan apakah payload cocok:

Skenario Nama yang disediakan? Status eksekusi yang ada Muatan identik? Perilaku
1 Tidak N/A N/A Eksekusi baru dimulai: Lambda menghasilkan ID eksekusi unik dan memulai eksekusi baru
2 Ya Tidak pernah ada atau retensi kedaluwarsa N/A Eksekusi baru dimulai: Lambda memulai eksekusi baru dengan nama yang disediakan
3 Ya Berjalan Ya Idempoten start: Lambda mengembalikan informasi eksekusi yang ada tanpa memulai duplikat. Untuk pemanggilan sinkron, ini bertindak sebagai penyambungan kembali ke eksekusi yang sedang berjalan
4 Ya Berjalan Tidak Kesalahan: Lambda mengembalikan DurableExecutionAlreadyExists kesalahan karena eksekusi dengan nama ini sudah berjalan dengan muatan yang berbeda
5 Ya Ditutup (berhasil, gagal, berhenti, atau habis waktu) Ya Idempoten start: Lambda mengembalikan informasi eksekusi yang ada tanpa memulai eksekusi baru. Hasil eksekusi tertutup dikembalikan
6 Ya Ditutup (berhasil, gagal, berhenti, atau habis waktu) Tidak Kesalahan: Lambda mengembalikan DurableExecutionAlreadyExists kesalahan karena eksekusi dengan nama ini sudah selesai dengan muatan yang berbeda
Catatan

Skenario 3 dan 5 menunjukkan perilaku idempoten di mana Lambda menangani permintaan pemanggilan duplikat dengan aman dengan mengembalikan informasi eksekusi yang ada alih-alih membuat duplikat.

Langkah idempotensi

Langkah-langkah memiliki semantik at-least-once eksekusi secara default. Saat fungsi Anda diputar ulang setelah menunggu, panggilan balik, atau kegagalan, SDK akan memeriksa setiap langkah terhadap log pos pemeriksaan. Untuk langkah-langkah yang sudah selesai, SDK mengembalikan hasil pemeriksaan tanpa mengeksekusi ulang logika langkah. Namun, jika sebuah langkah gagal atau fungsi terputus sebelum langkah selesai, langkah tersebut dapat dijalankan beberapa kali.

Logika bisnis Anda yang dibungkus dalam langkah-langkah harus idempoten untuk menangani percobaan ulang potensial. Gunakan kunci idempotensi untuk memastikan operasi seperti pembayaran atau penulisan database dijalankan hanya sekali, bahkan jika langkah tersebut dicoba lagi.

Contoh: Menggunakan kunci idempotensi dalam langkah-langkah

TypeScript
import { withDurableExecution, DurableContext } from '@aws/durable-execution-sdk-js'; import { randomUUID } from 'crypto'; export const handler = withDurableExecution( async (event: any, context: DurableContext) => { // Generate idempotency key once const idempotencyKey = await context.step('generate-key', async () => { return randomUUID(); }); // Use idempotency key in payment API to prevent duplicate charges const payment = await context.step('process-payment', async () => { return paymentAPI.charge({ amount: event.amount, idempotencyKey: idempotencyKey }); }); return { statusCode: 200, payment }; } );
Python
from aws_durable_execution_sdk_python import durable_execution, DurableContext import uuid @durable_execution def handler(event, context: DurableContext): # Generate idempotency key once idempotency_key = context.step( lambda _: str(uuid.uuid4()), name='generate-key' ) # Use idempotency key in payment API to prevent duplicate charges payment = context.step( lambda _: payment_api.charge( amount=event['amount'], idempotency_key=idempotency_key ), name='process-payment' ) return {'statusCode': 200, 'payment': payment}

Anda dapat mengonfigurasi langkah-langkah untuk menggunakan semantik at-most-once eksekusi dengan menyetel mode eksekusi ke. AT_MOST_ONCE_PER_RETRY Ini memastikan langkah dijalankan paling banyak sekali per percobaan ulang, tetapi mungkin tidak mengeksekusi sama sekali jika fungsi terganggu sebelum langkah selesai.

SDK memberlakukan pemutaran ulang deterministik dengan memvalidasi bahwa nama langkah dan urutan cocok dengan log pos pemeriksaan selama pemutaran ulang. Jika kode Anda mencoba mengeksekusi langkah-langkah dalam urutan yang berbeda atau dengan nama yang berbeda, SDK akan menampilkan file. NonDeterministicExecutionError

Cara kerja replay dengan langkah-langkah yang telah selesai:

  1. Pemanggilan pertama: Fungsi mengeksekusi langkah A, membuat pos pemeriksaan, lalu menunggu

  2. Pemanggilan kedua (setelah menunggu): Fungsi memutar ulang dari awal, langkah A mengembalikan hasil yang diperiksa secara instan tanpa mengeksekusi ulang, lalu melanjutkan ke langkah B

  3. Pemanggilan ketiga (setelah menunggu lagi): Fungsi memutar ulang dari awal, langkah A dan B mengembalikan hasil pemeriksaan secara instan, lalu melanjutkan ke langkah C

Mekanisme pemutaran ulang ini memastikan bahwa langkah-langkah yang telah diselesaikan tidak dijalankan kembali, tetapi logika bisnis Anda harus tetap idempoten untuk menangani percobaan ulang sebelum selesai.