我觉得以前会问这个问题,但我找不到一个。如果这是重复,请原谅我。
我正在Heroku上托管的Node.js上构建一个服务,并使用Compose托管的MongoDB。在高负载下,延迟最有可能来自数据库,因为服务层中没有任何CPU占用大量资源。因此,当MongoDB过载时,我想立即返回HTTP 503,而不是等待超时。
我也使用REDIS,REDIS有一个功能,你可以检查排队命令的数量(redisClient.command_queue.length)。有了这个功能,我可以立即知道REDIS是否已备份。 MongoDB有类似的东西吗?
我到目前为止找到的最佳选择是通过this command轮询服务器的状态,但是(1)我希望客户端有一些东西,因为轮询间隔内可能会出现导致问题的峰值, (2)我实际上并不确定我想采取什么样的状态回应。第二部分向我提出了一个后续问题......
我不完全了解MondoDB客户端如何与服务器配合使用。是否每个客户端实例共享一个连接(在我的情况下,每个进程)?查询和写入是在本地还是在服务器上排队?或者,是否为每个查询/写入打开了一个连接,直到数据库的连接池耗尽为止?如果是后者,似乎我可能想要密切关注开放的连接。除了轮询状态时,MongoDB服务器是否在其他时间返回此类信息?
谢谢!
答案 0 :(得分:2)
MongoDB连接池工作流程
每个MongoClient实例都有一个内置连接池。客户端根据需要打开套接字,以支持应用程序所需的并发MongoDB操作数。套接字没有线程关联。
客户端实例在MongoDB拓扑中为每个服务器打开一个额外的套接字,用于监控服务器的状态。
每个连接池的大小上限为maxPoolSize
,默认为100.
当应用程序中的某个线程开始对MongoDB进行操作时,如果所有其他套接字都在使用且池已达到其最大值,则该线程会暂停,等待另一个线程将套接字返回到池中。
您可以增加maxPoolSize
:
client = MongoClient(host, port, maxPoolSize=200)
默认情况下,允许任意数量的线程等待套接字变为可用,并且它们可以等待任何时间长度。覆盖waitQueueMultiple
以限制等待线程的数量。例如,保持服务员人数小于或等于500:
client = MongoClient(host, port, maxPoolSize=50, waitQueueMultiple=10)
一旦池达到其最大大小,除非您设置waitQueueTimeoutMS
,否则允许其他线程无限期地等待套接字可用:
client = MongoClient(host, port, waitQueueTimeoutMS=100)
连接池参考 - http://blog.mongolab.com/2013/11/deep-dive-into-connection-pooling/