Azure функции python - как предотвратить исчерпание порта SNAT? - PullRequest
0 голосов
/ 07 января 2020

Итак, у меня есть Azure приложение функций, написанное на python, и довольно часто код выдает ошибку, подобную этой.

HTTPSConnectionPool(host='www.***.com', port=443): Max retries exceeded with url: /x/y/z (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7faba31d0438>: Failed to establish a new connection: [Errno 110] Connection timed out',))

Это происходит в нескольких различных функциях, которые устанавливают соединения https.

Я связался со службой поддержки, и они сказали мне, что это вызвано исчерпанием порта SNAT, и посоветовали мне: «Измените приложение для повторного использования соединений вместо создания соединения по запросу, используйте пул соединений, используйте конечные точки службы, если вы подключаются к ресурсам в Azure. " Они прислали мне эту ссылку https://4lowtherabbit.github.io/blogs/2019/10/SNAT/, а также эту https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections

Проблема в том, что я не уверен в том, как практически повторно использовать и / или объединять соединения в python и я не уверен, что является основной причиной истощения, так как эти данные не являются общедоступными.

Поэтому я ищу помощи в применении их рекомендаций ко всем нашим http (s) и соединениям с базой данных.

Я сделал предположение, что pymon go и pyodb c (клиенты баз данных, которые мы используем) будут обрабатывать повторное использование пула, несмотря на то, что я создаю нового клиента при каждом запуске функции. Это неверно, и если да, то как мне повторно использовать эти клиенты базы данных в python, чтобы предотвратить это?

Проблема до сих пор была вызвана только при использовании requests (или библиотеки zeep SOAP, которая внутренне по умолчанию используется requests) для достижения конечной точки https. Можно ли как-нибудь улучшить, как я использую requests. Как повторное использование сессий или явное закрытие соединений. Мне известно, что запросы создают сеанс в фоновом режиме при вызове requests.get. Но моих знаний о библиотеке недостаточно, чтобы понять, в этом ли проблема и как я могу ее решить. Я думаю, что смогу создать и повторно использовать отдельный экземпляр сеанса для каждого конкретного вызова c http (s) в каждой функции, но я не уверен, правильно ли это, и также не имею представления о том, как на самом деле это сделать. .

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

Я еще не изучал конечные точки обслуживания, но собираюсь.

Итак, вкратце. Что я могу сделать на практике, чтобы обеспечить повторное использование / пул с запросами, pyodb c, pymon go и aiohttp?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...