连接池化
MongoDB C 驱动程序有两种连接模式:单线程和池化。 单线程模式针对将驱动程序嵌入到 PHP 等语言中进行了优化。 多线程程序应使用池化模式:此模式可最大限度地减少总连接数,在池化模式下,后台线程会监控 MongoDB 服务器拓扑,因此程序无需阻塞即可对其进行扫描。
单模式
在单一模式,您的程序会创建一个 mongoc_client_t 直接:
mongoc_client_t *client = mongoc_client_new ( "mongodb://hostA,hostB/?replicaSet=my_rs");
当您的程序首次将客户端用于MongoDB操作时,客户端会按需连接。 使用每个服务器的非阻塞套接字,它开始同时检查每个服务器,并使用异步 poll
或select
函数从套接字接收事件,直到所有服务器均已响应或超时。 换句话说,在单线程模式, C驱动程序会扇出以同时开始所有检查,然后在所有检查完成或超时后扇入。 扫描完成后,客户端将执行程序的操作并返回。
在单一模式,客户端大约每分钟重新扫描服务器拓扑结构一次。 如果自上次扫描以来时间间隔超过一分钟,则在客户端完成扫描时,客户客户端上的下一个操作将被区块。 此时间间隔可通过连接string中的 heartbeatFrequencyMS
进行配置。 (请参阅 mongoc_uri_t 。)
单个客户端为拓扑结构中的每个服务器打开一个连接:这些连接用于扫描拓扑结构和执行正常操作。
池化模式
要激活池化模式,请创建一个 mongoc_client_pool_t:
mongoc_uri_t *uri = mongoc_uri_new ( "mongodb://hostA,hostB/?replicaSet=my_rs"); mongoc_client_pool_t *pool = mongoc_client_pool_new (uri);
当您的程序首次调用 mongoc_client_pool_pop 时 时,池会在背景启动监控线程。监控线程独立连接到连接string中的所有服务器。 当监控线程收到来自服务器的 hello 响应时,它们会更新服务器拓扑结构的共享视图。 发现新服务器时会创建更多监控线程和连接。 当服务器从服务器拓扑结构的共享视图中删除时,监控线程将终止。
每个执行MongoDB操作的线程都必须从池中检出一个客户端:
mongoc_client_t *client = mongoc_client_pool_pop (pool); /* use the client for operations ... */ mongoc_client_pool_push (pool, client);
mongoc_client_t 对象不是线程安全的,只有 mongoc_client_pool_t 群岛。
当驾驶员处于池化模式时,一旦监控发现可用的服务器,程序的操作就会被解除阻塞。 示例,如果程序中的一个线程正在等待在主节点 (primary node in the replica set)节点上执行“插入”,则一旦发现主节点 (primary node in the replica set)节点,该线程就会解除阻塞,而不是等待所有从节点也被检查到。
该池为每个服务器打开一个连接用于监控,每个客户端打开到其用于应用程序操作的每台服务器的连接。 后台监控线程大约每10秒独立重新扫描一次服务器。 此时间间隔可通过连接string中的 heartbeatFrequencyMS
进行配置。 (请参阅 mongoc_uri_t 。)
连接string 还可以指定waitQueueTimeoutMS
来限制 mongoc_client_pool_pop 将等待池中的客户端。(请参阅 mongoc_uri_t 。)如果指定了waitQueueTimeoutMS
,则需要确认实际返回了客户端:
mongoc_uri_t *uri = mongoc_uri_new ( "mongodb://hostA,hostB/?replicaSet=my_rs&waitQueueTimeoutMS=1000"); mongoc_client_pool_t *pool = mongoc_client_pool_new (uri); mongoc_client_t *client = mongoc_client_pool_pop (pool); if (client) { /* use the client for operations ... */ mongoc_client_pool_push (pool, client); } else { /* take appropriate action for a timeout */ }
请参阅 连接池选项 配置池大小和行为,请参阅 mongoc_client_pool_t 查看在池化模式使用驾驶员程序的多线程程序的扩展示例。