说明
云数据库 MongoDB 提供的不是简单的 mongod 访问,给到用户访问的是一个负载均衡 IP,此 IP 后面是连接到一系列类似 mongos 一样存在的路由接入层。
客户端驱动会透过负载均衡 IP 与接入机建立一个长连接,当此连接处于长期间活跃状态时,我们不会对其做任何干预,但是当长连接闲置时间超过1天时(此时间会随着版本优化而调整),路由接入层会剔除该连接。
一般来说,客户端驱动会实现一个自动重连的过程,但是也有部分语言的驱动并没有实现。对于没有实现自动重连的语言驱动,当用户使用一个已经被剔除的连接来尝试与云数据库 MongoDB 通信时可能会得到 “Remote server has closed the connection” 之类的错误信息,所以需手动进行重连,本文给出一个 PHP 重连的 demo。
基于 php mongo 驱动的重连实现
<?phpfunction getConnection() {$connection = false;$uri = 'mongodb://rwuser:1234567a@10.66.148.142:27017/admin?authMechanism=MONGODB-CR';$maxRetries = 5;for( $counts = 1; $counts <= $maxRetries; $counts++ ) {try {$connection = new MongoClient($uri);} catch( Exception $e ) {// 或者 根据需要使用下面的catch代码行,注意那一个“\\”,某些框架使用命名空间时需要用到。// } catch( \\Exception $e ) {continue;}break;}return $connection;}$connection = getConnection();if($connection) {$db = $connection->testdb;$collection = $db->testcollection;$one = $collection->findOne();var_dump($one);}