2016-08-03 1 views
7

Мы сталкиваемся с каким-то странным поведением с 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 

Любая идея, что может быть причиной этого?

+0

Прошло около года, поэтому этот метод должен был работать примерно 365 раз;) Вы когда-нибудь дошли до конца? Что-нибудь делить на основе того, что вы нашли? – ckittel

+0

К сожалению, мы не отказались от этого сценария и теперь храним эти контрольные точки в хранилище Blob. Попробуем найти время для повторного тестирования. –

ответ

0

Is GetCheckpointKey общается с устройством? Может быть, это занятие потоком и блокирование, то есть пул потоков исчерпывается.

Возможно, хватается за соломинку, но отсутствие ожидания на GetCheckpointKey делает меня несколько подозрительным.

+0

Вся связь с устройством выполняется в тот момент, когда нанесен код выше. GetCheckpointKey содержит только строку string.Format, чтобы объединить две строки, чтобы получить ключ словаря. Следующий вызов (SetAsync) все еще работает нормально и завершается быстро. Затем вызов CommitAsync зависает. –