我们在系统上使用了Cassandra 3.0。为了插入数据库,我们使用Datastax C#驱动程序。
我们有一个关于插入期间超时和重试的查询。我们遇到了一个实例,即插入期间抛出超时,但数据库中存在该条目。所有设置都是Cassandra.yaml文件和驱动程序中的默认设置。
即使有超时,我们如何知道插入的实际状态?如果抛出超时,插入怎么可能提前通过?无论插入是否成功,还是应用了一些默认重试策略,我们目前没有任何切实的答案,我们需要确切地知道这一点。
我们如何确保该插入的状态在超时或不超时的情况下实际上是成功/失败的?
写入超时不一定是写入失败,而且它是通知在一段时间内没有足够的副本确认写入。 写入最终仍将在所有副本上进行。
如果确实观察到写入超时,则表示没有足够的副本响应 cassandra.yaml 中配置的 write_request_timeout_in_ms 值内配置的一致性级别,默认值为 2 秒。 但请记住,写入仍然会发生。
负责该写入的协调 Cassandra 节点将写入突变发送到所有副本,并在足够多的回复或达到超时时立即响应客户端。 因此,如果您得到WriteTimeoutException
,则应假设写入发生了。 如果任何副本关闭,协调器会维护该写入的提示,当副本再次可用时,该提示将传递给副本。
Cassandra 还采用读取修复,操作员应运行定期修复以帮助保持数据一致性。
如果操作是幂等的,则只需重试写入,直到成功。 或者,您可以尝试读回数据以确保已处理写入操作。 但是,根据您的应用程序要求,您可能不需要采用这些策略,您可以安全地假设写入已经或将要发生。
另一方面请注意,unavailable
错误(即Not enough replicas available at consistency level X
表示没有足够的副本可用于执行写入,因此从未尝试写入。