在Cassandra / Astyanax开发环境中,我正在运行单个/本地Cassandra节点。当这个单个Cassandra节点出现故障(无论出于何种原因)时,任何基于Astyanax的客户端代码(变异批处理,查询......)都会失败,并出现类似的情况:
com.netflix.astyanax.connectionpool.exceptions.NoAvailableHostsException: NoAvailableHostsException: [host=None(0.0.0.0):0, latency=0(0), attempts=0]No hosts to borrow from
at com.netflix.astyanax.connectionpool.impl.RoundRobinExecuteWithFailover.<init>(RoundRobinExecuteWithFailover.java:30)
at com.netflix.astyanax.connectionpool.impl.TokenAwareConnectionPoolImpl.newExecuteWithFailover(TokenAwareConnectionPoolImpl.java:80)
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:248)
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$4.execute(ThriftColumnFamilyQueryImpl.java:532)
并为每个后续的基于Astyanax的客户端请求记录此异常,从而导致上述日志垃圾邮件。基本上,我问是否有办法以一种方式配置Astyanax连接池以停止接受请求,并理想地提供某种回调,允许我关闭我的基于Astyanax的客户端应用程序(例如我们的服务器应用程序)。 / p>
答案 0 :(得分:0)
你想要做的是一个糟糕的选择,Cassandra的重点是构建一个可以处理故障的分布式多节点集群,但是你可以捕获这个特定的异常并在java中忽略它而不需要进行昂贵的日志记录
try {
// lots of C* stuff
} catch (NoAvailableHostsException ex) {
// Swallow exception
}
Astyanax也不接受请求,它的API不是服务器,Cassandra是服务器。您可以告诉Cassandra停止使用JMX功能排除请求。您可以invoke stopRPCServer()
调用org.apache.cassandra.db.StorageService
JMX函数。