Мы сталкиваемся с каким-то странным поведением с ITransaction.CommitAsync. Иногда вызов CommitAsync занимает 24 часа.Что может вызвать вызовы ITransaction.CommitAsync, чтобы они занимали очень много времени (24 часа)?
В нашем сценарии мы считываем данные измерений с аппаратных устройств каждые 5 минут и сохраняем контрольные точки в надежном словаре. Так что каждые 5 минут или около того, следующий код запускается:
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();
}
У нас есть несколько задач, запущенных в фоновом с состоянием службы. Каждая фоновая задача связывается с одним аппаратным устройством и запускает код, упомянутый выше. Все задачи используют один и тот же надежный словарь, но только обновляют ключ, специфичный для устройства.
Некоторые задачи выполняются отлично, а вызов CommitAsync быстро возвращается. Для других задач вызов CommitAsync может занять 24 часа. Никакое исключение не выбрасывается, код продолжается, как обычно. Как только это произойдет, все дополнительные вызовы CommitAsync для этой задачи также займут 24 часа, если мы не перезапустим службу.
Кластер и все приложения сообщаются как полезные на портале. Однако, когда я смотрю в окне просмотра событий на разных узлах я вижу следующее предупреждение быть авторизованы (примерно раз в 5 секунд):
dropping message <some guid>, Actor = Transport, Action = ‘’, fault = FABRIC_E_CONNECTION_CLOSED_BY_REMOTE_END
Любая идея, что может быть причиной этого?
Прошло около года, поэтому этот метод должен был работать примерно 365 раз;) Вы когда-нибудь дошли до конца? Что-нибудь делить на основе того, что вы нашли? – ckittel
К сожалению, мы не отказались от этого сценария и теперь храним эти контрольные точки в хранилище Blob. Попробуем найти время для повторного тестирования. –