-1

在 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 的客户端应用程序(例如我们的服务器应用程序)。

4

1 回答 1

0

您想要做的是一个糟糕的选择,Cassandra 的全部意义在于构建一个可以处理故障的分布式多节点集群,但是您可以捕获该特定异常并在 java 中忽略它,而无需进行昂贵的日志记录。

try {
    // lots of C* stuff
} catch (NoAvailableHostsException ex) {
    // Swallow exception
}

Astyanax 也不接受请求,它是一个 API 而不是服务器,Cassandra 是服务器。您可以使用 JMX 功能告诉 Cassandra 停止排除请求。您可以stopRPCServer()org.apache.cassandra.db.StorageService. _

于 2013-06-21T13:45:19.980 回答