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 支持通过 transport
、 https://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/