2016-08-03 32 views
7

Wir haben seltsames Verhalten bei ITransaction.CommitAsync. Manchmal dauert der Aufruf von CommitAsync 24 Stunden.Was kann dazu führen, dass ITransaction.CommitAsync-Aufrufe sehr lange dauern (24h)?

In unserem Szenario lesen wir Zählerdaten von Hardware-Geräten alle 5 Minuten und speichern Prüfpunkte in einem zuverlässigen Wörterbuch. Also alle 5 Minuten oder so, wird der folgende Code ausgeführt:

var profileCheckpoints = await StateManager.GetOrAddAsync<IReliableDictionary<string, DateTime>>(StateNameProfileCheckpoints); 

using (var tx = StateManager.CreateTransaction()) 
{ 
    // Dictionary key is a device guid + device register id, 
    // e.g.: 13cdaad8-9b8b-4fba-b336-e72e06c047ab-1.0.99.1.0.255 
    var key = GetCheckpointKey(context); 

    // checkpoint is a DateTime 
    await profileCheckpoints.SetAsync(tx, key, checkpoint); 

    // this call will sometimes take 24h to complete 
    await tx.CommitAsync(); 
} 

Wir haben mehrere Hintergrundaufgaben bekommen in einem Stateful-Dienst ausgeführt wird. Jede Hintergrundaufgabe kommuniziert mit einem einzelnen Hardwaregerät und führt den oben genannten Code aus. Alle Aufgaben verwenden dasselbe zuverlässige Wörterbuch, aktualisieren jedoch nur den für das Gerät spezifischen Schlüssel.

Einige Aufgaben laufen einwandfrei und der CommitAsync-Aufruf wird schnell ausgeführt. Bei anderen Aufgaben kann der CommitAsync-Aufruf plötzlich 24 Stunden dauern. Es wird keine Ausnahme ausgelöst, der Code wird wie gewohnt fortgesetzt. Sobald dies geschieht, werden alle zusätzlichen CommitAsync-Aufrufe für diese Aufgabe 24 Stunden dauern, bis wir den Dienst neu starten.

Der Cluster und alle Anwendungen werden im Portal als fehlerfrei gemeldet. Allerdings, wenn ich in der Ereignisanzeige auf den verschiedenen Knoten aussehen sehe ich die folgende Warnung protokolliert werden (etwa einmal alle 5 Sekunden):

dropping message <some guid>, Actor = Transport, Action = ‘’, fault = FABRIC_E_CONNECTION_CLOSED_BY_REMOTE_END 

Jede Idee, was die Ursache dafür sein könnte?

+0

Es ist etwa ein Jahr her, also sollte diese Methode etwa 365 mal gelaufen sein;) Ist dir das jemals auf den Grund gegangen? Alles, was Sie teilen können, basierend auf dem, was Sie gefunden haben? – ckittel

+0

Leider haben wir dieses Szenario nicht aufgegeben und speichern diese Checkpoints jetzt im Blob-Speicher. Ich werde versuchen, etwas Zeit für einen erneuten Test zu finden. –

Antwort

0

Ist GetCheckpointKey mit einem Gerät kommunizieren? Könnte es sein, dass dies einen Thread und Blockierung aufgreift, was bedeutet, dass der Thread-Pool erschöpft wird.

Möglicherweise umklammert bei Strohhalmen, aber das Fehlen von warten auf GetCheckpointKey macht mich etwas misstrauisch.

+0

Die gesamte Kommunikation mit dem Gerät erfolgt an dem Punkt, an dem der obige Code getroffen wird. GetCheckpointKey enthält nur einen string.Format-Aufruf zum Verketten von zwei Strings zum Abrufen des Wörterbuchschlüssels. Der nächste Aufruf (SetAsync) wird weiterhin ausgeführt und wird schnell abgeschlossen. Der CommitAsync-Aufruf hängt dann. –