2016-09-13 3 views
0

Ich habe einen Agenten Arbeitsagenten, die alle 60 Sekunden überprüft Verarbeitungstabellen für neue Arbeit, jeweils 60 Sekunden, wenn neue Arbeit verfügbar ist. Während der Verarbeitung verwendet der Agent eine statische TraceHelper-Klasse für die Protokollierung. Zum Zeitpunkt des Schreibens in die Protokolldatei sende ich auch eine WebRequest an eine externe API, um den Protokolleintrag an eine Logstash zu senden.Wartet auf den gleichen HttpRequestMethod warten auf den bestehenden zu beenden

Die Webrequest sendet im Wesentlichen ein JSON-Objekt für jede Writeline. offensichtlich für die Protokollierung, Reihenfolge ist wichtig, so ist meine Frage, obwohl ich nur ein POST HttpWebRequest aufrufen dies passiert Hunderte von Mal pro Minute. Sollte ich mir Sorgen um Synchronisierungsprobleme machen? Könnte es ein Potenzial geben, dass die zweiten Writeline-Anfragen von der HttpWebRequest aufgerufen und verarbeitet werden, bevor die erste Writeline eine Chance zum Senden hat? Oder schaue ich falsch?

Hinweis: unten ist halbPseudoCode

sagen, ich habe die unten

Tracehelper.Writeline("foo") 
Tracehelper.Writeline("baa"); 


static Tracehelper(){} 


public static void Writeline(string msg) 
{ 
    File.WriteToFile(msg); 
    WebProcessHelper.SendLog(msg); 
} 



static WebProcessHelper() {} 

public static void SendLog(string msg) 
{ 
    SendHttpRequest(msg); 
} 

Gibt es eine Möglichkeit, dass „baa“ wird vor „foo“ geschickt?

Antwort

-1

Es kann davon ausgegangen werden, dass dies möglich ist, insbesondere wenn Sie mehrere Threads gleichzeitig ausführen. Eine sichere Option wäre, einen separaten Thread mit einem BlockingCollection oder etwas, das einfach Strings aus dem BlockingCollection zieht und sendet sie an logstash.

So könnte man es so haben, dass jeder etwas in die BlockingCollection schreiben kann, und sie werden alle in der richtigen Reihenfolge an den Remote-Server gesendet.

+0

Threading wurde nicht erwähnt, nur Async, das nicht das gleiche ist. Und das Protokollieren sollte immer zusammengelegt werden, besonders wenn Sie remote protokollieren. – Tim

0

Ich weiß nicht, welche Klassen Sie tatsächlich für die Web-Anfrage verwenden, aber ich nehme an, es ist die Standard-asynchronen und beantworten Sie darauf basierend.Wenn Sie etwas anderes verwenden, kann die Antwort variieren.

Ja und nein. Die Anfragen werden alle vom Kunden in der Reihenfolge ausgelöst. Wenn Sie dies jedoch hunderte Male pro Sekunde tun, haben Sie möglicherweise die vom Server am anderen Ende akzeptierten Nachrichten nicht in der gleichen Reihenfolge, da sie die Verarbeitungskapazität des Servers stapeln und überschreiten können. Es hängt vollständig von der Anzahl der Verbindungen und der verwendeten Serversoftware ab.

All das gesagt, Hunderte von HTTP-Aufrufe eine Sekunde zu machen, ist eine schreckliche Idee. Wenn Sie sich anmelden müssen, verwenden Sie ein Protokollierungsframework, mit dem Sie die Protokollierung jede Sekunde in einer Anfrage zwischenspeichern und aufstapeln können. Dies spart erheblich Bandbreite, erhöht die Skalierbarkeit und entlastet die CPU des Servers, auf dem Sie sich anmelden.

Ich kann herzlichst entweder nlog oder Semantic Application Logging Block von MS empfehlen. Haben beide benutzt, und sie sind beide sehr flexibel und handhaben Last gut.

+0

Danke für Ihre Antwort. Ich denke, ich hatte nicht viel Platz oder Lust, das ganze Projekt aufzustellen. Die Methode, die schließlich die WebRequest sendet, lädt sie vor dem Senden auf. etwa 100 Chargen pro Zyklus. Ich denke, der Punkt, den ich machen wollte, ist, selbst wenn ich es aufstapelte. Ich wollte über die Reihenfolge wissen, in der die Anfrage sie schicken würde, in der ich jetzt die Antwort habe. Ich werde jetzt in das asynchrone webreqeust-Framework in .net 4.5 schauen – Dritzz

Verwandte Themen