رفتن به محتوای اصلی
ساینوساینوساینو
قیمت‌گذاریمستنداتوضعیتدرباره ما
ورودشروع کنید
ساینوساینو

ایده‌های خوب
به یک اتصال عالی نیاز دارند.

نماد اعتماد الکترونیکی
دروازه پرداخت معتبر زرینپال
نشان اعتباری ایمالز

پلتفرم

قیمت‌گذاریخرید اعتبارمحیط آزمایشوضعیت سرویس

منابع

مستنداتوبلاگاخبارارتباط با ما

شرکت

درباره ساینوحریم خصوصیشرایط استفاده
© 2026 Cynoبرای ایده‌های فردا ساخته شده.
ساینو/وبلاگ/مهندسی
مهندسیمنتشر شده ۱ آبان ۱۴۰۵به‌روزرسانی ۱ آبان ۱۴۰۵۲ دقیقه مطالعه

وقتی درخواست خطا می‌دهد، چند بار تلاش کنیم؟

تلاش دوباره ابزار خوبی است، به شرطی که سقف داشته باشد. بدون سقف، یک خطای موقت کوچک می‌تواند هم هزینه را چند برابر کند و هم کاربر را پشت یک صف طولانی نگه دارد.

  • خطا
  • تلاش مجدد
  • پایداری
نمودار تلاش‌های محدود با فاصله افزایشیتلاش ۱۵۰۰msتلاش ۲۱sتلاش ۳۲sتوقفمهلت کل عملیات۲۰ ثانیهحداکثر ۳ تلاش
در این نوشته
  1. همه خطاها موقتی نیستند
  2. تعداد تلاش و زمان کل را محدود کنید
  3. نتیجه نامعلوم را جدی بگیرید
  4. تلاش‌ها را اندازه بگیرید

خلاصه کاربردی

  • همه خطاها با تلاش دوباره حل نمی‌شوند؛ ابتدا دسته‌بندی کنید.
  • هم تعداد تلاش و هم زمان کل را محدود کنید.
  • نتیجه نامعلوم را با شناسه درخواست ثبت کنید.

همه خطاها موقتی نیستند

تلاش دوباره معمولاً کلید نامعتبر یا ورودی نادرست را اصلاح نمی‌کند. خطاها را بر اساس قرارداد API دسته‌بندی کنید. برای محدودیت نرخ، راهنمای زمان انتظار پاسخ را رعایت کنید و برای خطای موقت، تعداد تلاش محدود داشته باشید.

  • خطای احراز هویت یا ورودی نامعتبر: تلاش دوباره نکنید؛ درخواست را اصلاح کنید.
  • محدودیت نرخ: زمان انتظار اعلام‌شده را رعایت کنید، نه یک فاصله ثابت.
  • خطای موقت سرویس: حداکثر دو یا سه تلاش با فاصله افزایشی.
  • خطای شبکه: یک تلاش دوباره منطقی است، اما مهلت کل را فراموش نکنید.

تعداد تلاش و زمان کل را محدود کنید

فاصله تلاش‌ها را به‌تدریج افزایش دهید و کمی تغییر تصادفی به آن اضافه کنید تا درخواست‌ها هم‌زمان برنگردند. علاوه بر سقف تعداد، برای کل عملیات مهلت زمانی تعیین کنید.

سقف ۲۰ ثانیه‌ای برای درخواست و فاصله تلاش‌ها در Node.jsjavascript
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.
مهلت کل مهم‌تر از تعداد تلاش است

سه تلاش با فاصله زیاد می‌تواند از نظر تعداد کم باشد، اما کاربر را دقیقه‌ها منتظر نگه دارد. مهلت کل، تجربه کاربر را از نظر زمان محافظت می‌کند.

نتیجه نامعلوم را جدی بگیرید

قطع اتصال الزاماً به معنی انجام‌نشدن درخواست نیست. تلاش مجدد ممکن است هزینه تازه ایجاد کند. شناسه درخواست و اطلاعات مصرف را ثبت کنید و برای عملیات دارای اثر جانبی، فقط در صورت پشتیبانی صریح سرویس به تضمین عدم تکرار اتکا کنید.

تکرار تولید متن هم ممکن است هزینه تازه یا خروجی متفاوت بسازد. اگر برنامه ابزارهایی مثل ثبت سفارش یا ارسال پیام اجرا می‌کند، جلوگیری از اجرای دوباره را در همان لایه پیاده کنید. کلید یکتا فقط وقتی از تکرار جلوگیری می‌کند که سرویس مقصد آن را پشتیبانی و اعمال کند.

تلاش‌ها را اندازه بگیرید

اگر نرخ تلاش دوباره بالا می‌رود، به‌جای افزایش سقف، علت را پیدا کنید. ممکن است مشکل در زمان‌بندی درخواست‌ها، حجم بالای همزمانی یا خطای برنامه‌نویسی باشد. ثبت شماره تلاش در لاگ، این الگو را سریع نشان می‌دهد.

یک هشدار ساده برای نرخ تلاش دوباره بالای حدی مشخص، معمولاً کافی است تا قبل از اثر روی هزینه و تجربه، مشکل را ببینید.

پرسش‌های متداول

چند تلاش دوباره مناسب است؟

برای خطاهای موقت، دو یا سه تلاش با فاصله افزایشی معمولاً کافی است. بیشتر از آن معمولاً یعنی مشکل ساختاری دارید که با تکرار حل نمی‌شود.

آیا تلاش دوباره هزینه اضافه دارد؟

تلاش دوباره ممکن است مصرف و هزینه تازه ایجاد کند، حتی اگر پاسخ تلاش قبلی به شما نرسیده باشد. اما هر خطا لزوماً قابل‌صورتحساب نیست؛ رد احراز هویت یا ورودی نامعتبر را نباید خودکار معادل مصرف پولی دانست. مبلغ به کار انجام‌شده و قواعد صورتحساب سرویس بستگی دارد. تعداد تلاش، سقف خروجی و مصرف نهایی را با هم بررسی کنید.

منابع و ادامه مطالعه

  • خطاها و تلاش مجدد
  • محدودیت درخواست

راهنماهای مرتبط

همه راهنماها
نمودار رسیدن تدریجی بخش‌های پاسخاولین توکنانتظار → جریان دادهقطع ناگهانی
مهندسی

پاسخ جریانی؛ از اولین توکن تا تجربه بهتر

نمودار مسیر درخواست از برنامه به درگاه و انتخاب مدلبرنامهدرخواستدرگاهcyno.irمدل ارزانکار سادهمدل میانهمدل قویکار دشوار
راهنمای عملی

خرید API هوش مصنوعی با پرداخت تومانی؛ چک‌لیست قبل از خرید

همه راهنماها مقایسه تعرفه‌ها