【问题标题】:Mongo C++ Driver - How to Change Timeout ConfigurationsMongodb C++ 驱动程序 - 如何更改超时配置
【发布时间】:2019-06-13 05:34:22
【问题描述】:

如何更改因服务器无法访问而可能失败的不同操作的超时时间? (start_session, insert, find, delete, update, ...)

...
auto pool = mongocxx::pool(mongocxx::uri("bad_uri"), pool_options);
auto connection = pool.try_acquire();
auto db = (*(connection.value()))["test_db"];
auto collection = db["test_collection"];

// This does not help
mongocxx::write_concern wc;
wc.timeout(std::chrono::milliseconds(1000));
mongocxx::options::insert insert_options;
insert_options.write_concern(wc);

// takes about 30 seconds to fail
collection.insert_one(from_json(R"({"name": "john doe", "occupation": "_redacted_", "skills" : "a certain set"})"), insert_options);

[编辑]
这是异常消息:

C++ 异常,描述为“未找到合适的服务器: serverSelectionTimeoutMS过期:【连接超时调用 ismaster on '127.0.0.1:27017']

【问题讨论】:

    标签: c++ mongodb mongo-cxx-driver


    【解决方案1】:

    查看来自insert_one() 操作的实际错误消息会很有帮助,但“失败大约需要 30 秒”表明这可能是由于默认的服务器选择超时造成的。您可以通过serverSelectionTimeoutMS 连接字符串选项进行配置。

    如果您要连接到副本集,我建议将该超时设置为略高于完成故障转移的预期时间。 Replica Set Elections 状态:

    集群选择新主节点之前的中间时间通常不应超过 12 秒

    您可能会发现在实践中更短。通过将服务器选择超时保持在预期的故障转移时间之上,您将允许驱动程序将您的应用程序与错误隔离(以等待时间为代价)。

    如果您没有连接到副本集,请随意将serverSelectionTimeoutMS 降低到一个较低的值,尽管它仍然大于您的mongod(独立)或mongos(分片集群)节点的预期延迟。

    请注意,由于发生服务器选择within a loopconnectTimeoutMS 连接字符串选项不会影响您看到的延迟。降低连接超时将允许驱动程序在尝试连接到无法访问的服务器时在内部放弃,但服务器选择仍将阻塞最多 serverSelectionTimeoutMS(并且可能在该循环期间重试与服务器的连接)。

    【讨论】:

    • 谢谢。这对我帮助很大。我现在坚持接受,看看是否有人可以帮助通过驱动程序更改配置,因为这是问题的重点。 (或者这是不可能通过驱动程序做到的?)
    • 对不起,我刚刚意识到您确实说过它是通过“连接字符串选项”设置的。谢谢你。我将使用适当的 URI 示例编辑您的答案。
    • 由于我的编辑被拒绝,我将添加评论。使用 C++ 驱动程序执行此操作的示例:auto pool = mongocxx::pool(mongocxx::uri("mongodb://localhost:27017/?serverSelectionTimeoutMS=1000"));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2018-05-24
    • 2016-03-13
    相关资源
    最近更新 更多