Cassandra表中的分布式行级别锁定或实现更高的一致性

时间:2018-09-06 23:00:48

标签: cassandra datastax

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

  1. 阅读TableA以获得materialSet
  2. 将请求中的材料添加到MaterialSet中/从中删除
  3. 将最终材料写入表A

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

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

1 个答案:

答案 0 :(得分:0)

请参阅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