وقتی درخواست خطا میدهد، چند بار تلاش کنیم؟
تلاش دوباره ابزار خوبی است، به شرطی که سقف داشته باشد. بدون سقف، یک خطای موقت کوچک میتواند هم هزینه را چند برابر کند و هم کاربر را پشت یک صف طولانی نگه دارد.
خلاصه کاربردی
- همه خطاها با تلاش دوباره حل نمیشوند؛ ابتدا دستهبندی کنید.
- هم تعداد تلاش و هم زمان کل را محدود کنید.
- نتیجه نامعلوم را با شناسه درخواست ثبت کنید.
همه خطاها موقتی نیستند
تلاش دوباره معمولاً کلید نامعتبر یا ورودی نادرست را اصلاح نمیکند. خطاها را بر اساس قرارداد API دستهبندی کنید. برای محدودیت نرخ، راهنمای زمان انتظار پاسخ را رعایت کنید و برای خطای موقت، تعداد تلاش محدود داشته باشید.
- خطای احراز هویت یا ورودی نامعتبر: تلاش دوباره نکنید؛ درخواست را اصلاح کنید.
- محدودیت نرخ: زمان انتظار اعلامشده را رعایت کنید، نه یک فاصله ثابت.
- خطای موقت سرویس: حداکثر دو یا سه تلاش با فاصله افزایشی.
- خطای شبکه: یک تلاش دوباره منطقی است، اما مهلت کل را فراموش نکنید.
تعداد تلاش و زمان کل را محدود کنید
فاصله تلاشها را بهتدریج افزایش دهید و کمی تغییر تصادفی به آن اضافه کنید تا درخواستها همزمان برنگردند. علاوه بر سقف تعداد، برای کل عملیات مهلت زمانی تعیین کنید.
import { setTimeout as delay } from "node:timers/promises";
// Node.js: request must pass signal to fetch and consume the body.
async function withRetries(request) {
const signal = AbortSignal.timeout(20_000);
for (let attempt = 0; attempt < 3; attempt++) {
signal.throwIfAborted();
try {
return await request(signal);
} catch (error) {
signal.throwIfAborted();
// Retry only errors explicitly classified as temporary.
if (!error.retryable || attempt === 2) throw error;
const backoff = 500 * 2 ** attempt + Math.random() * 250;
const wait = Math.max(backoff, error.retryAfterMs ?? 0);
await delay(wait, undefined, { signal });
}
}
}
// In request(signal), use fetch(url, { ...options, signal }).
// Parse Retry-After into retryAfterMs when provided.نتیجه نامعلوم را جدی بگیرید
قطع اتصال الزاماً به معنی انجامنشدن درخواست نیست. تلاش مجدد ممکن است هزینه تازه ایجاد کند. شناسه درخواست و اطلاعات مصرف را ثبت کنید و برای عملیات دارای اثر جانبی، فقط در صورت پشتیبانی صریح سرویس به تضمین عدم تکرار اتکا کنید.
تکرار تولید متن هم ممکن است هزینه تازه یا خروجی متفاوت بسازد. اگر برنامه ابزارهایی مثل ثبت سفارش یا ارسال پیام اجرا میکند، جلوگیری از اجرای دوباره را در همان لایه پیاده کنید. کلید یکتا فقط وقتی از تکرار جلوگیری میکند که سرویس مقصد آن را پشتیبانی و اعمال کند.
تلاشها را اندازه بگیرید
اگر نرخ تلاش دوباره بالا میرود، بهجای افزایش سقف، علت را پیدا کنید. ممکن است مشکل در زمانبندی درخواستها، حجم بالای همزمانی یا خطای برنامهنویسی باشد. ثبت شماره تلاش در لاگ، این الگو را سریع نشان میدهد.
یک هشدار ساده برای نرخ تلاش دوباره بالای حدی مشخص، معمولاً کافی است تا قبل از اثر روی هزینه و تجربه، مشکل را ببینید.
پرسشهای متداول
چند تلاش دوباره مناسب است؟
برای خطاهای موقت، دو یا سه تلاش با فاصله افزایشی معمولاً کافی است. بیشتر از آن معمولاً یعنی مشکل ساختاری دارید که با تکرار حل نمیشود.
آیا تلاش دوباره هزینه اضافه دارد؟
تلاش دوباره ممکن است مصرف و هزینه تازه ایجاد کند، حتی اگر پاسخ تلاش قبلی به شما نرسیده باشد. اما هر خطا لزوماً قابلصورتحساب نیست؛ رد احراز هویت یا ورودی نامعتبر را نباید خودکار معادل مصرف پولی دانست. مبلغ به کار انجامشده و قواعد صورتحساب سرویس بستگی دارد. تعداد تلاش، سقف خروجی و مصرف نهایی را با هم بررسی کنید.