Idempotence(冪等性)

Fiberのidempotenceミドルウェアを使用すると、クライアントのネットワークの問題による繰り返しのリクエストなどで、同じ操作がサーバーで誤って複数回実行されることを防ぐことができます。これは一般的なAPIの冪等性メカニズムとして機能し、フォールトトレランスAPIの作成を可能にします。

関数シグネチャ

func New(config ...Config) fiber.Handler

コード例

Fiberウェブフレームワークのミドルウェアパッケージをインポートします。

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/idempotency"
)

デフォルトの設定

Fiberアプリケーションを初期化した後、ミドルウェアを直接参照できます。

app.Use(idempotency.New())

カスタム設定

app.Use(idempotency.New(idempotency.Config{
    Lifetime: 42 * time.Minute,
    // ...
}))

設定オプション

プロパティ タイプ 説明 デフォルト値
Next func(*fiber.Ctx) bool Next はミドルウェアをスキップする関数を定義します。trueを返すとミドルウェアがスキップされます。 セーフなHTTPメソッドの使用に関する関数
Lifetime time.Duration Lifetime は冪等性キーの最大有効期間です。 30 * time.Minute
KeyHeader string KeyHeader は冪等性キーを含むヘッダーの名前です。 "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate は冪等性ヘッダーの構文を検証するための関数を定義します。 UUIDの検証に関する関数
KeepResponseHeaders []string KeepResponseHeaders は元のレスポンスから保持するヘッダーのリストです。 nil(すべてのヘッダーを保持)
Lock Locker Lock は冪等性キーをロックします。 メモリ内のロック
Storage fiber.Storage Storage は冪等性キーに応じてレスポンスデータを保存します。 メモリ内のストレージ

デフォルトの設定

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // 安全なHTTPメソッドを使用してリクエストが行われた場合は、ミドルウェアをスキップします
        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 { // UUIDの長さは36文字です
            return fmt.Errorf("%w: invalid length: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // データの割り当てを避けるためにconfigDefaultで設定します
    Storage: nil, // データの割り当てを避けるためにconfigDefaultで設定します
}