ماذا يحدث إذا استدعى أحد التطبيقات أكثر من 10 عمليات جلب URL غير متزامنة على Google App Engine؟

StackOverflow https://stackoverflow.com/questions/3639855

سؤال

قراءة محرك تطبيقات جوجل توثيق عند جلب عنوان URL غير المتزامن:

يمكن أن يكون للتطبيق ما يصل إلى 10 مكالمات URL غير المتزامنة في وقت واحد

ماذا يحدث إذا قام أحد التطبيقات باستدعاء أكثر من 10 عمليات جلب غير متزامنة في المرة الواحدة؟
هل يثير Google App Engine استثناءً أم يقوم ببساطة بوضع قائمة الانتظار للمكالمات المتبقية في انتظار خدمتها؟

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

المحلول

أم، Swizzec غير صحيح.سهل بما فيه الكفاية للاختبار:

rpc = []
for i in range(1,20):
    rpc.append(urlfetch.createrpc())
    urlfetch.make_fetch_call(rpc[-1],"http://stackoverflow.com/questions/3639855/what-happens-if-i-call-more-than-10-asynchronous-url-fetch")

for r in rpc:
    response = r.get_result().status_code

هذا لا يرجع أية استثناءات.في الواقع، هذا يعمل بشكل جيد!لاحظ أن نتائجك قد تختلف بالنسبة للتطبيقات غير القابلة للفوترة.

ما تقوم Swizec بالإبلاغ عنه هو مشكلة مختلفة، تتعلق بالحد الأقصى من الاتصالات المتزامنة في تطبيقك.بالنسبة للتطبيقات القابلة للفوترة، لا يوجد حد عملي هنا بالمناسبة، بل يتم توسيع نطاقه فقط (يخضع لقاعدة 1000 مللي ثانية).

ليس لدى GAE أي طريقة لمعرفة أن معالج الطلب الخاص بك سيصدر جلبًا لعنوان URL للحظر، وبالتالي فإن الاتصال 500 الذي يراه لا يرتبط بما يفعله تطبيقه فعليًا (وهذا تبسيط مفرط بالمناسبة، إذا كان متوسط ​​وقت استجابة الطلب الخاص بك هو> 1000 مللي ثانية احتمال زيادة 500).

نصائح أخرى

هذا سؤال قديم، ولكن أعتقد أن الإجابة المقبولة غير صحيحة أو قديمة وقد تربك الناس.لقد قمت بالفعل باختبار ذلك منذ بضعة أشهر، ولكن من خلال تجربتي، فإن Swizec محق تمامًا في أن GAE لن يقف في قائمة الانتظار ولكنه يفشل في معظم عمليات جلب عناوين URL غير المتزامنة التي تتجاوز الحد الأقصى البالغ حوالي 10 عمليات متزامنة لكل طلب.

يرى https://developers.google.com/appengine/docs/python/urlfetch/#Python_Making_requests و https://groups.google.com/forum/#!topic/google-appengine/EoYTmnDvg8U للحصول على وصف الحد.

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

لقد قمت بتنفيذ شيء مشابه لـ Java، والذي يحظر الطلبات الإضافية بشكل متزامن (بسبب عدم وجود وظيفة رد اتصال أو ListableFutures):

/**
 * A URLFetchService wrapper that ensures that only 10 simultaneous asynchronous fetch requests are scheduled. If the
 * limit is reached, the fetchAsync operations will block until another request completes.
 */
public class BlockingURLFetchService implements URLFetchService {
    private final static int MAX_SIMULTANEOUS_ASYNC_REQUESTS = 10;

    private final URLFetchService urlFetchService = URLFetchServiceFactory.getURLFetchService();
    private final Queue<Future<HTTPResponse>> activeFetches = new LinkedList<>();

    @Override
    public HTTPResponse fetch(URL url) throws IOException {
        return urlFetchService.fetch(url);
    }

    @Override
    public HTTPResponse fetch(HTTPRequest request) throws IOException {
        return urlFetchService.fetch(request);
    }

    @Override
    public Future<HTTPResponse> fetchAsync(URL url) {
        block();

        Future<HTTPResponse> future = urlFetchService.fetchAsync(url);
        activeFetches.add(future);
        return future;
    }

    @Override
    public Future<HTTPResponse> fetchAsync(HTTPRequest request) {
        block();

        Future<HTTPResponse> future = urlFetchService.fetchAsync(request);
        activeFetches.add(future);
        return future;
    }

    private void block() {
        while (activeFetches.size() >= MAX_SIMULTANEOUS_ASYNC_REQUESTS) {
            // Max. simultaneous async requests reached; wait for one to complete
            Iterator<Future<HTTPResponse>> it = activeFetches.iterator();
            while (it.hasNext()) {
                if (it.next().isDone()) {
                    it.remove();
                    break;
                }
            }
        }
    }
}

500 خطأ تبدأ في الحدوث. بصمت.

يمكنك فقط معرفة هذه عندما تنظر إلى السجل الخاص بك ضمن جميع الطلبات (لا يتم إدراجها كأخطاء). إنه يقول ببساطة "تم إحباط الطلب لأنك وصلت إلى حد الطلبات المتزامنة".

لذلك عندما تقوم بإجراء الكثير من المكالمات غير المتزامنة ، تأكد من أنه يمكنك التعامل مع بعضها.

معرفة ما إذا كان هذا يجيب على سؤالك:

http://groups.google.com/group/google-appengine/browse_thread/thread/1286139a70ef83c5؟fwc=1

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