【问题标题】:Tell Datastax Java Cassandra driver to timeout cluster connection告诉 Datastax Java Cassandra 驱动程序超时集群连接
【发布时间】:2013-07-14 20:27:37
【问题描述】:

当 Datastax Java Cassandra 驱动程序尝试连接到您的集群时,您如何告知它超时?

我对主机可访问但 Cassandra 端口被阻塞或 Cassandra 守护程序未运行的情况特别感兴趣。我正在编写一个命令行客户端,如果它无法在合理的时间内连接,它应该退出并报告合适的错误消息。目前看来,如果接触点可达,驱动程序将永远等待接触点的响应。

也就是说,如果驱动程序在给定的最长时间内无法与任何接触点的 Cassandra 守护程序通信,我希望 Cluster.build() 抛出 NoHostAvailableException

  • 创建我自己的RetryPolicy 不起作用:这是为了重试查询,我希望在我们准备好运行查询之前应用超时
  • 创建我自己的 ReconnectinoPolicy 最初看起来很有希望,但接口的合同没有提供任何方法来表明“认为这个节点永远死了”

【问题讨论】:

    标签: java cassandra datastax-java-driver


    【解决方案1】:

    也就是说,如果驱动程序在给定的最长时间内无法与任何接触点的 Cassandra 守护程序通信,我希望 Cluster.build() 抛出 NoHostAvailableException。

    应该是这样的。驱动程序将尝试连接到每个接触点,如果连接失败则抛出异常。您可以通过 SocketOptions.setConnectTimeoutMillis() 控制驱动程序尝试连接(到每个节点)的最长时间(默认为 5 秒)。

    我的经验是,如果没有节点可以连接到 Cluster.build() 确实会返回异常,但如果您的经验不同,您可能希望将其报告为错误(但有关如何重现此问题的更多详细信息会有所帮助)。

    话虽如此:

    • 上述超时是针对每个主机的。因此,如果您传递 100 个联系点的列表,理论上您可能必须等待 500 秒(默认情况下)才能获得 NoHostAvailableException。但是提供这么多的接触点并没有真正的意义,实际上,如果 Cassandra 没有在尝试的节点上运行,连接尝试通常会立即失败(您不会等待超时)。
    • 驱动端当前没有真正的查询超时。这意味着如果驱动程序确实连接到一个节点(这意味着 some 进程正在侦听该端口并接受连接),但没有得到他的初始消息的答案,那么它确实可以永远保持.这应该可以解决了,我鼓励你在https://datastax-oss.atlassian.net/browse/JAVA 上开一张票。但是,您所描述的情况似乎并非如此,因为如果“Cassandra 端口被阻止或 Cassandra 守护程序未运行”,那么驱动程序首先应该无法连接。

    【讨论】:

    • 我可能真的看到了第二种情况。我一定错过了那个套接字选项。正如您所暗示的那样,这对于大多数情况应该已经足够了。
    • @Raedwald,您是否为此问题提交了错误,或者是否有更简单的解决方案?
    猜你喜欢
    • 2014-06-11
    • 2015-07-23
    • 2016-07-26
    • 2013-12-23
    • 2021-02-09
    • 2015-04-01
    • 2017-11-15
    • 2014-03-08
    • 2014-11-07
    相关资源
    最近更新 更多