أعد محاولة الطلب الفاشل تلقائيًا
flow.retry يعيد بنفسه محاولة تشغيل مهمة فشلت لسبب عابر — شبكة تذبذبت، خدمة توقفت للحظة. بدل أن تتولى شيفرتك معالجة كل عثرة عبر حلقات مكتوبة يدويًا، تُعاد المحاولة تلقائيًا عبر الـAPI، بانتظار يزداد مع كل جولة حتى لا تُلحّ في الوقت الخطأ. كل محاولة بسعر $0.002.
ليس كل فشل حقيقيًا
معظم أخطاء الربط بين الأنظمة عابرة: الشبكة تذبذبت، الخدمة على الطرف الآخر أعادت التشغيل، حدٌّ لحظي وصل. إعادة المحاولة بعد ثلاثين ثانية عادة ما تحل المشكلة — تمامًا كما يفعل إنسان يحاول مجددًا. المشكلة أن حشو الشيفرة بحلقات إعادة محاولة وعدادات وأوقات انتظار متناثرة في كل طلب هش يُصعِّب الصيانة. تجمع إعادة المحاولة التلقائية هذه العادة في مكان واحد: تُعلِّم المهمة أنها تستحق الإصرار، وهي تُصرّ نيابة عنك.
انتظار أطول مع كل محاولة
الإلحاح المتتابع يزيد الأمر سوءًا — إن سقطت الخدمة بسبب ازدحام، فمهاجمتها دون توقف يُغرقها أكثر. لذلك ينتظر النظام وقتًا متزايدًا بين كل جولة وأخرى: ثوانٍ قليلة، ثم أكثر، ثم أكثر، ليمنح الطرف الآخر وقتًا للتعافي. تحدّد أنت الحد الأقصى لعدد المحاولات، وتتوقف إعادة المحاولة عند بلوغ ذلك السقف، دون أن تظل تطرق بابًا لن يُفتَح، ودون أن تدفع مقابل إصرار لا طائل منه.
أين تناسب إعادة المحاولة
تبرز في الأطراف الهشة من تدفقاتك. عملية تسليم webhook إلى نظام يتأخر أحيانًا في الاستجابة، خطوة في سلسلة تعتمد على خدمة خارجية، تسليم لا يحتمل ضياعه بسبب اضطراب شبكة عابر — كلها تكتسب متانة دون إعادة كتابة المنطق. مقرونة بالسلسلة، هي الفارق بين تدفق ينهار عند أول عثرة وآخر يتحمل واقع الشبكة الحقيقي دون تدخل يدوي كل مرة يتعثر فيها طرف خارجي.
السعر، ومتى لا يجدي الإصرار
كل محاولة بسعر $0.002 — الأولى والمتكررة معًا. مهمة نجحت من أول مرة تكلّف محاولة واحدة؛ ومهمة احتاجت ثلاث جولات حتى نجحت تكلّف ثلاثًا. لهذا يهم سقف المحاولات: يمنع إنفاقًا بلا فائدة على فشل ليس عابرًا. خطأ في البيانات — رقم آيبان غير صحيح، ملف تالف — لا يتحسن بالإصرار؛ الأصح في هذه الحالة الفشل فورًا والتنبيه، لا التكرار. الدفع مقابل الاستخدام.
حالات الاستخدام
webhook لنظام إداري يُعاد تشغيله ليلًا
ترسل شركة الخليج الرقمية طلبات webhook لنظام إداري لدى عميل يُعاد تشغيله أحيانًا ليلًا. مع إعادة المحاولة، ينتظر التسليم ويحاول بنفسه — في الصباح، وصل كل شيء دون مناوب مستيقظ.
خطوة هشة في سلسلة
تعتمد سلسلة لدى مؤسسة النخيل للمقاولات على خدمة شحن خارجية تتذبذب في ساعات الذروة. تكتسب الخطوة الهشة إعادة محاولة، وتتوقف السلسلة عن الانهيار بسبب تعثّر عشر ثوانٍ.
رسالة تأكيد لا يجوز أن تُفقَد
يرسل عبدالله المنصوري رسائل تأكيد التسجيل في دوراته. حين يفشل الإرسال للحظة، تُعيد إعادة المحاولة الإرسال بنفسها — يستلم الطالب الوصول رغم ذلك، دون أن تتحول المشكلة إلى تذكرة دعم.
تنبيه مخزون لا يجوز أن يضيع
يُخبر متجر شركة الواحة للتجارة المحدودة نظام المخزون عند كل عملية بيع. إن فشل التنبيه بسبب الشبكة، تسدّ إعادة المحاولة الفجوة ولا يخرج المخزون عن مساره بسبب خطأ عابر.
الأسئلة الشائعة
أي نوع من الفشل يستحق إعادة المحاولة؟
الفشل العابر: شبكة تذبذبت، خدمة توقفت للحظة، حد لحظي وصل. خطأ البيانات — آيبان غير صحيح، ملف تالف — لا يتحسن بالإصرار؛ الأصح فيه الفشل فورًا والتنبيه.
هل تحدث المحاولات متتالية مباشرة؟
لا. يزداد وقت الانتظار مع كل جولة — ثوانٍ قليلة، ثم أكثر — لمنح الطرف الآخر وقتًا للتعافي، بدل مهاجمة خدمة مثقَلة أصلًا.
كيف أتجنّب المحاولة إلى الأبد؟
تحدّد العدد الأقصى للمحاولات. عند بلوغ هذا السقف، تتوقف إعادة المحاولة ويعود الخطأ إلى تدفقك ليقرر — دون طرق باب لن يُفتَح إلى الأبد.
كم تكلفة كل محاولة؟
$0.002 لكل محاولة، بما فيها الأولى. مهمة احتاجت ثلاث جولات تكلّف ثلاثًا؛ مهمة نجحت من أول مرة تكلّف واحدة. لهذا يوفّر السقف إنفاقًا بلا داعٍ.
هل يمكن استخدامها مع webhook والسلاسل معًا؟
نعم، وهذا أكثر ما تفيد فيه: عمليات تسليم webhook وخطوات السلسلة المعتمدة على أطراف أخرى تكتسب متانة دون إعادة كتابة أي منطق. هي القطعة التي تجعل التدفق يتحمل واقع الشبكة.
هل تُحفَظ بيانات المهمة بين المحاولات؟
ما يلزم لإعادة المحاولة يُعالَج لهذا الغرض وحده ولا يصبح أرشيفًا لدينا. تعود النتيجة إليك عند النجاح؛ السجل طويل المدى مسؤولية نظامك.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/flow/retry \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/flow/retry", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/flow/retry",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/flow/retry", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/flow/retry", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"input": "…"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "flow.retry",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |