我正在尝试优雅地处理Couchbase引导程序故障,并且不会使应用程序启动失败。我们的想法是使用“Couchbase作为服务”,这样如果我无法连接它,我仍然可以返回降级的响应。我已经能够通过使用Couchbase异步API来实现这一点; RxJava FTW。
问题是,当服务器关闭时,Couchbase Java客户端会疯狂并继续尝试连接到服务器;从我看来,执行此操作的类是ConfigEndpoint
,并且在放弃之前尝试的次数没有限制。这会使日志充满java.net.ConnectException: Connection refused
错误。我想要的是,尝试几次,然后停止。
有什么想法可以提供帮助吗?
修改:
这是sample app。
重现问题的步骤:
svn export https://github.com/asarkar/spring/trunk/beer-demo
。beer-demo
目录中,运行./gradlew bootRun
。等待应用程序启动。curl -H "Accept: application/json" "http://localhost:8080/beers"
。由于无法连接到Couchbase,客户端请求将超时,但Couchbase客户端将不断地使控制台泛滥。答案 0 :(得分:1)
我们选择让客户端继续连接的原因是Couchbase通常部署在高可用性集群环境中。大多数运行我们SDK的人都希望它继续努力。我认为,我们非常明智地做到这一点,因为我们做了一个指数退避和have tuneables,所以它开箱即用,可以根据您的环境进行调整。
至于你想要做什么,其中一个可调节与重试有关。通过调整超时值和重试,您可以让应用程序引用客户端,如果无法为请求提供服务,只需快速失败。
另一个选择是我们确实有办法让你的应用程序知道哪个节点会处理请求(如果没有完成引导程序,则为null),你可以使用它来实现类似断路器的功能。对于将来的版本,我们希望将断路器直接添加到SDK中。
所有这些都说,这些不是正常的路径,因为您的Couchbase群集的目的是在大多数时间启动,运行和访问。故障通过自动故障转移触发故障转移,从而将事情恢复到可用性。根据设计,Couchbase会对所访问数据的一致性进行一些可用性的交换,如果您需要,可以使用异常处理程序的副本读取和其他故意过时读取购买。
希望对您认为我们应该采取不同的行动提供任何反馈并提供任何反馈。
答案 1 :(得分:0)
我自己解决了这个问题。我设计的客户端处理以下用例:
我创建了一篇博文here。我知道最好是复制粘贴而不是链接到外部URL,但内容对于SO答案来说太大了。