درخواست تکراری را با 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