إعادة المحاولة مع التراجع الأسي
استخدم tenacity لإعادة محاولة حالات الفشل المؤقتة مع تأخيرات متزايدة أسيًا وإضافة jitter.
إعادة المحاولة مع التراجع الأسي درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
لماذا إعادة المحاولة؟
تفشل الاستدعاءات الخارجية (LLMs وواجهات بحث API وقواعد بيانات المتجهات) بشكل مؤقت. وتتعافى إعادة المحاولة البسيطة من معظم حالات عدم الاستقرار من دون إزعاج المستخدم.
ما يجب عدم فعله
لا تعاود المحاولة فورًا في حلقة ضيقة — إذ ستضغط على الخدمة بشدة، وسيمنعك محدِّد معدل الطلبات من الوصول إليها:
# BAD
for _ in range(10):
try:
return call_api()
except Exception:
passالتراجع الأسي
انتظر مدة أطول بعد كل فشل. ويُعد استخدام الأس 2 هو الاصطلاح المتّبع:
import time
def call_with_backoff(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except TransientError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4, 8, 16 secondsإضافة التذبذب العشوائي
من دون التذبذب العشوائي، تتزامن محاولات العملاء الكثيرين — مما ينشئ حركة مرور هائلة ومفاجئة. أضف إزاحةً عشوائية:
import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)استخدام Tenacity
تنفّذ مكتبة tenacity ذلك نيابةً عنك:
from tenacity import retry, wait_exponential_jitter, stop_after_attempt, retry_if_exception_type
import requests
@retry(
wait=wait_exponential_jitter(initial=1, max=30),
stop=stop_after_attempt(5),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def search(query):
return requests.get('https://api.tavily.com/search', timeout=10).json()إعادة المحاولة للأخطاء المؤقتة فقط
لا تعاود المحاولة مطلقًا عند:
- أخطاء 4xx (طلب غير صالح — لن تساعد إعادة المحاولة)
- فشل المصادقة
- أخطاء التحقق
أعد المحاولة عند:
- انتهاء المهلة الزمنية
- أخطاء الخادم 5xx
- تجاوز حدود معدل الطلبات (مع فترات انتظار أطول)
إعادة محاولات تراعي حدود المعدل
التزم بترويسة Retry-After:
if response.status_code == 429:
wait = int(response.headers.get('Retry-After', 5))
time.sleep(wait)
continueتقييد إجمالي وقت إعادة المحاولة
ضع حدًا للمدة الإجمالية التي يمكن أن تستغرقها إعادة المحاولات — عادةً من 30 إلى 60 ثانية للاستدعاء الموجّه إلى المستخدم:
from tenacity import stop_after_delay
@retry(
wait=wait_exponential_jitter(initial=1, max=10),
stop=stop_after_delay(60)
)
def call_api():
...ترويسات قابلية التكرار
بالنسبة إلى واجهات API غير القابلة للتكرار (مثل Stripe)، أدرج مفتاح قابلية التكرار في كل إعادة محاولة حتى تُدمج العمليات المكررة:
headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}أعد محاولة استدعاء LLM أيضًا
تعيد حِزمتا SDK الخاصة بـ OpenAI وAnthropic المحاولة تلقائيًا مرة أو مرتين. ويمكنك تهيئتهما:
client = OpenAI(max_retries=5, timeout=30.0)إعادة المحاولة غير المتزامنة
بالنسبة إلى التعليمات البرمجية غير المتزامنة:
from tenacity import AsyncRetrying
async for attempt in AsyncRetrying(wait=wait_exponential_jitter(), stop=stop_after_attempt(5)):
with attempt:
result = await call_api()تسجيل عمليات إعادة المحاولة
يجب أن تسجّل كل إعادة محاولة: رقم المحاولة، ومدة السكون، وسبب الخطأ. وإلا فسيكون تصحيح سبب «البطء الشديد» مستحيلًا.
إعادة المحاولة مقابل المهلات الزمنية
عيّن مهلة زمنية قصيرة لكل محاولة (مثلًا 10s) وحدًا إجماليًا باستخدام stop_after_delay (مثلًا 60s). ومن دون كليهما، قد يظل اتصال متعطل معلّقًا إلى الأبد.
لماذا التذبذب العشوائي؟
لماذا نضيف تذبذبًا عشوائيًا إلى فترات تأخير إعادة المحاولة؟
مراجعة
تراجع أسي + تذبذب عشوائي + مدة إجمالية محددة + إعادة المحاولة للأخطاء المؤقتة فقط. استخدم tenacity لتجنّب التعليمات المتكررة.
الأسئلة الشائعة
هل درس «إعادة المحاولة مع التراجع الأسي» مجاني؟
نعم — نص درس «إعادة المحاولة مع التراجع الأسي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «إعادة المحاولة مع التراجع الأسي»؟
استخدم tenacity لإعادة محاولة حالات الفشل المؤقتة مع تأخيرات متزايدة أسيًا وإضافة jitter. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إعادة المحاولة مع التراجع الأسي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأدوات غير المتكررة والآثار الجانبية
- إعادة المحاولة مع التراجع الأسي
- المهلات وقواطع الدائرة
- التحقق من مخرجات الأدوات (Pydantic)