spring 如何限制Couchbase客户端在故障时尝试连接到Couchbase服务器?

xqk2d5yq  于 2023-02-03  发布在  Spring
关注(0)|答案(3)|浏览(145)

我试图优雅地处理Couchbase引导失败,而不是应用程序启动失败。想法是使用"Couchbase作为服务",以便如果我无法连接到它,我仍然能够返回降级响应。我已经能够通过使用Couchbase异步API在一定程度上实现这一点;接收Java FTW。
问题是,当服务器停机时,Couchbase Java客户端会发疯,并不断尝试连接到服务器;据我所知,执行此操作的类是ConfigEndpoint,并且在放弃之前没有限制它尝试的次数。这会使日志充满java.net.ConnectException: Connection refused错误。我希望它尝试几次,然后停止。
有什么办法能帮上忙吗?

    • 编辑**:

这是一个sample app
重现问题的步骤:

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

nmpmafwu1#

我们选择让客户端继续连接的原因是Couchbase通常部署在高可用性集群环境中。大多数运行我们SDK的人希望它继续尝试工作。我认为我们做得很聪明,因为我们做了指数回退和have tuneables,所以它是合理的开箱即用,可以根据您的环境进行调整。
至于你想做什么,其中一个可调参数与重试有关,通过调整超时值和重试,你可以让客户端被应用程序引用,如果它不能服务请求,你可以简单地 * 快速失败 *。
另一种选择是,我们有办法让您的应用知道哪个节点将处理请求(如果 Bootstrap 尚未完成,则为null),您可以使用此方法实现类似断路器的功能。对于未来的版本,我们希望将断路器直接添加到SDK中。
尽管如此,这些都不是正常的路径,因为其目的是让您的Couchbase集群在大部分时间内都处于启动、运行和可访问状态。故障通过自动故障转移触发故障转移,从而恢复可用性。根据设计,Couchbase在一定程度上牺牲了可用性,以确保所访问数据的一致性。从异常处理程序中读取副本,以及其他有意过时的读取,以便您在需要时 * 购买 *。
希望这能有所帮助,并很高兴得到任何反馈,你认为我们应该做什么不同。

0md85ypi

0md85ypi2#

我自己解决了这个问题。我设计的客户端处理以下用例:
1.客户端启动必须能够抵御CB故障/可用性。
1.如果CB不可用,客户端不能使请求失败,而是返回降级响应。
1.如果发生CB故障切换,客户端必须重新连接。
我创建了一篇博客文章here。我知道复制粘贴比链接到外部URL更可取,但内容太大,无法回答。

9w11ddsr

9w11ddsr3#

启动一个单独的线程,并保持每10或20秒调用一次ping,一个CB关闭ping将开始失败,进行类似“如果ping连续失败5-6次,则关闭所有CB连接/资源”的检查

相关问题