如何在Cassandra

时间:2018-05-16 18:36:45

标签: java cassandra transactions datastax datastax-java-driver

我有两张下面的模型表:

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。
  4. 由于INV表正在被多个线程访问,我需要确保在更新INV表行之前它自上次读取以来没有被更改过。 我正在使用LWT事务来使用VERSON列更新INV表并批量操作以便在LOOK_INV表中删除和插入。我想批量添加所有三个操作。但由于LWT在批处理中是不可接受的,我需要以上述方式执行。

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

    cassandra是否提供了优雅处理这类场景的功能?

1 个答案:

答案 0 :(得分:2)

轻量级交易(LWT)的注意事项

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

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

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

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

enter image description here

因此,Cassandra不适合原子操作,你不应该为此目的使用Cassandra。

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

这会对性能产生负面影响,并且是WriteTimeoutException错误的一个原因。在这种情况下,您无法知道是否已应用LWT操作,因此您需要重试它以便回退到稳定状态。由于LWT非常昂贵,因此驱动程序不会自动为您重试。

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

轻量级交易通常是一个坏主意,应该不经常使用。

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