本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
遇到一般性错误? 以下介绍一些常见问题以及如何解决这些问题。
一般性错误
您会遇到以下顶级异常之一,这些异常可能因许多不同的原因而产生。
NoNodeAvailableException
NoHostAvailableException
AllNodesFailedException
这些异常是由客户端驱动程序生成的,可能发生在您建立控制连接或执行read/write/prepare/execute/batch请求时。
如果您在建立控制连接时发生错误,表明应用程序中指定的所有联系点都无法访问。如果在执行read/write/prepare/execute查询时出现错误,则表示该请求的所有重试次数都已用完。使用默认重试策略时,每次重试都是在不同的节点上尝试的。
如何将底层错误与顶级 Java 驱动程序异常隔离开来
这些一般错误可能是由连接问题引起的,也可能是执行read/write/prepare/execute操作时造成的。在分布式系统中,必须预料到会出现暂时故障,并且应通过重试请求来处理。遇到连接错误时,Java 驱动程序不会自动重试,因此建议在应用程序中建立驱动程序连接时实施重试策略。有关连接最佳实践的详细概述,请参阅优化无服务器环境的客户端驱动程序连接。
默认情况下,Java 驱动程序将所有请求设置idempotence
为 false,这意味着 Java 驱动程序不会自动重试失败的read/write/prepare请求。要将 idempotence
设置为 true
并告诉驱动程序重试失败的请求,您可以通过几种不同的方式执行此操作。以下是如何以编程方式为 Java 应用程序中的单个请求设置幂等性的示例。
Statement s = new SimpleStatement("SELECT * FROM my_table WHERE id = 1");
s.setIdempotent(true);
您也可以通过编程方式设置整个 Java 应用程序的默认幂等性,如以下示例所示。
// Make all statements idempotent by default:
cluster.getConfiguration().getQueryOptions().setDefaultIdempotence(true);
//Set the default idempotency to true in your Cassandra configuration
basic.request.default-idempotence = true
另一项建议是在应用程序级别创建重试策略。在这种情况下,应用程序需要捕获 NoNodeAvailableException
并重试请求。我们建议重试 10 次,指数回退从 10 毫秒开始,最长可达 100 毫秒,所有重试的总时间为 1 秒。
另一种选项是在建立 Github
使用默认重试策略时,请确认您已与多个节点建立了连接。您可以使用 Amazon Keyspaces 中的以下查询执行该操作。
SELECT * FROM system.peers;
如果此查询的响应为空,则表示您正在使用 Amazon Keyspaces 的单个节点。如果您使用的是默认重试策略,则不会重试,因为默认重试始终发生在不同的节点上。要了解有关通过VPC端点建立连接的更多信息,请参阅如何在 Amazon Keyspaces 中通过 VPC 端点配置连接。
有关演示如何使用 Datastax 4.x Cassandra 驱动程序与亚马逊密钥空间建立连接的 step-by-step教程,请参阅。Step-by-step 使用适用于 Apache Cassandra 的 4.x DataStax Java 驱动程序和 Sigv4 身份验证插件连接亚马逊密钥空间的教程