如何限制 Couchbase 客户端在关闭时尝试连接到 Couchbase 服务器?

How to limit Couchbase client from trying to connect to Couchbase server when it's down?

我正在尝试优雅地处理 Couchbase bootstrap 故障,而不是使应用程序启动失败。我的想法是使用 "Couchbase as a service",这样如果我无法连接到它,我应该仍然能够 return 降级响应。通过使用 Couchbase async API,我已经能够在某种程度上实现这一点; RxJava FTW.

问题是,当服务器关闭时,Couchbase Java 客户端变得疯狂并不断尝试连接到服务器;据我所知,执行此操作的 class 是 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 客户端将不断涌入控制台。

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

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

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

综上所述,这些不是正常路径,因为其目的是让您的 Couchbase 集群正常运行,运行大部分时间都可以访问。故障通过自动故障转移触发故障转移,从而恢复可用性。按照设计,Couchbase 会牺牲一些可用性来换取被访问数据的一致性,如果您需要的话,从异常处理程序读取副本和其他故意陈旧的读取供您购买

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

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

  1. 客户端启动必须具有 CB 的弹性 failure/availability。
  2. 如果 CB 不可用,客户端不能使请求失败,而是 return 降级响应。
  3. 如果发生 CB 故障转移,客户端必须重新连接。

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