8

He estado escribiendo a Google Chrome extension for Stack Exchange. Es una extensión simple que le permite realizar un seguimiento de su reputación y recibir notificaciones de los comentarios en los sitios de Stack Exchange.Stack Exchange API solicitud aplicación acelerador en Google App Engine Cloud infraestructura

Actualmente me he encontrado con algunos problemas que no puedo resolver. Mi extensión usa Google App Engine como su back-end para realizar solicitudes externas a Stack API de Exchange. Cada solicitud individual de cliente de la extensión para nuevos comentarios en un solo sitio puede causar una gran cantidad de solicitudes al punto final de la API para preparar la respuesta, incluso para usuarios que no son expertos. El usuario promedio tiene cuentas al menos en 3 sitios de la red Stack Exchange, ¡algunas tienen> 10!

Stack Exchange API tiene límites de solicitud:
Una sola dirección IP solo puede realizar una determinada cantidad de solicitudes de API por día (10.000).
La API cortará mis solicitudes si realizo más de 30 solicitudes durante 5 segundos desde una sola dirección IP.

Está claro que todas las solicitudes deben ser aceleradas a 30 por 5 segundos y actualmente he implementado la lógica de aceleración de solicitud basada en un bloqueo distribuido con memcached. Estoy utilizando memcached como un simple administrador de bloqueos para coordinar la actividad de instancias de GAE y acelerar las solicitudes de UrlFetch.
Pero creo que es una gran falla limitar esta poderosa infraestructura para emitir no más de 30 solicitudes por 5 segundos. Tal tasa de solicitud de API no me permite continuar el desarrollo de nuevas características interesantes y útiles y un día dejará de funcionar correctamente.
Ahora mi aplicación tiene 90 usuarios y está creciendo y necesito encontrar una solución para maximizar la tasa de solicitud.

Como se sabe, App Engine realiza solicitudes de UrlFetch externas a través del mismo grupo de IP diferentes. Mi objetivo es escribir la funcionalidad aceleración de solicitud para garantizar el cumplimiento de los términos de uso api y utilizar las capacidades distribuidas de GAE.

Así que mi pregunta es cómo proporcionar el rendimiento máximo de la API práctica al tiempo que se cumplen los términos de uso de la API y se utilizan las capacidades distribuidas de GAE.

Aconsejar el uso de otra plataforma/host/proxy es inútil en mi mente.

+0

¿Entonces su extensión de Chrome está enviando solicitudes a su servidor y luego su servidor está enviando solicitudes para apilar API? ¿Sería posible llamar stack api directamente desde chrome? – serg

+0

@serg, sí, sería posible, pero esto significará que la extensión hará constantemente muchas solicitudes al punto final de la API para cada una de las cuentas de usuario. Multiplique esto por el número de cuentas de usuario. También requerirá permiso adicional para acceder a los puntos finales api desde la extensión. Pero sí, ahora estoy pensando en esta solución –

+0

Si permiten 10k solicitudes de una sola API, entonces creo que pueden manejarlo. – serg

Respuesta

2

En primer lugar: ¡estoy usando su extensión y se mece!

¿Consideró utilizar memcached y almacenar en caché los resultados?
En lugar de tomar los resultados directamente de la API, primero intente encontrarlos en la memoria caché si están en uso y si no lo están: recupérelos y almacénelos en caché y déjelos caducar después de X minutos.

En segundo lugar, intente completar las solicitudes de los usuarios, en lugar de preguntar a la reputación de un solo usuario preguntar la reputación de varios usuarios.

+0

gracias por usarlo. Sí, utilizo mucho memcached para almacenar en caché la respuesta de la API, pero incluso esto no puede ayudarme a reducir en gran medida el número de solicitudes de API. La idea de agrupar las solicitudes me parece útil, gracias. –

+1

@Vlasislav eso es algo gracioso, yo, shay y compiten por la misma cuota ya que todos nosotros tenemos una aplicación web ejecutándose en GAE. Descubierto ahora! 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-why-do-you-throttle-just-checking-the-ip – systempuntoout

4

Si está buscando una manera de administrar programáticamente el grupo compartido de direcciones IP de Google App Engine, creo firmemente que no tiene suerte.

De todos modos, citando a este consejo que forma parte de la faq, yo creo que hay más de una oportunidad para mantener en funcionamiento su aplicación impresionante :

¿Qué debo hacer si necesito más solicitudes por día?

Ciertos tipos de aplicaciones - servicios y sitios web para nombrar dos - legítimamente puede tener mucho más altos requisitos de solicitud por día que aplicaciones típicas. Si puede demostrar la necesidad de una mayor cuota de solicitud , contáctenos.

EDIT:
estaba equivocado, en realidad usted no tiene ninguna oportunidad.
Google App Engine [app] s son doomed.

+0

Gracias @systempuntoout, soy consciente de tal posibilidad. De alguna manera puedo solucionar 10.000 por límite de solicitud de IP pero, de hecho, la mayoría necesito solicitudes de "velocidad" extendidas, digamos 30 por segundo o más, pero de todos modos, dicen "por favor solo solicite una mayor cuota cuando su aplicación esté activa y no -número de usuarios ". No estoy seguro de que 100 y hasta 1000 sea una cantidad no trivial de usuarios. –

+0

Al conservar de manera programática el conjunto de direcciones IP de App Engine, también comencé a pensar que es imposible en ese momento. Probablemente llenaré un problema en el rastreador de problemas de GAE. –

+1

@Vladislav Como dijiste, debes mover tu lógica comercial al navegador (donde IP no es un problema) adoptando una biblioteca js madura como SOAPI.js, por ejemplo. – systempuntoout