سؤال

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

 from google.appengine.api import urlfetch

 url = www.site2.com/data_updated
 result = urlfetch.fetch(url)

داخل معالج data_updated على "site2" لدي:

 url = www.site1.com/get_new_data
 result = urlfetch.fetch(url)

هناك القليل جدًا من البيانات التي يتم تمريرها بين الموقعين ولكني أتلقى الخطأ التالي.لقد حاولت زيادة الموعد النهائي إلى 10 ثوانٍ ولكن هذا لا يزال لا يعمل.

 DeadlineExceededError: ApplicationError: 5 

هل يمكن لأي شخص تقديم أي فكرة عما قد يحدث؟

شكرا - ريتشارد

هل كانت مفيدة؟

المحلول 2

تغيير الطريقة من

Genacodicetagpre

إلى Genacodicetagpre

أصلح أخطاء الموعد النهائي.

من وثائق urlfetch :

الموعد النهائي أقصى مدة انتظار للحصول على استجابة من المضيف البعيد ، بعدد الثواني.إذا لم يكن المضيف البعيد في هذه الفترة الزمنية ، يظهر خطأ DownloadError.

لا يتم احتساب الوقت المنقضي في انتظار أحد الطلبات ضمن حصة وحدة المعالجة المركزية للطلب.لا يتم احتسابه تجاه عداد الطلب.إذا كان التطبيق تنتهي صلاحية مؤقت الطلب قبل عودة استدعاء جلب عنوان URL ، وتكون المكالمة تم إلغاؤه.

يمكن أن يصل الموعد النهائي إلى 60 ثانية كحد أقصى لمعالجات الطلبات و 10 دقائق للمهام معالجات قائمة الانتظار ووظائف cron.إذا كان الموعد النهائي لا شيء ، تم تعيين الموعد النهائي على 5 ثوانٍ.

نصائح أخرى

محرك التطبيقات urlfetch لا يعمل دائمًا كما هو متوقع، فلديك حوالي 10 ثوانٍ لجلب عنوان URL.بافتراض أن عنوان URL الذي تحاول جلبه قيد التشغيل، فمن المفترض أن تكون قادرًا على التقاط ملف DeadlineExceededError بالاتصال from google.appengine.runtime import apiproxy_errors ثم قم بتغليف استدعاء urlfetch داخل محاولة/باستثناء الكتلة باستخدام except apiproxy_errors.DeadlineExceededError:.

الإجابة ذات الصلة هنا.

هل حاولت الاستعلام يدويًا عن عناوين URL (www.site2.com/data_updated وwww.site1.com/get_new_data) باستخدام curl أو للتأكد من أنهم يستجيبون خلال المهلة الزمنية؟حتى لو كانت كمية البيانات المطلوب نقلها صغيرة، فقد تكون هناك مشكلة في المعالج تتسبب في تأخير إرجاع النتائج.

لا يمثل حجم البيانات التي يتم نقلها مشكلة هنا ، بل هو وقت الاستجابة.

إذا كان التطبيق الذي تتحدث إليه غالبًا ما يستغرق أكثر من 10 ثوانٍ للاستجابة ، فسيتعين عليك استخدام خادم "إعادة اتصال وكيل" على نظام أساسي سحابي آخر (EC2 ، وما إلى ذلك).من المفترض أن تخفف مثيلات الواجهة الخلفية من حدود وقت جلب url إلى حد ما.

إذا كان متوسط وقت الاستجابة أقل من 10 ثوانٍ ، وفشل عدد قليل نسبيًا ، فأعد المحاولة بضع مرات.آمل من أجلك أن تكون المكالمات خاملة (أي حتى لا يكون لإعادة المحاولة آثار سلبية).إذا لم يكن الأمر كذلك ، فقد تتمكن من دحرجة الطبقة الخاصة بك في الأعلى - إنها مؤلمة بعض الشيء ولكنها تعمل بشكل جيد ، وهذا ما نفعله.

ي

ينص مستند GAE الآن على أن الموعد النهائي يمكن أن يكون 60 ثانية: Genacodicetagpre

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top