Время от времени сбой запроса хранилища таблиц Azure из-за ошибки проверки подлинности (получено: запрещено)

Среда: служба приложений 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, одинаковый результат для обоих.

Наблюдение:

  1. Около половины запросов не удалось выполнить из-за проблемы с anth в QueryAzureTable() (см. подробное сообщение об ошибке ниже).
  2. Если я перезапущу экземпляр службы приложений Azure, ошибка аутентификации исчезнет примерно на 12 часов.

Сообщение об ошибке:

  1. Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка Authorization сформировано правильно, включая подпись.
  2. Неожиданный код ответа, Ожидается: OK или NotFound, Получено: Запрещено

Я проверил и попробовал почти все решения, упомянутые в этой теме stackoverflow, но безуспешно. Угадайте, что эта конкретная проблема с аутентификацией может быть связана с многозадачностью.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сам нашел решение: добавление логики повторной попытки для обновления токена.

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) плохо справляется с обновлением токена для многозадачности.

Надеюсь, это поможет вам.

Другие вопросы по теме

Не удается получить доступ к созданной Pulumi таблице хранилища Azure — доступ запрещен (403)
У меня нет контейнера azure-webjobs-hosts в обозревателе хранилища azure, поэтому мое приложение-функция azure не запускается
Сбой развертывания бицепса учетных записей хранения Azure для артикула Standard_LRS
Хранилище Azure (Blob, Queue, Table) Ведение журнала в Terraform с помощью for_each и locals
Как заблокировать учетные записи хранения в Azure с помощью Python SDK
Удаление файла Azure не работает с правилом управления жизненным циклом
Можно ли использовать BlobTrigger для контейнера больших двоичных объектов с миллионами больших двоичных объектов?
Azure — как создать постоянное безопасное соединение между приложением-функцией и учетной записью хранения, план использования
Фильтрация результатов списка каталогов хранилища Azure
Как проверить, существует ли большой двоичный объект Azure в учетной записи хранения в нескольких контейнерах?