Stapeln Sie die Exchange API-konforme Anfrage-Drosselklappenimplementierung in der Google App Engine Cloud-Infrastruktur

8

Ich habe eine Google Chrome-Erweiterung für Stack Exchange geschrieben. Es ist eine einfache Erweiterung, mit der Sie Ihren Ruf verfolgen und Benachrichtigungen über Stack Exchange-Sites erhalten können.

Zur Zeit habe ich einige Probleme mit denen ich nicht umgehen kann. Meine Erweiterung verwendet Google App Engine als Back-End, um externe Anforderungen an die Stack Exchange-API zu stellen. Jede einzelne Clientanforderung von der Erweiterung für neue Kommentare an einem einzelnen Standort kann viele Anforderungen an einen API-Endpunkt zur Vorbereitung der Antwort selbst für nicht skeetische Benutzer verursachen. Der durchschnittliche Benutzer hat mindestens Konten auf 3 Sites von Stack Exchange network, einige haben & gt; 10!

Stack Exchange API hat Anforderungslimits:
Eine einzelne IP-Adresse kann nur eine bestimmte Anzahl von API-Anfragen pro Tag (10.000) erstellen.
Die API wird meine Anfragen abschalten, wenn ich mehr als 30 Anfragen über 5 Sekunden von einer einzigen IP-Adresse aus mache.

Es ist klar, dass alle Anfragen auf 30 pro 5 Sekunden gedrosselt werden sollten und derzeit habe ich eine Anforderungs-Drosselungslogik basierend auf einer verteilten Sperre mit Memcached implementiert. Ich verwende memcached als einfachen Sperrmanager, um die Aktivität von GAE-Instanzen zu koordinieren und UrlFetch-Anfragen zu drosseln.
Aber ich denke, es ist ein großer Fehler, eine derart leistungsfähige Infrastruktur so zu begrenzen, dass nicht mehr als 30 Anfragen pro 5 Sekunden ausgegeben werden. Solch eine API-Anfragerate ermöglicht es mir nicht, die Entwicklung neuer interessanter und nützlicher Funktionen fortzusetzen, und eines Tages wird es überhaupt nicht mehr funktionieren.
Jetzt hat meine App 90 Benutzer und wächst und ich muss eine Lösung finden, um die Anfragerate zu maximieren.

Wie bekannt, erstellt App Engine externe Anfragen über den gleichen Pool unterschiedlicher IP-Adressen. Mein Ziel ist es, Request-Throttle-Funktionalität zu schreiben, um die Einhaltung der API-Nutzungsbedingungen zu gewährleisten und GAE-verteilte Funktionen zu nutzen.

Meine Frage ist also, wie ich einen maximalen praktischen API-Durchsatz bereitstellen und gleichzeitig die API-Nutzungsbedingungen erfüllen und GAE-verteilte Funktionen nutzen kann.

Die Verwendung einer anderen Plattform / eines anderen Hosts / Proxys ist für mich einfach sinnlos.

    
Vladyslav Tserman 16.10.2010, 16:53
quelle

2 Antworten

4

Wenn Sie nach einer Möglichkeit suchen, den gemeinsam genutzten IP-Pool von Google App Engine programmgesteuert zu verwalten, sind Sie der festen Überzeugung, dass Sie kein Glück haben.

Wenn ich diesen Ratschlag zitiere, der Teil der FAQ ist, denke ich Sie haben mehr als eine Chance, Ihre tolle App weiter zu betreiben :

  

Was soll ich tun, wenn ich mehr brauche?   Anfragen pro Tag?

     

Bestimmte Arten von Anwendungen -   Dienstleistungen und Websites, um zwei zu nennen -   kann legitimerweise viel höher haben   Anforderungen pro Tag als   Typische Anwendungen. Wenn du kannst   zeigen ein Bedürfnis nach einem höheren   Anfrage Quote, kontaktieren Sie uns.

BEARBEITEN:
Ich habe mich geirrt, eigentlich hast du keine Chance.
Google App Engine [App] s sind zum Scheitern verurteilt .

    
systempuntoout 16.10.2010 20:45
quelle
2

Zunächst einmal: Ich benutze deine Erweiterung und es rockt!

Möchten Sie memcached verwenden und die Ergebnisse zwischenspeichern?
Anstatt die Ergebnisse direkt aus der API zu holen, versuchen Sie zuerst, sie im Cache zu finden, wenn sie ihn benutzen und wenn nicht: sie abrufen und zwischenspeichern und nach X Minuten ablaufen lassen.

Zweitens, versuchen Sie, Benutzeranfragen zu bündeln, anstatt die Reputation eines einzelnen Benutzers zu fragen, fragen Sie die Reputation mehrerer Benutzer zusammen.

    
Shay Erlichmen 16.10.2010 18:03
quelle