MongoDB C++驱动程序处理副本集连接故障

MongoDB C++ driver handling replica set connection failures

本文关键字:连接 故障 副本 处理 C++ 驱动程序 MongoDB      更新时间:2023-10-16

所以mongo c++文档说

在故障切换情况下,至少需要一个操作返回故障转移完成之前发生错误(引发异常)。操作未重试

有点烦人,但这让我来处理一个失败的操作。理想情况下,我只希望应用程序睡眠几秒钟(应用程序是单线程的)。再试一次,希望建立一个新的初级mongod。在第二次失败的情况下,我认为连接真的很糟糕,我只想抛出一个异常。

在我的MongoDB Manager类中,这意味着所有操作都设置了这种双重try/catch块。我想知道是否有更优雅的解决方案?

示例方法:

template <typename T>
std::string
MongoManager::insert(std::string ns, T object)
{
  mongo::BSONObj = convertToBson(object);
  std::string result;
  try {
    connection_->insert(ns, oo); //connection_ = shared_ptr<DBClientReplicaSet>
    result = connection_->getLastError();
    lastOpSucceeded_ = true;
  }
  catch (mongo::SocketException& ex)
  {
    lastOpSucceeded_ = false;
    boost::this_thread::sleep( boost::posix_time::seconds(5) );
  }
  // try again?
  if (!lastOpSucceeded_) {
    try {
      connection_->insert(ns, oo);
      result = connection_->getLastError();
      lastOpSucceeded_ = true;
    }
    catch (mongo::SocketException& ex)
    {
       //do some clean up, throw exception
    }
  }
  return result;
}

这确实是你需要处理的方式。也许我会使用以下策略来代替两个try/catch块:

  • 记下你试了多少次
  • 使用作为终止符创建while循环(count<5&&lastOpSuccessed)
  • 然后使用pow(2,count)进行睡眠,以便在每次迭代中睡得更多

然后,当其他一切都失败时,就退出。