همه یادداشت‌ها

درخواست تکراری را با idempotency key کنترل کنیم

محتوای نمونه برای ارزیابی طراحی؛ پیش از استفاده، شرایط محیط خود را بررسی کنید.

پیش‌نیازها

دامنه کلید را برای هر کاربر و عملیات تعریف کنید. مدت نگهداری نتیجه و رفتار درخواست هم‌زمان باید جزو قرارداد API باشد.

راه‌حل

CREATE TABLE request_keys (
  owner_id bigint NOT NULL,
  request_key text NOT NULL,
  request_hash text NOT NULL,
  state text NOT NULL,
  response_body jsonb,
  PRIMARY KEY (owner_id, request_key)
);

ابتدا رکورد کلید را در تراکنش ایجاد کنید. اگر کلید وجود داشت، hash درخواست را تطبیق دهید؛ برای payload متفاوت خطا بدهید. نتیجه نهایی و وضعیت را پایدار نگه دارید.

نکته‌ها و خطاهای رایج

قید یکتا فقط گرفتن کلید را اتمیک می‌کند؛ اثر جانبی خارج از دیتابیس نیازمند طراحی جداگانه مانند outbox است. شکست میان اثر جانبی و ثبت نتیجه را بررسی کنید و وضعیت in-progress را بی‌پایان رها نکنید.

https://tnote.ir/n/29