连接池在PyMongo中是如何工作的

连接池在PyMongo中是如何工作的

每个MongoClient实例在每个MongoDb服务器都有一个内置的连接池,这些连接池会立即打开socket,用来支持多线程应用所需的并发操作MongoDB数量。这些socket没有线程相关性。

每个连接池的大小被限制在maxPoolSize,默认值为100.如果存在maxPoolSize个到服务器的连接并且这些连接全部在使用中,那么到该服务器的下一个请求会一直等待,直到其中一个连接可用。

客户端实例在MongoDB集群中的每个服务器上额外打开一个socket来监视服务器的状态。

例如:一个连接到3个节点主从复制服务器的客户端将打开3个监视socket。它还可以根据需要打开更多个socket(最多maxPoolSize)来支持每个服务器上多线程应用的并发操作。在maxPoolSize为100的情况下,如果应用只使用主连接,则只有主连接池的连接数增加(最多103)。如果应用使用ReadPreference查询辅助数据库,则它的连接池的连接数也会增加,总连接数可以达到303.

可以通过使用minPoolSize(默认0)参数来设置每个服务器的最小并发连接数。连接池将初始化minPoolZise个socket。如果由于网络原因导致socket关闭,导致socket的连接数(使用中和空闲中)下降到最小值以下,则会打开新的socket,直到socket的数量达到最小值。

可以使用maxIdleTime参数来设置一个连接在连接池中保持空闲的最大毫秒数,之后它将被删除或者替换,默认值为None(没有限制)。

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

client = MongoClient(host, port)

敲重点

复制代码为每个进程创建一次客户端,并将其重用于所有操作。为每个请求创建一个新的客户端是一个常见的错误,因为这样非常低效。(感觉在Mysql和Redis中同样适用)
要在一个进程中支持极高数量的并发MongoDB操作,需增加maxPoolSize:

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

复制代码或者使其没有限制:

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

复制代码默认情况下,允许任意数量的线程等待socket可用,并且可以等待任意长的时间。可以设置waitQueueMultiple参数来限制等待线程的数量。例如:限制等待数量不大于500:

client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10)

复制代码当已经由500个线程正在等待socket时,第501个需要socket的线程将抛出ExceededMaxWaiters。使用waitQueueMultiple可以现在加载峰值期间应用中排队的数量,但是会引起额外的异常。
一旦连接池达到最大值,另外的线程可以无限等待socket可用,除非你设置了waitQueueTimeoutMS:

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

复制代码在这个例子中,一个线程如果等待socket的时间超过100ms,它将抛出ConnectionFailure错误。waitQueueTimeoutMS适用于在加载峰值期间限制操作的持续时间比完成每个操作更重要的情景。
当任何线程调用close()时, 所有闲置的socket都会被关闭,所有正在使用的socket将在它返回连接池时被关闭。

作者:白夜
链接:https://juejin.im/post/5a3b1e9c51882515945abedf
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(连接池在PyMongo中是如何工作的)