Это мой сценарий:
Microsoft.Azure.Storage.Blob 11.2.0
Microsoft.Azure.Storage.Queue 11.2.0
Micorosoft.Azure.Cosmos.Table 1.0.7
Я без проблем перенес большую часть своего кода из функции Azure в Google k8s и Google Cloud, запустив приложение Core .Net, в основном с той же библиотекой, встроенной в .net Standard 2.0.
Через несколько дней я заметил другое поведение в системе Linux. Несколько вызовов, взаимодействующих со службой Azure (большие двоичные объекты, таблица, очередь), получают тайм-ауты (похоже, подсистема дает сбой, я пробовал разные политики повторных попыток с тем же результатом). На 10 000 вызовов я получаю от 10 до 50 ошибок (или очень длинные вызовы 180 секунд, до того, как я изменил таймауты). Это происходит во всех службах Azure: таблице, большом двоичном объекте и очереди.
Я пробовал разные решения, чтобы выяснить, почему:
- Я создаю экземпляр клиента (blobClient, TableClient..etc) при каждом вызове или повторно использую один и тот же клиент, но без разницы
- Я меняю все тайм-ауты, чтобы справиться с этим поведением. Я работаю над ServerTimeout и MaximumExecutionTime и добавляю слой поверх своего механизма повторных попыток, чтобы свести к минимуму ошибки. Сейчас у меня всего несколько звонков по 20 секунд (вместо 2/3 сек например).
- Я пробовал все решения с похожими проблемами, найденные на Stackoverflow: D ... но ничего не работает (пока)
Тот же код dll запускается на лазурной функции без каких-либо проблем.
Итак, я пришел к выводу, что в http-клиенте есть что-то, используемое внутри azure sdk, что зависит от операционной системы, в которой вы запускаете свой код. Я думаю, что после нескольких статей это может быть заголовок Keep-Alive, поэтому я примеряю корень своей композиции:
ServicePointManager.SetTcpKeepAlive (true, 120000, 10000);
но ничего не меняется.
Любые идеи или предложения? ... может быть, я на неправильном пути, или я что-то пропустил.