Итак, у меня есть 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?