2

我觉得这个问题以前会被问到,但我找不到。如果这是重复,请原谅我。

我正在 Heroku 中托管的 Node.js 上构建服务,并使用 Compose 托管的 MongoDB。在重负载下,延迟最有可能来自数据库,因为在服务层中没有什么非常占用 CPU 的。因此,当 MongoDB 超载时,我想立即返回 HTTP 503 而不是等待超时。

我也在使用 REDIS,REDIS 有一个功能,您可以在其中检查排队命令的数量(redisClient.command_queue.length)。使用此功能,我可以立即知道 REDIS 是否已备份。MongoDB有类似的东西吗?

到目前为止,我发现的最佳选择是通过此命令轮询服务器的状态,但是(1)我希望客户端有一些东西,因为轮询间隔内可能会出现导致问题的尖峰,以及(2)我我实际上不确定我想要对状态响应的哪一部分采取行动。第二部分让我想到了一个后续问题......

我不完全理解 MondoDB 客户端如何与服务器一起工作。每个客户端实例(在我的情况下,每个进程)是否共享一个连接?查询和写入是在本地排队还是在服务器上排队?或者,是否为每个查询/写入打开一个连接,直到数据库的连接池耗尽?如果是后者,似乎我可能想关注打开的连接。除了轮询状态之外,MongoDB 服务器是否会在其他时间返回此类信息?

谢谢!

4

1 回答 1

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/

于 2015-05-23T10:01:31.013 回答