首页 > 解决方案 > Cassandra 表中的分布式行级锁定或实现更高的一致性

问题描述

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

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

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

在 Cassandra 表中使用分布式行级锁定的任何方法或任何实现更高一致性的方法?

标签: cassandradatastax

解决方案


查看 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


推荐阅读