2016-04-29 7 views
3

Ich möchte eine Rate-Limiting-App mit Ruby testen, wo ich verschiedene Verhalten auf der Grundlage der Anzahl der Anfragen pro Sekunde definieren.Wie verwende ich Ruby, um eine bestimmte Anzahl von Aktionen pro Sekunde auszuführen?

Zum Beispiel, wenn ich 300 Anfragen pro Sekunde oder mehr sehe, möchte ich, dass es mit einem Block antwortet.

Aber wie würde ich das testen, indem ich 300 Anfragen pro Sekunde in Ruby erzeuge? Ich verstehe, dass es harte Beschränkungen gibt, die auf der CPU basieren, aber wenn ich die Zahl weit unter dieser Begrenzung belassen würde, wie würde ich immer noch etwas senden, das beide den Schwellenwert überschreitet und unter diesem bleibt?

Nur Schleifen N-mal garantiert mir nicht den Durchsatz.

+0

Dies ist keine wirkliche Antwort auf Ihre Frage, aber das Ratelimit Juwel, https://github.com/ejfinneran/ratelimit oder drossel Warteschlange , https://github.com/ryancalhoun/throttle-queue, wird eine Inspiration sein. Im Grunde zählen sie die Anzahl der Anfragen innerhalb einer bestimmten Zeitspanne und verhalten sich anders, wenn Sie die festgelegten Grenzwerte überschreiten. –

+0

Wir würden gerne Ihre Bemühungen sehen, um dies zu lösen. Ohne das sieht es so aus, als würden Sie uns bitten, ein Tutorial zu schreiben, ohne Ihr Fachwissen oder den dafür notwendigen Code zu kennen, die beide nicht zum Thema gehören. Bitte lesen Sie "[fragen]" und "[mcve]". –

+0

Verstanden - Ich konnte keinen Ort finden, an dem ich anfangen konnte, außer einer Schleife, die nur die Anzahl der Ereignisse gezählt hat. Ich denke, diese Antworten geben mir einen Rahmen, um darüber weiter nachzudenken. – Angela

Antwort

3

Der schnelle und schmutzige Weg besteht darin, 300 Threads hochzufahren, die jeweils eine Anfrage pro Sekunde ausführen. Der elegantere Weg besteht darin, so etwas wie Eventmachine zu verwenden, um Anforderungen mit der erforderlichen Rate zu erstellen. Mit der richtigen nicht blockierenden HTTP-Bibliothek kann diese Aktivitätsebene leicht erzeugt werden.

Sie könnten auch diese Werkzeuge versuchen:

  • ab das Apache-Benchmarking-Tool, gemeinsam viele Systeme. Es ist sehr gut, dein System zu missbrauchen.
  • Seige für Belastungstest.
+0

Die Verwendung der bereits vorhandenen Werkzeuge wäre besser als der Versuch, dieses spezielle Rad neu zu erfinden. –

+0

@theTinMan Deshalb schlage ich 'ab' als sicheren Standard vor. Der einzige Grund, warum Sie Ihre eigenen schreiben, ist entweder eine akademische Übung oder weil Sie etwas tun, das erfordert, dass jede Anfrage prozedural erzeugt wird. – tadman

+0

ja das ist hilfreich, um es zu betrachten - ich möchte nicht mein eigenes Werkzeug schreiben, meine ursprüngliche Anstrengung war es, nur eine "Schleife" zu verwenden, die die Rate pro Sekunde nicht ansprach. Da es so weit weg war, gab es keinen Code, den ich vorstellen konnte. – Angela

0

Wie über eine minimale Homebrew Lösung:

OPS_PER_SECOND = 300 
count = 0 
duration = 10 
start = Time.now 

while true 
    elapsed = Time.now - start 
    break if elapsed >= duration 
    delay = (count - (elapsed/OPS_PER_SECOND))/OPS_PER_SECOND 
    sleep(delay) if delay > 0 
    do_request 
    count += 1 
end 
+0

Dies ist möglicherweise nicht in der Lage zu produzieren 300 Anfragen pro Sekunde jeder Anfrage dauert mehr als 3,33ms abgeschlossen. Angesichts der Tatsache, wie langsam HTTP sein kann, ist das wahrscheinlich der Fall. Beachten Sie, dass Ihr Verzögerungscode hier für eine bestimmte Zeit ruht und nicht, wie viel Zeit noch von der letzten Iteration übrig ist. – tadman

+0

@tadman Über ein Netzwerk, sicher. Wenn der Server lokal ist, hängt es davon ab, wie schnell er ist. Wenn Sie nicht den gewünschten Durchsatz erzielen, führen Sie so viele Instanzen aus wie der Server über Threads/Prozesse verfügt. Passen Sie 'OPS_PER_SECOND' wie gewünscht an. –

+0

Auch wenn Sie mit etwas Magie eine HTTP-Anfrage in 3 ms lokal durchführen können, benötigt Ihr Drosselungscode nicht die Zeit, die für die Ausführung der Anfrage benötigt wird.Was dies tut ist Drosselung auf ein * Maximum * von 300 Operationen pro Sekunde, nicht genau so viele, und wird wahrscheinlich viel niedriger sein, wenn die Operationen nicht-triviale Zeit nehmen. – tadman

Verwandte Themen