H2o: Fehlende Verzögerung (sleep, Thread.sleep) in mruby?

Erstellt am 2. Mai 2017  ·  6Kommentare  ·  Quelle: h2o/h2o

Ich habe einen mruby-Handler geschrieben, der http_request verwendet, um meinen Cache in WordPress frisch zu halten.

Gibt es eine Möglichkeit, mit mruby für einige Sekunden in h2o zu schlafen (ich habe versucht, die benutzerdefinierte Thread-mruby-Erweiterung zu installieren, aber ich kann anscheinend kein Datum für die Antwort aus dem Thread abrufen)?

Der Fehler:
[lib/handler/fastcgi.c] in request:/index.php/tag/science:connection failed:failed to connect to host

Der Code:

if request_is_from_self and links_file_exist and req_is_get
    links = `php #{links_filepath}`

    for link in links.split(' ') do
        req = http_request(link)
        _, _, _ = req.join
    end
end
enhancement mruby

Alle 6 Kommentare

Hallo @taosx
Ich bezweifle etwas, dass es wirklich PHP ist, das nicht mithalten kann.
Senden Sie http-Anfragen an die eigene Instanz von h2o, die dann fastcgi ausführt?

Ich bin mir nicht sicher, ob Sie dies absichtlich getan haben, um Pausen zu emulieren, aber von dem, was ich gelesen habe, werden Sie nacheinander für jede Anfrage beitreten. Die Idee wäre, dass die Anfragen parallel gehen, sodass Sie erst mit dem Beitritt beginnen, nachdem alle Anfragen abgefeuert wurden.

kannst du sowas versuchen

links.split(' ').map{|l| http_request }.to_a.map{|r| r.join}

und eine genauere Fehlerbeschreibung posten?

Auch wenn es immer die gleichen wenigen Links sind und diese mehr oder weniger statisch sind, könnte man schnell einen billigen Speicher-Cache implementieren.

Ich glaube, Ihr Code liefert kein Argument für http_request, ich habe es wie folgt geändert:
links.split(' ').map{|l| http_request(l) }.map{|r| r.join}
aber es scheint immer noch schlechter zu funktionieren als der Code, den ich oben gepostet habe.
Ich habe die Lösung gelöst, indem ich Opcache für PHP installiert und aktiviert habe, und jetzt ist die Zeit, die für alle Anfragen benötigt wird, von 27 Sekunden auf 3,1 Sekunden ohne Fehler gesunken. Durch die Verwendung Ihres Codes wird es 4 Sekunden dauern.

Nachdem ich einige weitere Tests durchgeführt habe, möchte ich den gesamten Code für meine WordPress-Site mit h2o als Open Source öffnen, das alle 2 Minuten Seiten zwischenspeichert, mit gzip und brottli bei maximalen Einstellungen vorkomprimiert und aus dem Cache bereitgestellt wird. Liebe h2o bis jetzt, danke allen Mitwirkenden an h2o!!

In Zukunft würde ich gerne mehr Skriptfunktionen für h2o sehen, wie Openresty, aber basierend auf h2o :D

@taosx ah tut mir leid. Ich habe den entscheidenden Teil vergessen: .to_a

links.split(' ').map{|l| http_request }.to_a.map{|r| r.join}

nur aus neugier, kannst du das nochmal versuchen. und wie viele Anfragen stellen Sie / wie groß ist das Links-Array?

@yannick Ich habe es noch einmal versucht, ich musste http_request ändern, um das Argument (l) anzugeben.
Die Geschwindigkeit sank auf 3,06 Sekunden :D und manchmal 2,9+, wenn der Cache erwärmt wurde.
Das Links-Array hat 41 Elemente (aws ec2 t2.micro).

Jedes Mal, wenn ich einen weiteren Beitrag hinzufüge, erhalte ich 1 Link vom Beitrag selbst + ~ 5 Links von hinzugefügten Tags ...
Ich glaube, ich habe in naher Zukunft ein kleines Problem. Ich denke, ich werde mruby vorerst fallen lassen und in Zukunft einen anderen Ansatz verfolgen.

Glaubst du, ich könnte h2o mit mruby als Reverse-Proxy-Cache für wp verwenden, ich glaube, es ist möglich.

es scheint, dass Sie über Links = php #{links_filepath} an PHP senden. das ist wahrscheinlich sehr langsam, hast du das mal entfernt?
für nur h2o sollte die t2.micro in Ordnung sein, aber wenn Sie auch das PHP-Zeug auf dieser Maschine ausführen, konkurrieren sie um die einzelne CPU und die Leistung sinkt weiter. Also zumindest zum Testen würde ich so etwas wie c4.large oder c4.xlarge nehmen.

ja Caching über mruby sollte möglich sein, entweder man macht es im Arbeitsspeicher oder man verwendet Redis (was aktuell noch einen Patch braucht aber bald zusammengeführt werden soll, siehe https://github.com/h2o/h2o/pull/1152 )

Das ist eine interessante Diskussion!

Abgesehen davon, wie das Problem gelöst werden sollte (zB durch Implementierung eines Caches mit mruby), gibt es meiner Meinung nach keinen Grund, warum wir in unserem mruby-Handler nicht eine Sleep-Funktion bereitstellen sollten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ndac-todoroki picture ndac-todoroki  ·  5Kommentare

fetus-hina picture fetus-hina  ·  4Kommentare

daniel-lucio picture daniel-lucio  ·  5Kommentare

Jxck picture Jxck  ·  7Kommentare

voiddeveloper picture voiddeveloper  ·  6Kommentare