我是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';
答案 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