【问题标题】:Solution for concurrent document changes by multiple nodejs processes?多个nodejs进程并发文档更改的解决方案?
【发布时间】:2016-11-21 05:20:47
【问题描述】:

我有一段时间处理这个问题,但我找不到好的解决方案。想象一下,有一个 CRUD 节点应用程序与 cassandra 集群进行通信:)

例如应用程序有这样的路由:

curl -X POST 127.0.0.1:8080/characters -d '{"id":1, "name": "boba fett"}' 
curl -X PUT 127.0.0.1:8080/characters/1 -d '{"name": "Boba Fett"}' #<-- the problem 
curl -X GET 127.0.0.1:8080/characters/1 
curl -X DELETE 127.0.0.1:8080/characters/1

现在您应该能够以相同的逻辑运行多个 nodejs 进程,但要防止两个进程对数据库中的同一个文档进行更改的可能性。

我的想法是:

  • 只有一个进程可以修改文档

  • 每个进程获取一个范围的id(例如,进程a修改具有偶数id的文档,进程b修改文档 有一个奇怪的 id)

还有其他想法吗?

【问题讨论】:

    标签: node.js cassandra multiprocessing crud


    【解决方案1】:

    如果您确定这些是您的应用程序的要求,那么您可以考虑使用 Cassandra 的轻量级事务,它允许您使用条件来控制 INSERT 和 UPDATE 的行为。

    此链接应为您提供快速介绍:Lightweight transactions。

    【讨论】:

    • 我认为这不是一个解决方案。想象一个场景,进程 A 和进程 B 同时更新文档 A1 01.01.2016T00:00:00.000Z 。进程C在一秒后读取文档A1。 Q:什么数据得到进程C? 1) 进程A的变化; 2) 进程B的变化; 3) 进程的变化,也就是最后一次录入数据库的数据。
    【解决方案2】:

    您的问题是典型的竞争条件。为了解决这个问题,Cassandra 为每个突变操作提供了一个时间戳。 Cassandra 使用时间戳来解析最近的数据修改。

    您可以为 CQL 查询中的变异操作指定时间戳。

    A nice article about CQL timestamps and race condition

    【讨论】:

      猜你喜欢
      • 2012-10-20
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多