Idempotence
Middleware idempotence dari Fiber memungkinkan pembuatan API yang fault-tolerant, di mana permintaan yang diulang (misalnya, karena masalah jaringan klien) tidak secara keliru menyebabkan operasi yang sama dieksekusi beberapa kali di server, berfungsi sebagai mekanisme idempotence API umum.
Tanda Tangan Fungsi
func New(config ...Config) fiber.Handler
Contoh Kode
Impor paket middleware dari kerangka kerja web Fiber.
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/idempotency"
)
Konfigurasi Default
Setelah menginisialisasi aplikasi Fiber, middleware dapat langsung dirujuk.
app.Use(idempotency.New())
Konfigurasi Kustom
app.Use(idempotency.New(idempotency.Config{
Lifetime: 42 * time.Minute,
// ...
}))
Opsi Konfigurasi
Properti | Tipe | Deskripsi | Nilai Default |
---|---|---|---|
Next | func(*fiber.Ctx) bool |
Next mendefinisikan fungsi untuk melewati middleware saat mengembalikan nilai true. | Sebuah fungsi untuk penggunaan metode yang aman |
Lifetime | time.Duration |
Lifetime adalah umur maksimum kunci idempotence. | 30 * time.Minute |
KeyHeader | string |
KeyHeader adalah nama header yang berisi kunci idempotence. | "X-Idempotency-Key" |
KeyHeaderValidate | func(string) error |
KeyHeaderValidate mendefinisikan fungsi untuk memvalidasi sintaks header idempotence. | Sebuah fungsi untuk validasi UUID |
KeepResponseHeaders | []string |
KeepResponseHeaders adalah daftar header yang akan dipertahankan dari respons asli. | nil (mempertahankan semua header) |
Lock | Locker |
Lock mengunci kunci idempotence. | Sebuah penguncian di memori |
Storage | fiber.Storage |
Storage menyimpan data respons sesuai dengan kunci idempotence. | Penyimpanan di memori |
Konfigurasi Default
var ConfigDefault = Config{
Next: func(c *fiber.Ctx) bool {
// Lewati middleware jika permintaan dibuat menggunakan metode HTTP yang aman
return fiber.IsMethodSafe(c.Method())
},
Lifetime: 30 * time.Minute,
KeyHeader: "X-Idempotency-Key",
KeyHeaderValidate: func(k string) error {
if l, wl := len(k), 36; l != wl { // Panjang UUID adalah 36 karakter
return fmt.Errorf("%w: panjang tidak valid: %d != %d", ErrInvalidIdempotencyKey, l, wl)
}
return nil
},
KeepResponseHeaders: nil,
Lock: nil, // Diatur di configDefault untuk menghindari alokasi data di sini
Storage: nil, // Diatur di configDefault untuk menghindari alokasi data di sini
}