Cassandra 卡桑德拉计数器重复计数

Cassandra 卡桑德拉计数器重复计数,cassandra,datastax,Cassandra,Datastax,我是卡桑德拉的新手,有时会遇到计数器重复计数的问题。我正在努力跟踪某些事件的每日事件计数。以下是我的表格结构: 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驱动程序,我正在编译

我是卡桑德拉的新手,有时会遇到计数器重复计数的问题。我正在努力跟踪某些事件的每日事件计数。以下是我的表格结构:

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';

计数器的问题在于它们不是幂等运算,因此当您重试时(不知道原始写入是否成功),可能会导致计数过多

您也不能重新尝试和少记

正如Chris chared所说,计数器实现中存在一些问题,这使得过度计算问题更加严重。还存在与计数器相关的性能问题,因此您需要确保在将计数器部署推送到生产环境之前仔细研究这些问题

以下是帮助您做出明智决策的相关JIRA:

计数器++(主要改进-修复2.1版)-

大型计数器工作负载、计数器列导致的内存/GC问题(主要改进-修复2.1)--


计数器分为不同的单元格(最终解决方案-eta 3.1)

什么版本的cassandra?我用的是2.1。谢谢你的链接-我会查出来的。我还没有弄清楚是什么导致了这一点,但这只是我的开发环境中的一个问题。我正在使用Play框架来托管应用程序,并且它在本地处于开发模式(正如预期的那样)。这可能与此有关。在这两种情况下,都不是生产问题,所以我现在将忽略它。