我们有一个应用程序,使用Cassandra作为数据存储。为了便于访问,相同的数据需要用不同的分区键存储在多个表中。为了将数据存储到多个表中,使用了批处理语句。使用batch语句的原因是为了确保数据被全部写入或全部不写入。
有了这个设置,最近我们开始看到由于用户群的增加而导致的许多写入超时错误。我们遇到了许多博客和文章,其中提到Batch语句被错误地用于存储多个分区。
参考资料:
原因似乎是协调器节点上的负载很大,进而导致延迟。在cassandra中有一个增加write_request_timeout_in_ms的选项。yaml设置为高于默认值5s。我们尝试了此操作,但仍然请求失败。因此,我们将此设置更新为现在使用executeAsync。这样,WriteTimeout异常就完全消失了。
但现在的问题是 - 我们如何处理原子性?下面是更新为使用执行异步的代码。使用执行异步是否是使用批处理语句的正确替代方法?有没有办法在异常块中处理回滚?
try {
for (ListenableFuture<ResultSet> futureItem : futureItems) {
futureItem.get();
}
} catch (Exception e) {
// need to handle rollback ?
}
专门为高可用性和分区容差(CAP的AP)而设计的NoSQL数据库不能提供高引用完整性。相反,它们被设计为提供高吞吐量和低延迟读写。Cassandra本身没有跨表引用完整性的概念。
批处理插入和LWT在未大规模使用之前都很好。对于您的用例,您需要重新审视如何使用Cassandra以及如何设计数据处理管道以向所有表提供弹性写入。
考虑解耦所有这些表写入,使用kafka之类的东西使它们并行弹性管道,然后将数据持久化到Cassandra表。您可以只创建一次数据管道,从而确保引用数据的完整性。Cassandra确实支持Kafka连接器
https://www.datastax.com/blog/2018/12/introducing-datastax-apache-kafkatm-connector
最终,你所要求的是不存在的——出于设计。
>
对于写入的原子性,您找到了批处理的解决方案。对于写入的替代原子性,最终没有。
对于数据的硬一致性——包括写和读,您可以设置写和读的一致性级别,以确保硬一致性(WC: Local_Quorum,RC: Local_Quorum)
许多较新的用户/开发团队经常试图在Cassandra上强制使用关系类型规则,但随着时间的推移,他们对Cassandra的使用通常会带来对其设计的信任,允许可调一致性、减少停机时间和可伸缩性。
componentWillMount() 在组件将要挂载时被立即调用. 这个调用发生在render()函数执行之前, 所以如果在componentWillMount里面设置了state, 这个设置的state是不会触发重新渲染的. 同样我们也需要注意不要在componentWillMount()中引入其他可能会导致问题的代码. 如果你有类似的需求, 请在componentDidMount里面完成.
我想使用batch语句从数据库的3个表中删除一行,以确保原子性。所有3个表中的分区键都是相同的。在我读到的所有关于批处理语句的例子中,所有的查询都是针对单个表的?在我的例子中,使用批处理语句是个好主意吗?或者说,我应该回避吗? 我使用的是 Cassandra-3.11.2,我使用 C 驱动程序执行查询。
问题内容: 我的情况与Code Complete中Steve McConnell 提到的情况非常相似。我唯一的问题是基于车辆,而三轮车恰好是根据法律,属于汽车。到目前为止,汽车只有四个轮子。无论如何,我的域都不必要地复杂,因此很容易遵循下面的cats示例。 对重写例程并且在派生例程中不执行任何操作的类要保持怀疑。这通常表明基类的设计存在错误。例如,假设您有一个Cat类和一个例程Scratch(),
转换操作引入不同类之间的替代性。替代性的意思是一个类可以被另外一个类代替。这有一个好处:一个子类可以代替基类,像下面 shape 继承结构给出例子。你定义基类 Shape 并自定义它的子类: Rectangle , Ellipse , Circle 等。在期望是 Shape 的地方你可以用 Circle 代替它。这是使用多态的替代性。这个是因为 Circle 是 Shape 的一个特别类型。当你创
问题内容: 我了解到try catch语句的finally子句始终执行。但是有人对我说,有可能避免执行它(删除它不是一种选择)。 -有人怎么可能? -我也很好奇知道为什么有人要避免执行它? 问题答案: 使用该块中未捕获的异常将其杀死,或者将整个JVM杀死(这将杀死线程)。 除了不良的设计外,没有充分的理由停止执行块。如果不应该每次都运行它,则不要将其放在一个块中。 使用下面的测试代码,我运行了两种