Среда: служба приложений Azure.
SDK хранилища Azure: WindowsAzure.Storage (9.3.3)
Вызов (псевдокод):
void QueryAzureTable(){
while(true){
var tableClient = new AzureTable();
var resp = tableClient.Query('table','pk','rk');
// ...
}
}
var tasks = new List<Task>();
for (var i = 0; i < 5; i++)
{
tasks.Add(QueryAzureTable());
}
await Task.WhenAll(tasks).ConfigureAwait(false);
Метод авторизации для QueryAzureTable: пробовали как с clientId/secret, так и с управляемым удостоверением/MSI, одинаковый результат для обоих.
Наблюдение:
QueryAzureTable()
(см. подробное сообщение об ошибке ниже).Сообщение об ошибке:
Я проверил и попробовал почти все решения, упомянутые в этой теме stackoverflow, но безуспешно. Угадайте, что эта конкретная проблема с аутентификацией может быть связана с многозадачностью.
Я сам нашел решение: добавление логики повторной попытки для обновления токена.
void query(...){
int cnt=0;
while(true){
try{
_client.queryTable(...);
}
catch(AuthException ex){
log.error(ex...);
var token=new Token(...);
_client = new AzureTableClient(token);
cnt++;
if (cnt==3) throw;
}
}
}
Первый ключ к этому решению заключался в том, что всякий раз, когда происходил выпуск службы приложений, развертывание или перезапуск службы приложений, функция таблицы запросов некоторое время работала хорошо, а затем примерно через 12 часов начали появляться ошибки. Но не 100% отказов.
Если есть какие-либо объяснения или выводы, помогающие определить причину этого, поделитесь, пожалуйста, своим мнением. Заранее спасибо! Мое слепое предположение заключается в том, что это как-то связано с многозадачностью: WindowsAzure.Storage (9.3.3) плохо справляется с обновлением токена для многозадачности.
Надеюсь, это поможет вам.