gpt4 book ai didi

java - 如何在 Cassandra 中将批处理语句和 LWT 作为事务执行

转载 作者:行者123 更新时间:2023-12-05 03:05:48 26 4
gpt4 key购买 nike

我有两个表,模型如下:

CREATE TABLE IF NOT EXISTS INV (
CODE TEXT,
PRODUCT_CODE TEXT,
LOCATION_NUMBER TEXT,
QUANTITY DECIMAL,
CHECK_INDICATOR BOOLEAN,
VERSION BIGINT,
PRIMARY KEY ((LOCATION_NUMBER, PRODUCT_CODE)));

CREATE TABLE IF NOT EXISTS LOOK_INV (
LOCATION_NUMBER TEXT,
CHECK_INDICATOR BOOLEAN,
PRODUCT_CODE TEXT,
CHECK_INDICATOR_DDTM TIMESTAMP,
PRIMARY KEY ((LOCATION_NUMBER), CHECK_INDICATOR, PRODUCT_CODE))
WITH CLUSTERING ORDER BY (CHECK_INDICATOR ASC, PRODUCT_CODE ASC);

我有一个业务操作,我需要更新表中的 CHECK_INDICATOR 和 INV 表中的 QUANTITY。由于 CHECK_INDICATOR 是 LOOK_INV 表中键的一部分,我需要先删除该行并插入一个新行。以下是我需要以批处理方式执行的三个操作(要么全部成功执行,要么都不执行)

  1. 从 LOOK_INV 表中删除行。
  2. 在 LOOK_INV 表中插入行。
  3. 更新 INV 表中的 QUANTITY 和 CHECK_INDICATOR。

由于 INV 表被多个线程访问,我需要在更新 INV 表行之前确保自上次读取以来它没有被更改。我正在使用 LWT 事务更新 INV 表,使用 VERSON 列和批量操作在 LOOK_INV 表中删除和插入。我想批量添加所有这三个操作。但是由于 LWT 在批量中是 Not Acceptable ,我需要以上述方式执行。

这种方法的问题在于,在某些情况下批处理成功执行但更新 INV 表会导致超时异常并且数据在两个表中变得不一致。

cassandra 是否提供了任何功能来优雅地处理这些类型的场景?

最佳答案

注意轻量级事务 (LWT)

由于您遇到的性能问题,轻量级事务目前被认为是 Cassandra 反模式。

这里有一些上下文需要解释。

Cassandra 不使用具有回滚或锁定机制的 RDBMS ACID 事务。由于对称为 CAP Theorem 的各种分布式数据存储的基本约束,它不提供锁定。 .它指出分布式计算机系统不可能同时提供以下所有三个保证:

  • 一致性(所有节点同时看到相同的数据)
  • 可用性(保证每个请求都会收到有关成功或失败的响应)
  • 分区容忍度(尽管任意消息丢失或部分系统出现故障,系统仍继续运行)

enter image description here

因此,Cassandra 不适合原子操作,您不应该将 Cassandra 用于此目的。

它确实提供了轻量级事务,在某些情况下可以替代锁定。但是由于 Paxos 协议(protocol)(LWT 的基础)涉及节点之间发生的一系列操作,因此在提出 LWT 的节点和作为交易一部分的其他副本之间将有多次往返。

这对性能有不利影响,也是 WriteTimeoutException 错误的原因之一。在这种情况下,您无法知道是否应用了 LWT 操作,因此您需要重试以回退到稳定状态。由于 LWT 非常昂贵,驱动程序不会自动为您重试。

如果频繁使用 LTW 会带来很大的性能损失,我们看到一些客户由于使用 LWT 而出现严重的超时问题。

轻量级事务通常不是一个好主意,应该不经常使用。

如果您的部分工作负载确实需要 ACID 属性,但仍需要它进行扩展,请考虑将这部分负载转移到 cochroach BD .总之,如果您确实需要 ACID 事务,通常引入第二种技术要容易得多。

关于java - 如何在 Cassandra 中将批处理语句和 LWT 作为事务执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50377885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com