如何使用pymong在lambda函数中实现Mongodb连接池

2024-09-30 10:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是aws lambda函数、python和monogdb atlas。我已经执行了下面的代码。你知道吗

client = MongoClient('mongodb+srv://app_user:123456@accesdev-dxjpa.mongodb.net/test')
db = client.test

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=1))
    user_profile = db.user_profile
    Email = event['email']
    res = Email.find('@')
    if res == -1:
        disuname = list(user_profile.find({"username" : Email},{"name": 1, "photo": 1, "bio": 1}))
        uid = json.dumps(disuname, default=json_util.default)
        return json.loads(uid)

    else:
       disuname = list(user_profile.find({"email": Email},{"name": 1, "photo": 1, "bio": 1}))
       uid = json.dumps(disuname, default=json_util.default)
       return json.loads(uid)

在执行上述代码时,mongodb连接的大小将增加,并将达到最大大小。我听过mongodb连接池的概念,但不知道如何在pymongo的lambda函数中实现它。你能帮我解决这个问题吗。你知道吗


Tags: lambda函数代码clienteventjsondefaultuid
1条回答
网友
1楼 · 发布于 2024-09-30 10:27:45

以下几行来自下面的链接,这应该是一个很好的解释或更好的起点-请通读:

在MongoDB拓扑中,每个MongoClient实例都有一个针对每台服务器的内置连接池。这些池按需打开套接字,以支持多线程应用程序所需的并发MongoDB操作数。套接字没有线程关联。你知道吗

每个连接池的大小都限制在maxPoolSize,默认为100。如果有到服务器的maxPoolSize连接并且所有连接都在使用中,那么对该服务器的下一个请求将等待其中一个连接可用。你知道吗

客户机实例在MongoDB拓扑中为每台服务器打开一个额外的套接字,用于监视服务器的状态。你知道吗

例如,连接到3节点副本集的客户端将打开3个监视套接字。它还根据需要打开尽可能多的套接字,以支持多线程应用程序在每台服务器上的并发操作,最大可达maxPoolSize。当maxPoolSize为100时,如果应用程序只使用主连接池(默认值),则只有主连接池增长,总连接数最多为103。如果应用程序使用ReadPreference来查询辅助数据库,那么它们的池也会增长,总连接数可以达到303。你知道吗

可以使用minPoolSize设置到每个服务器的最小并发连接数,默认值为0。将使用此数量的套接字初始化连接池。如果由于任何网络错误导致套接字关闭,导致套接字总数(正在使用和空闲)下降到最小值以下,则会打开更多的套接字,直到达到最小值。你知道吗

在删除和替换连接之前,连接在池中可以保持空闲的最大毫秒数可以用maxIdleTime设置,默认为无(无限制)。你知道吗

MongoClient的默认配置适用于大多数应用程序:

client = MongoClient(host, port)

为每个进程创建一次此客户机,并在所有操作中重用它。为每个请求创建一个新的客户机是一个常见的错误,这是非常低效的。你知道吗

要在一个进程中支持大量并发MongoDB操作,请增加maxPoolSize:

client = MongoClient(host, port, maxPoolSize=200)

…或使其无界:

client = MongoClient(host, port, maxPoolSize=None)

一旦池达到其最大大小,其他线程就必须等待套接字可用。PyMongo并不限制可以等待套接字变为可用的线程数,应用程序的责任是在负载高峰期间将其线程池的大小限制为绑定队列。允许线程等待任意长度的时间,除非定义了waitQueueTimeoutMS:

client = MongoClient(host, port, waitQueueTimeoutMS=100)

等待套接字超过100ms(在本例中)的线程将引发ConnectionFailure。如果在负载峰值期间绑定操作的持续时间比完成每个操作更重要,请使用此选项。你知道吗

当任何线程调用close()时,所有空闲的套接字都将关闭,所有正在使用的套接字在返回到池时都将关闭。你知道吗

参考号:Connection pooling in pymongo

相关问题 更多 >

    热门问题