FUNCTION_INVOCATION_TIMEOUT في Vercel: ليش تنتهي المهلة؟

خطأ FUNCTION_INVOCATION_TIMEOUT في Vercel يعني إن دالة السيرفر ما ردّت في وقتها. ليش يصير مع طلبات الذكاء الاصطناعي وقاعدة البيانات، وكيف تحله صح.

22 أكتوبر 2026 (11 جمادى الأولى 1448 هـ) · قراءة 4 دقائق · كتبها م. معاذ أحمد

منتجك منشور على Vercel، وطلب معيّن يعلّق شوي ثم يرجع بخطأ 504، ولو فتحت الرد تلقى FUNCTION_INVOCATION_TIMEOUT. غالبًا يصير في صفحة تولّد نص بالذكاء الاصطناعي، أو تطلّع تقرير، أو ترفع ملف. المعنى ببساطة: دالة السيرفر اللي تخدم هالطلب ما ردّت قبل ما تخلص المهلة المسموحة لها، فـ Vercel قطعها.

إيش يعني بالضبط

الكود اللي يشتغل على السيرفر في Vercel ما يشتغل على جهاز مفتوح طول الوقت. كل طلب يشغّل دالة (Vercel Function)، ولكل طلب حد أقصى لمدة التشغيل: في الإعداد الافتراضي (Fluid compute) 300 ثانية في كل الخطط، وتقدر ترفعه حتى 800 ثانية في Pro و Enterprise. المشاريع القديمة اللي ما فعّلت Fluid compute حدودها أقل بكثير. إذا الدالة ما رجّعت رد قبل هالحد، Vercel يوقفها ويرجّع للمتصفح 504 مع هالكود.

يعني المشكلة مو إن السيرفر تعطّل. المشكلة إن شيء داخل الطلب أخذ وقت أطول من المسموح، أو إن الدالة ما ترد أبد.

ليش يصير كثير في المنتجات المبنية بالذكاء الاصطناعي

  • طلب ذكاء اصطناعي طويل: الكود ينتظر OpenAI أو Anthropic حتى يخلص النص كامل، وبعدها يرد. نص طويل جدًا، أو نموذج يفكّر طويل، أو عدة طلبات ورا بعض، ممكن تتجاوز المهلة، خصوصًا في مشروع قديم حدوده أقل.
  • شغل ثقيل داخل الطلب: توليد PDF، أو معالجة صور، أو إرسال إيميلات لمئات المستخدمين، كلها داخل نفس الطلب اللي ينتظره المتصفح.
  • قاعدة بيانات بعيدة: الدالة في منطقة (region) وقاعدة البيانات في قارة ثانية، وكل استعلام يروح ويرجع. مع عشرين استعلام في الطلب الواحد، الوقت يتجمّع.
  • دالة ما ترد أبد: مسار في الكود ينسى يرجّع رد، مثل حالة خطأ ما فيها return، أو await على شيء ما يخلص. الدالة تنتظر حتى تنتهي المهلة.
  • اتصال جديد بقاعدة البيانات في كل طلب: فتح الاتصال نفسه ياخذ وقت، ومع الزحمة يصير أبطأ. شوف درس too many connections.

كيف تتأكد بنفسك

  1. افتح الصفحة، واضغط F12، وافتح تبويب Network. سوّ الشي اللي يعلّق، ودوّر على الطلب اللي رجع 504. عمود Time يقول لك كم ثانية انتظر.
  2. في لوحة Vercel افتح مشروعك ثم Logs، وفلتر على نفس المسار. السجل يقول لك إن الدالة انتهت مهلتها، وأحيانًا يبيّن آخر شيء كتبته قبل ما تنقطع.
  3. اسأل: يصير دايم، ولا مع طلبات معيّنة فقط؟ إذا مع نص طويل أو ملف كبير فقط، السبب غالبًا الشغل الثقيل. إذا يصير حتى مع طلب صغير، دوّر على دالة ما ترد أو على قاعدة بيانات بعيدة.
  4. شوف منطقة الدالة في إعدادات المشروع في Vercel، وقارنها بمنطقة قاعدة البيانات (في Supabase تلقاها في إعدادات المشروع). إذا وحدة في أمريكا والثانية في أوروبا، هذا وقت ضايع في كل استعلام.

الحل الصح

الحل يعتمد على السبب، وغالبًا واحد من هذي:

  • ردود الذكاء الاصطناعي: خلّ الرد يوصل للمستخدم أول بأول (streaming) بدل ما ينتظر النص كامل. المستخدم يشوف الكلام يطلع، والطلب ما يعلّق ساكت. لكن انتبه: وقت البث نفسه محسوب من المهلة، فلو التوليد كله ياخذ أطول من الحد، ينقطع في النص.
  • الشغل الثقيل: يطلع من الطلب. الطلب يسجّل المهمة ويرد فورًا «جاري التجهيز»، والمهمة تشتغل في الخلفية (queue أو background job)، والصفحة تتابع النتيجة. هذا الأسلوب الصح لتقارير PDF والإيميلات الجماعية.
  • المسافة: حط الدالة في نفس منطقة قاعدة البيانات أو أقرب لها.
  • دالة ما ترد: كل مسار في الكود لازم ينتهي برد، حتى مسار الخطأ. وكل طلب لخدمة خارجية له حد زمني، عشان ما تنتظر للأبد.
  • رفع المهلة: Vercel يسمح ترفع المدة القصوى للدالة (maxDuration) ضمن حدود خطتك. هذا حل مقبول لما تعرف إن المهمة فعلًا تحتاج وقت أطول بشوي، مو كبداية.

الحل اللي لا تسويه

أدوات الذكاء الاصطناعي غالبًا تقترح ترفع maxDuration لأعلى رقم، أو ترقّي الخطة. هذا يخفي العرض ولا يصلّح السبب: المستخدم ينتظر دقيقة قدام شاشة ما تتحرك، وتدفع وقت تشغيل أكثر في كل طلب، وأول ما يزيد الضغط ترجع نفس المشكلة. وإذا السبب دالة ما ترد أبد، رفع المهلة يعني إنها تعلّق وقت أطول فقط.

إذا تبي أحد يشوفها معك

إذا عرفت الطلب اللي يعلّق وتبي توصل لسببه، احجز مكالمة استشارية: نشارك الشاشة، ونقرأ السجلات، ونطلع بخطوات واضحة. وإذا تبيه ينصلح كامل وينتقل الشغل الثقيل للخلفية، فيه الإصلاح المباشر. ولو البطء يظهر مع الزحمة بشكل عام، اقرأ منتجك يبطّأ لما يكثر الناس؟

عندك نفس المشكلة؟

علّمنا إيش صار بدون كلام تقني، ونقول لك إيش تحتاج وكم يكلّف.

ابدأ طلبك

بدون أي كلمة سر · عرض السعر مجاني