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?
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
Niestety, nie, opuściliśmy ten scenariusz i teraz przechowujemy te punkty kontrolne w pamięci Blob. Postaram się znaleźć czas na ponowne przetestowanie. –