【问题标题】:Distributed row level locking in Cassandra table OR Achieve higher consistencyCassandra 表中的分布式行级锁定或实现更高的一致性
【发布时间】:2019-02-12 06:02:10
【问题描述】:

我们在微服务项目中使用 Cassandra DB。在生产中,此服务部署在 PCF 中,可以扩展到 6 个实例。我们有一个表 (TableA),其中有一列 (materialSet) 作为冻结集。在功能之一中,并行线程正在执行以下功能(方法是同步的)–

  1. 读取TableA获取materialSet
  2. 添加/删除来自请求的材料到/从材料集
  3. 将最终 materialSet 写入 TableA

在较低的服务环境中使用单个实例,它可以正常工作。但是在生产中,当服务扩展到多个实例时,表中的结果会变得不一致。原因是同步将在同一个 JVM 中工作,但是当服务扩展时,其他实例在不同的 JVM 中运行,并且读/写是独立发生的。有没有办法解决这个问题?我可能知道我们所遵循的错误数据模型导致我们出现这个问题,但我们无法改变它。

有什么方法可以在 Cassandra 表中使用分布式行级锁定,或者有什么方法可以实现更高的一致性?

【问题讨论】:

    标签: cassandra datastax


    【解决方案1】:

    查看 Patrick Callaghan 的这个示例,该示例使用 LWT 在库存管理场景中强制执行跨线程 + 跨进程可串行化:

    https://github.com/PatrickCallaghan/datastax-transaction-demo

    您可能对使用 IF 关键字的查询感兴趣:

    UPDATE " + tableNameProduct + " SET orderIds=orderIds + {'" + order.getOrderId() + "'},"
                + " capacityleft = " + (lastCapacity-1) + " WHERE productId = '" + order.getProductId() + "' IF capacityleft = " + lastCapacity;
    

    https://github.com/PatrickCallaghan/datastax-transaction-demo/blob/master/src/main/java/com/datastax/transactions/dao/OrderDao.java#L64-L65

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 2016-05-03
      • 2018-06-13
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多