2009-11-28 6 views
7

Ich arbeite an einer Klassenbibliothek, die Informationen von einer Website eines Drittanbieters abruft. Die Website, auf die zugegriffen wird, reagiert nicht mehr, wenn innerhalb eines festgelegten Zeitraums (~ 0,5 Sekunden) zu viele Anfragen gestellt werden.Wessen Verantwortung ist es, Web-Anfragen zu drosseln?

Die öffentlichen Methoden meiner Bibliothek beziehen sich direkt auf eine Ressource eine Datei auf dem Webserver. Mit anderen Worten, jedes Mal, wenn eine Methode aufgerufen wird, wird eine HttpWebRequest erstellt und an den Server gesendet. Wenn alles gut geht, wird eine XML-Datei an den Aufrufer zurückgegeben. Wenn dies jedoch die zweite Webanforderung in weniger als 0,5 Sekunden ist, wird die Anforderung Timeout.

Mein Dilemma liegt darin, wie ich Anfrage Throttling behandeln sollte (wenn überhaupt). Natürlich möchte ich nicht, dass der Anrufer herumsitzt und auf eine Antwort wartet - vor allem, wenn ich absolut sicher bin, dass die Anfrage eine Zeitüberschreitung hat.

Wäre es sinnvoller, wenn meine Bibliothek die Webanforderungen, die ich erstelle, in Warteschlangen stellt und drosselt, oder sollte meine Bibliothek einfach eine Ausnahme auslösen, wenn der Client nicht lange genug zwischen API-Aufrufen wartet?

+0

Justin. Ist die Website, auf die Sie zugreifen, Ihre oder eine dritte Partei? Meine "Good Citizen" -Kommentare beruhten darauf, dass es sich um eine dritte Partei handelte, aber andere scheinen ihre Website angenommen zu haben. – Andiih

+0

Die Website ist in der Tat eine Website von Drittanbietern. Danke, dass du darauf hingewiesen hast, dass ich das nicht angegeben habe. Ich habe meine Frage zur Klärung aktualisiert. –

Antwort

6

Das Konzept einer Bibliothek ist es, seinen Client-Code so wenig wie möglich zu kümmern. Daher würde ich es dem Bibliotheksjob ermöglichen, Anfragen zeitnah einzureichen und Ergebnisse zurückzugeben. In einer idealen Welt würden Sie ein Rückruf- oder Delegiertenmodell verwenden, damit der Clientcode asynchron arbeiten und die Benutzeroberfläche nicht blockieren kann. Sie können auch die Option zum Überspringen der Warteschlange anbieten (und fehlschlagen, wenn sie zu früh ausgeführt wird) und möglicherweise sogar Prioritäten innerhalb des Warteschlangenmodells anbieten.

Ich glaube auch, dass es in der Verantwortung des Bibliotheksautors liegt, ein guter Bürger zu sein, und dass die Standardoperation der Bibliothek den Bedingungen des Datenanbieters entspricht.

+0

+1 für den Teil "guter Bürger". Ich habe fast vergessen, dieses Problem aus der Sicht des Datenanbieters zu sehen. Aber wie würde ich dann garantieren, dass die Ergebnisse rechtzeitig geliefert werden, ohne dass die Anzahl der Anfragen, die in die Warteschlange eingereiht werden könnten, begrenzt wird? –

+1

Ich glaube nicht, dass Sie garantieren müssen, solange Sie Methoden bereitstellen, um die Größe der Warteschlange abzufragen, und vielleicht auch eine Zeitüberschreitung durch die Bibliothek implementiert haben. – Andiih

+0

Aber wäre es nicht reiner, es einfach geschehen zu lassen, die Bitte abzulehnen, aber einfach zu wissen, dass sie es zu schnell machen? Außerdem könnte eines Tages die tatsächliche Implementierung der Site das Limit erhöhen, und könnte die Bibliothek auch eher als Messenger als als Diktator erscheinen lassen. – BigOmega

2

Das ist die Verantwortung des Webservers, imo. Da die kritische Last von der Hardware, der Netzwerkbandbreite usw. abhängt, die sich außerhalb der Kontrolle Ihrer Anwendung befinden, sollte sie sich nicht damit befassen, den Deal damit zu versuchen. IIS kann den Datenverkehr basierend auf verschiedenen Konfigurationsoptionen drosseln.

+1

Sicher, wenn Ihre Bibliothek auf einen Web-Service zugreifen soll, der nur eine Antwort pro 0.5s akzeptiert, und das ist eine Bedingung seiner Verwendung, dann sollten Sie sich damit beschäftigen? – Andiih

+0

Wenn es einen geschäftlichen Grund dafür gibt, warum Sie nur 2 Anfragen pro Sekunde zulassen (vielleicht, weil Daten nicht häufiger aktualisiert werden und der Client nichts Neues sieht?), Würde ich diese Einschränkung nicht in dem von Ihnen gewünschten Sinne nennen die Last zu begrenzen, und das ist absolut etwas, das die Anwendung erzwingen könnte. – cdonner

+0

Die Website, auf die zugegriffen wird, ist eine Website eines Drittanbieters. Daher liegen die IIS-Einstellungen leider nicht in meiner Kontrolle. –

3

Ich würde beides sagen - Sie haben es mit zwei unabhängigen Systemen zu tun und beide sollten Maßnahmen ergreifen, um sich vor übermäßiger Belastung zu schützen. Der Web-Server sollte eingehende Verbindungen ablehnen, und die Client-Bibliothek sollte Maßnahmen ergreifen, um die Anforderungen zu reduzieren, die sie an einen langsamen oder nicht reagierenden externen Dienst stellt. Ein übliches Muster, um dies auf dem Client zu handhaben, ist ein "Leistungsschalter", der Anrufe zu einem externen Dienst umschließt und für eine bestimmte Zeit nach einem Fehler schnell ausfällt.

+0

Es wäre nett, wenn die Anfrage abgelehnt würde, anstatt einfach ignoriert zu werden. Danke, dass Sie mich auf das Schutzschaltermuster hingewiesen haben. Ich kann sicherlich Zeiten sehen, in denen es nützlich werden würde. –

1

Was für ein Client ist das? Ist dies ein interaktiver Client, zB für eine GUI-basierte App?

In diesem Fall können Sie dies einem Webbrowser-Szenario gleichsetzen und die Zeitüberschreitung für den Aufrufer freigeben. Wenn Sie sicher sind, dass dieser Webserver Anforderungen drosselt, können Sie dem Client mitteilen, dass er einen bestimmten Zeitraum warten muss, bevor er es erneut versucht. Auf diese Weise wird der Client nicht wiederholt Anfragen erneut ausgeben und weiß, wenn die erste Zeitüberschreitung auftritt, dass es nicht sinnvoll ist, Anforderungen zu schnell auszugeben.

+0

Der Client ist eine Klassenbibliothek, die von einer GUI-Anwendung verwendet werden kann. Die Verwendung von Ausnahmen, um den Aufrufer darüber zu informieren, dass meine Methode häufig aufgerufen wird, ist eine Lösung, die ich in Betracht ziehe. Aber ich weiß, dass häufige Anrufe eine Auszeit verursachen, also ist es wirklich ein außergewöhnlicher Umstand? –

+0

Sie erwähnten, dass der Server Anforderungen drosselt, wenn "zu viele Anfragen" mit einer bestimmten Zeit (0,5 s) gesendet werden. Wie viel kostet "zu viele Anfragen"? Wenn Sie darüber nachdenken, wenn 0.5s das Limit ist, dann kann es für den GUI-basierten Client wirklich schwierig sein, dies zu überschreiten. Alternativ können Sie Ihre GUI-Bibliothek so strukturieren, dass nicht mehr als 'N' asynchrone Anforderungen vorhanden sind, sodass Sie den Server nie hämmern. Ich würde N = 2 begrenzen (und es für Ihre Benutzer konfigurierbar machen). Und einen Mechanismus verwenden, der einen Delegaten verwendet, um Client-Fortschrittsbenachrichtigungen zu geben. – feroze