2016-04-27 8 views
0

Ich habe eine Bedingung, wo ich die Anzahl der Anfragen auf meinem HTTP-Server gezählt werden muss, aggregiert nach Stunde und Anfragetyp. Zum Beispiel - Dies ist die Art von Ausgangsdaten, die ich, wenn ich 3 einzigartige Ressource Wie wird die Anzahl der Anfragen auf einem Server an einem Tag gespeichert?

Resource /a - 10 req between 10pm - 11pm, 13 req between 11pm - 12am 
Resource /b - 14 req between 10pm - 11pm, 17 req between 11pm - 12am 
Resource /c - 12 req between 10pm - 110m, 16 req between 11pm - 12am 

habe erhalten will

Es besteht keine Notwendigkeit für die Echtzeit-Berichterstattung verlangt. Es kann eine Verzögerung von ein paar Stunden vertragen. Ich weiß, dass ich das durch Log-Parsing erreichen kann. Aber ich wollte nur wissen, ob es eine bessere Möglichkeit gibt, diese Art von Daten zu speichern. Lassen Sie uns einen Echtzeit-Zähler in Redis sagen, wo der Schlüssel mit url + hour gemacht wird und es periodisch abspeichern lässt sagen wir alle 2 Stunden zu einer anderen DB.

Antwort

1

Log Parsing oder ein Analysesystem wie Google Analytics (gehostet) oder Piwik (selbst gehostet) sind Ihre besten Optionen. Versuchen Sie nicht, Ansichten in Ihrem Code zu verfolgen, denn wenn Sie davor einen Cache für ganze Seiten einfügen, wird Ihr Code nicht jedes Mal ausgeführt, um die Treffer zu verfolgen.

+0

Betrachten Sie keine Seite. Betrachten Sie eine einzelne HTTP-API-Anfrage. Schließt das Analytics oder Piwik nicht aus?Ja, die Anfrage kann auf einer separaten Ebene zwischengespeichert werden. In diesem Fall würde nichts auf dem Server erscheinen. Das würde einen völlig anderen Mechanismus erfordern, um diese zwischengespeicherten Anforderungen zu zählen –

1

Eine Möglichkeit, es in redis zu speichern verwendet hash: -

Hash-Schlüssel als Datum-Zeit-Probe

Hashkey: - "2016-04-27-10-11"

"2016-04-27-10-11" :{ 

    "md5-request-uri-1" : "count of request", 
    "md5-request-uri-2" : "count of request" 

} 

Redis Funktionen, die Sie sind verwenden: - Hash incr von (HINCRBY)

HINCRBY 2016-04-27-10-11 md5-request-uri-1 1 

http://redis.io/commands/HINCRBY

Jetzt können Sie einen stündlichen Cron haben, der die Logs für die letzte Stunde analysieren wird und sie in redis im oben genannten Format speichert.

Um alle Ressourcen mit Count Sie verwenden können: - HGETALL Um mit der Zählung einer bestimmten Ressource erhalten Sie verwenden können: - hget

http://redis.io/commands/hget

0

Ich nehme an, Sie haben Servlets in der Anwendung, in einem High-Level-Filter wenden Sie eine Logik wie diese

hincrby (Datum + Aktion, Stunde, 1);

date -> current date 
hour -> current hour 
action -> the action you want to save 

wenn Sie Aktion eine der für die Gesamtzahl Datum wollen, tun hgetall Datum + Aktion für bestimmte Stunde Rahmen Sie, dass allein aus der in der Anwendungslogik wählen können. Tun Sie die Summe und das ist Ihr Ergebnis.

Auf diese Weise wird nur ein Treffer pro Anfrage passieren. Das dauert 1ms für Redis. Wir verwenden Redis für Echtzeitanalysen auf diese Weise.

0

Ich bin ein Redis Fan, aber ich würde Redis nicht für so etwas verwenden. Ich würde stattdessen eine Message Queue verwenden, wie RabbitMQ oder besser Kafka. Werfen Sie Ihre Anfrage einfach dort hin und lassen Sie sie von einem anderen Prozess abholen und bearbeiten.

Es gibt keinen Grund für das Hinzufügen von Latenzzeit (selbst 1 ms) zu der Anforderung, die zur Berechnung von Leistungsindikatoren oder zur Durchführung von Aktionen, die eine Antwort erfordern, dient.