2009-11-28 7 views
7

Estoy trabajando en una biblioteca de clases que recupera información de un sitio web de terceros. El sitio web al que se accede dejará de responder si se realizan demasiadas solicitudes dentro de un período de tiempo establecido (~ 0,5 segundos).¿De quién es la responsabilidad de restringir las solicitudes web?

Los métodos públicos de mi biblioteca se relacionan directamente con un recurso y un archivo en el servidor web. En otras palabras, cada vez que se llama a un método, se crea un HttpWebRequest y se envía al servidor. Si todo va bien, se devuelve un archivo XML a la persona que llama. Sin embargo, si esta es la segunda solicitud web en menos de 0.5 s, la solicitud será expirada.

Mi dilema radica en cómo debo manejar la aceleración de solicitudes (si es que lo hago). Obviamente, no quiero que la persona que llama se quede esperando una respuesta, especialmente si estoy completamente seguro de que su solicitud expirará.

tendría más sentido para mi biblioteca para hacer cola y estrangular los webrequests he creado, o si mi biblioteca simplemente lanzar una excepción si el cliente no espera el tiempo suficiente entre las llamadas a la API?

+0

Justin. Es el sitio web al que está accediendo el suyo o un tercero. Mis comentarios de "Buen Ciudadano" se basaron en que es un tercero, pero otros parecen haber asumido que es su sitio. – Andiih

+0

El sitio es de hecho un sitio de terceros. Gracias por señalar que no había especificado eso. He actualizado mi pregunta para aclarar. –

Respuesta

6

El concepto de una biblioteca es dar a su código de cliente tan poco que preocuparse como sea posible. Por lo tanto, convertiría en el trabajo de las bibliotecas hacer cola en las solicitudes y devolver los resultados de manera oportuna. En un mundo ideal, utilizaría un modelo de devolución de llamada o delegado para que el código del cliente pueda operar de forma asíncrona, sin bloquear la interfaz de usuario. También podría ofrecer la opción de omitir la cola (y fallar si opera demasiado pronto) y posiblemente incluso ofrecer prioridades dentro del modelo de cola.

También creo que es responsabilidad del autor de la biblioteca ser un buen ciudadano y que la operación predeterminada de la biblioteca debe cumplir con las condiciones del proveedor de datos.

+0

+1 para la parte "buen ciudadano". Casi me olvido de ver este problema desde la perspectiva del proveedor de datos. Pero, entonces, ¿cómo puedo garantizar que los resultados se proporcionarán de manera oportuna, sin poner un límite de algún tipo sobre el número de solicitudes que podrían estar en cola? –

+1

No creo que deba garantizar, siempre que proporcione métodos para consultar el tamaño de la cola, y quizás también tenga un tiempo de espera implementado por la biblioteca. – Andiih

+0

Pero, al mismo tiempo, ¿no sería más puro simplemente dejar que suceda, denegar la solicitud, pero simplemente dejarles saber que lo están haciendo demasiado rápido? Además, un día la implementación real del sitio podría elevar el límite más alto, también podría dejar que la biblioteca sea un mensajero en lugar de un dictador. – BigOmega

2

Esa es la responsabilidad del servidor web, imo. Debido a que la carga crítica depende del hardware, el ancho de banda de la red, etc. un montón de cosas que están fuera del control de su aplicación, no debería preocuparse por tratar el problema. IIS puede acelerar el tráfico según diversas opciones de configuración.

+1

Seguramente si su biblioteca tiene acceso a un servicio web que solo aceptará una respuesta por cada 0.5s, y esa es una condición para su uso, entonces es algo que debería preocuparle. – Andiih

+0

Si hay algún motivo comercial por el que solo permite 2 solicitudes por segundo (¿tal vez porque los datos no se actualizan con más frecuencia y el cliente no verá nada nuevo?), Entonces no llamaría a esa regulación en el sentido de que desea para limitar la carga, y eso es absolutamente algo que la aplicación podría hacer cumplir. – cdonner

+0

El sitio web al que se accede es un sitio de terceros, por lo que desafortunadamente la configuración de IIS está fuera de mi control. –

3

Yo diría que ambas cosas: se trata de dos sistemas independientes y ambos deben tomar medidas para defenderse de la carga excesiva. El servidor web debe rechazar las conexiones entrantes y la biblioteca del cliente debe tomar medidas para reducir las solicitudes que realiza a un servicio externo lento o que no responde. Un patrón común para tratar esto en el cliente es el "interruptor de circuito" que envuelve las llamadas a un servicio externo y falla rápidamente durante un cierto período después de la falla.

+0

Sería bueno si la solicitud fue rechazada, en lugar de simplemente ignorada. Gracias por indicarme el patrón de interruptor automático. Ciertamente puedo ver momentos cuando sería útil. –

1

¿Qué tipo de cliente es? ¿Es este un cliente interactivo, por ejemplo, para una aplicación basada en GUI?

En ese caso, puede equiparar eso a un escenario webbrowser y dejar que el tiempo de espera emerja a la persona que llama. Además, si está seguro de que este servidor web está limitando las solicitudes, puede decirle al cliente que debe esperar durante un período de tiempo determinado antes de volver a intentarlo. De esa forma, el cliente no continuará re-emitiendo solicitudes, y sabrá cuándo se produce el primer tiempo de espera que es inútil emitir solicitudes demasiado rápido.

+0

El cliente es una biblioteca de clases, que podría ser utilizada por una aplicación GUI. Usar excepciones para informar a la persona que llama que mi método es llamado frecuentemente es una solución que estoy considerando. Pero sé que las llamadas frecuentes causarán un tiempo de espera, ¿es realmente una circunstancia excepcional? –

+0

Mencionó que el servidor acelera las solicitudes si se envían "demasiadas solicitudes" en un tiempo determinado (0.5s). ¿Cuánto es "demasiadas solicitudes"? Si lo piensa, si 0.5s es el límite, entonces puede ser realmente difícil para el cliente basado en GUI exceder esto. Alternativamente, puede diseñar su biblioteca GUI para que no tenga pendientes más de 'N' solicitudes asíncronas, de modo que nunca martillee el servidor. Limitaría N = 2 (y lo haría configurable para sus usuarios). Y tenga un mecanismo que use un delegado para dar notificaciones de progreso al cliente. – feroze

Cuestiones relacionadas