【问题标题】:Writing latest data without using timestamp不使用时间戳写入最新数据
【发布时间】:2017-10-16 11:38:53
【问题描述】:

我想用特定的键将最新记录写入 db。如果我有记录的时间戳,那将很容易。但是我有记录的序列号而不是时间戳。

此外,序列号在达到较大值(2^16)后重置为0。然而,序列号可以随时重置,即使它没有达到 2^16。

我可以选择附加所有记录并读取具有最大序列号的记录。但它会在重置后引起问题(因为任何时候都可能发生重置)。

另一种选择是使用轻量级事务,但我不确定它是否能保证并发。此外,性能可能会受到很大影响。

我该怎么做。我正在使用 Cassandra DB。

【问题讨论】:

    标签: database concurrency cassandra transactions locking


    【解决方案1】:

    对于最新的值,通常通过保存事件日志并读取其中的第一条记录来完成。插入时始终可以生成新的时间戳(或 timeuuid)。比如:

    CREATE TABLE record (
      id text,
      bucket text,
      created timeuuid,
      info blob,
      PRIMARY KEY ((id, bucket), created)
    ) WITH CLUSTERING ORDER BY (created DESC)
    

    然后SELECT * FROM record WHERE id = 'user1' AND bucket = '2017-09-10' LIMIT 1; 桶是“今天”,以防止分区变得太大。在您不必担心冲突之前,使用 timeuuid 每个主机每毫秒有 10k 次写入。

    如果您有线性化一致性要求,那么您将需要使用 paxos(轻量级事务,如果使用得当,它将保证它)或像 zookeeper 这样的外部锁定系统。在分布式系统中,这种事情更复杂,您将永远无法获得与正常写入相同的吞吐量。

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2016-08-29
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多