2016-08-03 10 views
7

Występuje dziwne zachowanie w ITransaction.CommitAsync. Czasami połączenie z CommitAsync trwa 24 godziny.Co może spowodować, że rozmowy ITransaction.CommitAsync potrwają naprawdę długo (24h)?

W naszym scenariuszu odczytujemy dane liczników z urządzeń co 5 minut i przechowujemy punkty kontrolne w niezawodny słowniku. Tak więc co 5 minut uruchamiany jest następujący kod:

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(); 
} 

Mamy wiele zadań tła działających w usłudze stanowej. Każde zadanie w tle komunikuje się z jednym urządzeniem sprzętowym i uruchamia kod wspomniany powyżej. Wszystkie zadania używają tego samego niezawodnego słownika, ale tylko aktualizują klucz specyficzny dla urządzenia.

Niektóre zadania działają doskonale, a wywołanie CommitAsync szybko się zwraca. W przypadku innych zadań połączenie CommitAsync może nagle potrwać 24 godziny. Nie jest zgłaszany wyjątek, kod jest kontynuowany jak zwykle. Gdy to się stanie, wszystkie dodatkowe wywołania CommitAsync dotyczące tego zadania będą również trwały 24 godziny, chyba że ponownie uruchomimy usługę.

Klaster i wszystkie aplikacje są zgłaszane jako zdrowe w portalu. Jednak kiedy patrzę w Podglądzie zdarzeń na poszczególnych węzłach widzę następujące ostrzeżenie być zalogowany (około raz na 5 sekund):

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

Każdy pomysł co może być przyczyną tego?

+0

Minął rok, więc ta metoda powinna działać około 365 razy;) Czy kiedykolwiek doszedłeś do sedna tego? Czy chcesz coś udostępnić na podstawie tego, co znalazłeś? – ckittel

+0

Niestety, nie, opuściliśmy ten scenariusz i teraz przechowujemy te punkty kontrolne w pamięci Blob. Postaram się znaleźć czas na ponowne przetestowanie. –

Odpowiedz

0

Czy GetCheckpointKey komunikuje się z urządzeniem? Możliwe, że zabiera to wątek i blokuje, co oznacza wyczerpywanie się puli wątków.

Prawdopodobnie chwyta się słomek, ale brak czekania na GetCheckpointKey sprawia, że ​​jestem trochę podejrzany.

+0

Cała komunikacja z urządzeniem odbywa się w momencie uderzenia powyższego kodu. Funkcja GetCheckpointKey zawiera tylko ciąg. Wywołanie ciągu w celu połączenia dwóch ciągów znaków w celu uzyskania klucza słownika. Następne połączenie (SetAsync) nadal działa poprawnie i wykonuje się szybko. Połączenie CommitAsync zawiesza się. –

Powiązane problemy