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

问题描述 投票:0回答:1

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

  1. 读取TableA以获取materialSet
  2. 添加/删除来自materialSet的请求的材料
  3. 写最终材料设置为表格

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

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

cassandra datastax
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.