Cassandra中的批处理语句的替代,用于原子操作以避免对性能的影响

问题描述 投票:1回答:1

我们有一个使用Cassandra作为数据存储的应用程序。为了方便访问,需要将相同的数据存储在具有不同分区键的多个表中。为了将数据存储到多个表中,使用BatchStatement。使用批处理语句的原因是确保将数据写入全部或不写入。

通过此设置,由于用户群的增加,最近我们开始看到很多写入超时错误。我们遇到了许多博客和文章,其中提到BatchStatements被错误地用于存储多个分区。

参考:

这样做的原因似乎是协调器节点上的负担很大,从而导致延迟。可以选择将cassandra.yaml中的write_request_timeout_in_ms增加到比默认值5秒更高的值。我们尝试了此操作,但请求仍然失败。因此,我们更新了此设置,以现在使用executeAsync。这样,WriteTimeout异常完全消失了。

但是现在的问题是-我们如何处理原子性?下面是更新为使用executeAsync的代码。使用executeAsync是使用批处理语句的正确选择吗?在异常块中可以处理回滚吗?

try {
    for (ListenableFuture<ResultSet> futureItem : futureItems) {
        futureItem.get();
    }
} catch (Exception e) {
    // need to handle rollback ?
}
cassandra datastax
1个回答
0
投票

最终,您要的不存在-根据设计。

  • 对于写入的原子性,您找到了具有批处理的解决方案。对于写入的替代原子性,最终没有。

  • 对于数据的硬一致性-包括写入和读取,您可以设置写入和读取的一致性级别以确保硬一致性(WC:Local_Quorum,RC:Local_Quorum)

[许多新用户/开发团队经常尝试在Cassandra上强制使用关系类型规则,但是一段时间之后,他们对Cassandra的使用通常使人们对其设计抱有信心,以实现可调的一致性,减少的停机时间和可伸缩性。

© www.soinside.com 2019 - 2024. All rights reserved.