卡桑德拉计数器双重计数

时间:2015-04-08 03:18:16

标签: cassandra datastax

我是Cassandra的新手,我有时会遇到计数器重复计算的问题。我试图跟踪某些事件的每日事件计数。这是我的表结构:

create table pipes.pipe_event_counts (
    count counter,
    pipe_id text,
    event_type text,
    date text,
    PRIMARY KEY ((pipe_id, event_type, date))
);

我使用的驱动程序是Datastax Java驱动程序,我正在编译并将参数绑定到以下预处理语句:

incrementPipeEventCountStatement =  CassandraClient.getInstance().getSession().prepare(
    QueryBuilder.update("pipes", PIPE_EVENT_COUNT_TABLE_NAME).with(incr("count")).
    where(eq("pipe_id", "?")).and(eq("date", "?")).and(eq("event_type", "?")).
    getQueryString()
);

incrementPipeEventCountStatement.bind(
    event.getAttrubution(Meta.PIPE_ID), dateString, event.getType().toString()
)

这个问题非常奇怪。有时当我处理单个事件时,计数器正确递增1.然而,在大多数情况下,它会加倍增量。我一直在查看我的代码一段时间,并且找不到任何会导致第二次增量的问题。

我在Cassandra的计数器实现是否适用于我的用例?我想是的,但我可能会失去理智。我希望有人可以帮我确认,这样我就可以集中精力在正确的区域找到我的问题。

重要编辑:这是我在查看事件后检查计数时运行的查询:

select count from pipes.pipe_event_counts where pipe_id = 'homepage' and event_type = 'click' and date = '2015-04-07';

1 个答案:

答案 0 :(得分:0)

有计数器的东西是不是幂等操作所以当你重试(并且不知道你的原始写入是否成功)时,你可能最终会过度计算。

你也永远不会重新尝试和低估。

正如克里斯所说,计数器实施pre-2.1存在一些问题,导致过度计算问题更加严重。还存在与计数器相关的性能问题,因此您需要确保在将计数器部署推向生产之前详细研究这些问题。

以下是帮助您做出明智决定的相关Jiras:

计数器++(主要改进 - 固定2.1) - https://issues.apache.org/jira/browse/CASSANDRA-6504

来自大型柜台工作负载的内存/ GC问题,计数器专栏(主要改进 - 固定2.1) - https://issues.apache.org/jira/browse/CASSANDRA-6405

计入单独的单元格(最终解决方案 - eta 3.1) - https://issues.apache.org/jira/browse/CASSANDRA-6506