【问题标题】:How to limit Couchbase client from trying to connect to Couchbase server when it's down?如何限制 Couchbase 客户端在关闭时尝试连接到 Couchbase 服务器?
【发布时间】:2017-09-01 00:55:39
【问题描述】:

我正在尝试优雅地处理 Couchbase 引导失败,而不是让应用程序启动失败。这个想法是使用“Couchbase 作为服务”,这样如果我无法连接到它,我应该仍然能够返回降级的响应。通过使用 Couchbase 异步 API,我已经能够在一定程度上实现这一点; RxJava FTW。

问题是,当服务器关闭时,Couchbase Java 客户端会发疯并不断尝试连接到服务器;据我所知,执行此操作的课程是ConfigEndpoint,并且在放弃之前尝试的次数没有限制。这使日志充满了java.net.ConnectException: Connection refused 错误。我想要的是让它尝试几次,然后停止。

有什么可以提供帮助的想法吗?

编辑

这是sample app

重现问题的步骤:

  1. svn export https://github.com/asarkar/spring/trunk/beer-demo
  2. beer-demo 目录,运行./gradlew bootRun。等待应用启动。
  3. 从另一个控制台运行curl -H "Accept: application/json" "http://localhost:8080/beers"。由于无法连接到 Couchbase,客户端请求将超时,但 Couchbase 客户端将持续淹没控制台。

【问题讨论】:

  • 刚刚和一位同事谈过这件事,有一件事是模棱两可的。您是说引导程序在启动时失败,还是稍后在集群中出现故障时失败?我们认为如果它在启动时无法连接,它应该几乎立即失败。也许一个小的示例应用会有所帮助。
  • @MattIngenthron 使用示例应用查看编辑。
  • 从代码看来,你有一个自己的 spring-data-couchbase 实现。是否存在无法使用现有 spring-data-couchbase 的特殊原因?我认为它不起作用,因为您在实现 spring 集成时存在问题。
  • @subhashni 我已经回答了您关于已删除的虚假答案的问题。
  • “spring data cb 无法处理引导失败。而你的问题不是我的问题的答案”——这就是你的答案。根据报告称这是一个虚假的答案,它被标记为删除。谢谢。

标签: spring couchbase couchbase-java-api


【解决方案1】:

我们选择让客户端继续连接的原因是 Couchbase 通常部署在高可用性集群情况下。大多数运行我们的 SDK 的人都希望它继续努力工作。我认为我们这样做非常聪明,因为我们进行了指数退避和have tuneables,所以它开箱即用,可以根据您的环境进行调整。

至于您要执行的操作,其中一个可调参数与重试有关。通过调整超时值和重试,您可以让应用程序引用客户端,如果它不能为请求提供服务,则简单地快速失败

另一种选择是,我们确实有办法让您的应用程序知道哪个节点将处理请求(如果引导尚未完成,则为 null),您可以使用它来实现类似断路器的功能。对于未来的版本,我们希望将断路器直接添加到 SDK。

综上所述,这些都不是正常的路径,因为其目的是您的 Couchbase 集群大部分时间都已启动、运行和可访问。故障通过自动故障转移触发故障转移,使事情恢复可用性。根据设计,Couchbase 牺牲了一些可用性来保证被访问数据的一致性,从异常处理程序中读取副本和其他有意过时的读取供您购买(如果需要)。

希望对您有所帮助,并很高兴收到有关您认为我们应该采取不同做法的任何反馈。

【讨论】:

  • 感谢您的回复。我编辑了我的问题以删除“蹩脚的设计”部分:事后看来,一切都很容易,但好的软件设计是迭代的并且基于反馈。 FWIW,我过去为 CB 代码库做出了一点贡献:)也就是说,如果我理解您的建议,您建议调整 Reliability Options#retryStrategyTimeout Options#socketConnect?基于这个post,以前的属性不会有帮助,事实上我已经尝试过了,但没有成功。
  • 我正在考虑放弃 Java 客户端并直接进行 REST 调用。
  • 感谢您的编辑,看看我能否在这里为您提供更好的描述或示例。
  • 几天前我发布了一个示例应用程序并编辑了我的问题以提供更多信息。
  • 今天会尝试看看——我们上周正在发布版本,所以我的时间有点超额了。
【解决方案2】:

自己解决了这个问题。我设计的客户端处理以下用例:

  1. 客户端启动必须能够抵御 CB 故障/可用性。
  2. 如果 CB 不可用,客户端不得使请求失败,而是返回降级响应。
  3. 如果发生 CB 故障转移,客户端必须重新连接。

我创建了一篇博文here。我知道最好复制粘贴而不是链接到外部 URL,但内容太大,无法回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多