python - 管理 Azure 无服务器函数应用中的连接

标签 python azure azure-functions azure-cosmosdb serverless

Microsoft recommends您在整个应用程序中维护一个 CosmosClient 实例,我正在尝试在我的 Function App 中实现这一点(不仅仅是 CosmosClient)。但是,即使重新使用数据库和容器代理,我总是会看到一条警告,指出我已达到 Cosmos 的最大连接数 (10),并且当我发送足够的请求时,它会丢弃连接。

就上下文而言,它是一个由消息队列触发的无服务器 Python 函数应用程序,连接在辅助函数的共享代码中进行管理。我必须使用 Cosmos SDK,因为我必须阅读和更新 Cosmos 文档。

过去有人成功解决过这个问题吗?为每个函数调用实例化一个新连接是否就是最佳实践?我尝试在接收突发流量时创建一个新的 CosmosClients,但事实证明很难有效地做到这一点。

这是我用来管理连接的类的示例:

COSMOS_CLIENT = None

class Client:
    def __init__(self):
        self.cosmos_client: CosmosClient = self._get_global_cosmos_client()
    
    def _get_global_cosmos_client(self) -> CosmosClient:
        global COSMOS_CLIENT
        if COSMOS_CLIENT is None:
            logging.info('[COSMOS] NEW CLIENT CONNECTION')
            COSMOS_CLIENT = CosmosClient.from_connection_string(COSMOS_DB_CONNECTION_STRING
        return COSMOS_CLIENT

最佳答案

从概念上讲,因为您要基于 ConnectionString 创建客户端(始终有 1 个),所以此代码应始终创建 1 个客户端。

连接数不是客户端数。

不要创建多个客户端,始终为您与之交互的每个帐户创建 1 个客户端。该单个客户端可以对帐户中的所有现有数据库/容器执行操作。

创建多个客户端只会产生问题,因为每个客户端都会维护自己独立的连接并且不会重用它们,并且会创建比重用单个客户端更多的连接,最终导致 SNAT 端口耗尽。

错误消息:连接池已满,正在丢弃连接:不是由 Cosmos Client 直接生成的,而是由底层 urllib3.connectionpool 生成的。请参阅:https://github.com/Azure/azure-sdk-for-python/issues/12102

CosmosClient 支持通过 transporthttps://github.com/Azure/azure-sdk-for-python/blob/main/sdk/core/azure-core/CLIENT_LIBRARY_DEVELOPER.md#transport 、 -> https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py#L198 传递 session 。 引用:https://github.com/Azure/azure-sdk-for-python/issues/12102#issuecomment-645641481

关于python - 管理 Azure 无服务器函数应用中的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75451022/

相关文章:

python - 如何在 Keras 中缓存层激活?

ios - 适用于单独 iPad 和 iPhone 应用程序的 Azure 通知中心配置

c# - ApplicationInsights OperationId 为空

azure - 如何创建命令式 Azure 队列输入函数

javascript - Azure Function + Javascript如何获取我在post请求中传递的数据?

python - Monkeypatch python的解析

javascript - 调用InitiateAuth操作时发生错误(InvalidLambdaResponseException): Unrecognizable lambda output

python - 防止 wxPython 显示 'Unhandled exception' 对话框

c# - 适用于本地 Web 应用程序的 Azure Application Insight 遥测

Azure Function 应用程序还是 Web API?