8

Ich habe geschrieben a Google Chrome extension for Stack Exchange. Es ist eine einfache Erweiterung, mit der Sie Ihren Ruf verfolgen und Kommentare zu Stack Exchange-Sites erhalten können.Stack Exchange API-kompatible Anfrage Drosselklappen-Implementierung in Google App Engine Cloud-Infrastruktur

Derzeit habe ich mit einigen Problemen konfrontiert, die ich selbst nicht bewältigen 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> 10!

Die Stack Exchange-API verfügt über Anforderungsbeschränkungen:
Eine einzelne IP-Adresse kann nur eine bestimmte Anzahl von API-Anfragen pro Tag (10.000) erstellen.
Die API wird meine Anfragen abschneiden, wenn ich mehr als 30 Anfragen über 5 Sekunden von einer einzelnen IP-Adresse aus mache.

Es ist klar, dass alle Anfragen auf 30 pro 5 Sekunden gedrosselt werden sollen und derzeit habe ich Anfrage Drosselungslogik basierend auf einer verteilten Sperre mit Memcached implementiert. Ich benutze memcached als einen einfachen Lock-Manager, um die Aktivität von GAE-Instanzen zu koordinieren und UrlFetch-Anfragen zu drosseln.
Aber ich denke, es ist ein großer Fehler, eine solche leistungsfähige Infrastruktur zu begrenzen, um nicht mehr als 30 Anfragen pro 5 Sekunden auszugeben. Eine solche Anforderungsrate erlaubt 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 brauche eine Lösung, um die Anfragerate zu maximieren.

Wie bekannt macht App Engine externe UrlFetch-Anfragen über denselben Pool von verschiedenen IPs. Mein Ziel ist es, Request-Throttle-Funktionalität zu schreiben, um die Einhaltung der API-Nutzungsbedingungen zu gewährleisten und verteilte GAE-Funktionen zu nutzen.

Also meine Frage ist, wie - maximale praktische API-Durchsatz bei gleichzeitiger Einhaltung der API-Nutzungsbedingungen und die Nutzung GAE verteilte Fähigkeiten.

Beratung, eine andere Plattform/Host/Proxy zu verwenden, ist einfach nutzlos in meinem Kopf.

+0

Ihre Chrome-Erweiterung sendet also Anfragen an Ihren Server, und dann sendet Ihr Server Anfragen an die Stack-API? Wäre es möglich, stack api direkt aus Chrome aufzurufen? – serg

+0

@serg, Ja, es wäre möglich, aber dies bedeutet, dass die Erweiterung ständig viele Anfragen an den api-Endpunkt für jedes Benutzerkonto stellt. Multiplizieren Sie dies mit der Anzahl der Benutzerkonten. Außerdem wird eine zusätzliche Berechtigung für den Zugriff auf API-Endpunkte von der Erweiterung benötigt. Aber ja, jetzt denke ich über diese Lösung –

+0

Wenn sie 10k Anfragen von einer einzigen API erlauben, dann denke ich, dass sie damit umgehen können. – serg

Antwort

2

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

Haben Sie in Erwägung gezogen, memcached zu verwenden und die Ergebnisse zwischenzuspeichern?
Anstatt die Ergebnisse direkt von der API zu übernehmen, versuchen Sie zuerst, sie im Cache zu finden, wenn sie es verwenden, und wenn nicht: rufen Sie sie ab und cachen Sie sie und lassen Sie sie nach X Minuten ablaufen.

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

+0

danke für die Verwendung. Ja, ich benutze memcached, um die API-Antwort zu cachen, aber selbst dies kann mir nicht helfen, die Anzahl der API-Anfragen stark zu reduzieren. Die Idee, Anfragen zu bündeln, scheint mir hilfreich zu sein, danke. –

+1

@Vlasislav, das ist irgendwie lustig, ich, Shay und Sie konkurrieren um die gleiche Quote, da wir alle eine Webanwendung auf GAE laufen haben. Jetzt entdeckt! http://stackapps.com/questions/1708/stackprinter-this-ip-has-exceeded-the-request-per-day-limit – systempuntoout

+0

@Vlasislav http://stackapps.com/questions/1713/google-app- Engine-Apps-Warum-Do-You-Drossel-Just-Check-The-IP – systempuntoout

4

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

Wie auch immer, diesen Rat zu zitieren, die Teil des faq ist, Ich glaube, Sie haben mehr als eine gute Möglichkeit, sich auf Ihr ehrfürchtige app zu halten :

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

Bestimmte Arten von Anwendungen - Dienste und Websites zu nennen zwei - berechtigterweise viel höher haben kann pro Tag Anfrage Anforderungen als typische Anwendungen. Wenn Sie können Bedarf für eine höhere Anfrage Quote nachweisen, kontaktieren Sie uns.

EDIT:
ich war falsch, Sie haben eigentlich keine Chance.
Google App Engine [App] s sind doomed.

+0

Dank @systempuntoout, ich bin mir dieser Möglichkeit bewusst. Ich kann irgendwie 10.000 pro IP-Anfrage-Limit umgehen, aber eigentlich brauche ich meist erweiterte Anfragen "Geschwindigkeit", sagen 30 pro Sekunde oder mehr, aber sie sagen "Bitte fordern Sie nur eine erhöhte Quote, wenn Ihre Anwendung live ist und ein non hat - durchschnittliche Anzahl der Benutzer ". Ich bin nicht sicher, dass 100 und sogar 1000 eine nicht-triviale Anzahl von Benutzern ist. –

+0

Während ich programmgesteuert den App Engine-Pool von IPs verwaltete, dachte ich auch, dass es in diesem Moment unmöglich ist. Wahrscheinlich werde ich ein Problem im GAE Issue Tracker füllen. –

+1

@Vladislav Wie Sie bereits gesagt haben, sollten Sie Ihre Geschäftslogik in den Browser verschieben (wo IP kein Problem ist), indem Sie eine ausgereifte js-Bibliothek wie SOAPI.js verwenden. – systempuntoout