【问题标题】:Cassandra - Make Counter Update And Normal Update AtomicCassandra - 使计数器更新和正常更新原子化
【发布时间】:2017-05-14 06:57:31
【问题描述】:

我正在经历这个Instagram engineering article,他们提到了非规范化计数器,我引用了

为了减少每个操作所需的资源,我们对帖子上的点赞计数器进行了非规范化处理。每当有新的赞出现时,数据库中的计数就会增加。因此,每次读取计数都只是一个简单的“选择”,效率要高得多。

在同一个文件中对计数器进行非规范化还有一个额外的好处 存储帖子点赞者的数据库。两个更新都可以 包含在一个事务中,使更新具有原子性和一致性 每时每刻。而在更改之前,缓存中的计数器可能是 由于超时而与数据库中存储的内容不一致, 重试等。

我尝试更新计数器表和一个普通表,其中有喜欢该帖子的用户批量使用,

BEGIN BATCH 
  UPDATE postlike_counter_counter
    set likecount = likecount+1 
    where postid = c77b9e44-379b-11e7-93dc-dd4982fae088;
  INSERT INTO postlikes (postid, likedtime, likedby) values(c77b9e44-379b-11e7-93dc-dd4982fae088, unixTimestampOf(now()), 
    {"firstname": 'fname', "lastname": 'lname', "profileimgurl":'img/pic'});
APPLY BATCH;

我看到了错误,计数器突变只允许在 COUNTER 个批次中 如果我将其作为反批次,我会得到,在 COUNTER 批次中只允许反突变

有什么方法可以让我完成这项工作吗?如果不是,那这篇文章在写上面引用的几行时究竟是什么意思?

【问题讨论】:

    标签: java cassandra counter


    【解决方案1】:

    Ashraful Islam 回答了为什么 Cassandra 不允许在一个批次中混合计数器查询和非计数器查询的问题。但是您引用的上下文并没有发生在 cassandra 世界中Instagram engineering article (De-normalizing Counters) 试图在 PgQ 世界中解释(实际上,它们也不是计数器数据类型,而是作为一种计数器维护)

    【讨论】:

      【解决方案2】:

      计数器更新和普通更新不能同时使用。

      计数器批次不能在 DML 语句中包含非计数器列,就像非计数器批处理不能包含计数器列一样。计数器批处理语句不能提供自定义时间戳。

      您必须使用单独的批次。

      首先您可以应用计数器批次,如果成功则应用非计数器批次。如果非计数器批处理失败,则切换计数器语句的符号(set a = a + 1 to a = a - 1 或反之亦然)并应用批处理。

      在 Java 中,您可以通过 wasApplied() 方法检查批处理是否成功

      ResultSet resultSet = session.execute(batch);
      
      if(resultSet.wasApplied()) {
          // Batch success
      }
      

      来源:https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlBatch.html

      【讨论】:

      • 当他们说他们使用原子事务时,这篇文章到底是什么意思。上面的解决方案好像不是原子的?
      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 2012-05-07
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      相关资源
      最近更新 更多