cassandra - Cassandra 表中的分布式行级锁定或实现更高的一致性
问题描述
我们在我们的微服务项目中使用 Cassandra DB。在生产中,此服务部署在 PCF 中,可以扩展到 6 个实例。我们有一个表 (TableA),其中有一列 (materialSet) 作为冻结集。在功能之一中,并行线程正在执行以下功能(方法是同步的)–</p>
- 读取 TableA 获取 materialSet
- 添加/删除来自请求的材料到/从材料集
- 将最终 materialSet 写入 TableA
在较低的服务环境中使用单个实例,它可以正常工作。但是在生产中,当服务扩展到多个实例时,表中的结果会变得不一致。原因是同步将在同一个 JVM 中工作,但是当服务扩展时,其他实例在不同的 JVM 中运行,并且读/写是独立发生的。有没有办法解决这个问题?我可能知道我们正在遵循的错误数据模型导致我们遇到这个问题,但我们无法改变它。
在 Cassandra 表中使用分布式行级锁定的任何方法或任何实现更高一致性的方法?
解决方案
查看 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;
推荐阅读
- wordpress - 与另一只猫的子猫重复名称的产品子猫在 slug 中获取类别名称
- c# - 尽管设置了 NoTracking 行为,但实体仍在被跟踪
- php - 当非管理员用户在管理面板中登录时,如何隐藏一些导航栏页面?
- python - Period in function definition giving invalid syntax error
- c# - How to fix ''Gradle Build Failed'' on Unity?
- python - Django Webmanifest
- python - Nested loop not triggering
- javascript - 在 Rails 中使用 ChartKick 添加网格线
- c - libtool 更改我的链接器标志在 autotools 中的顺序?
- java - 为什么我的代码不起作用?。这是一个用于检查数字是否为正数的回文的代码