有趣的是,我没有看到任何人提到可以依据每个应用程序计算机来计算。假设您的应用程序在名为a1,a2,... a5的5台计算机上运行。然后,您可以在每台机器上锁定一个锁(即,您使用O_EXCL打开的文件或使用锁等待计数器完成其他实例),并根据您的实现在每台计算机或一列中添加一行。类似于
machine_lock();
this_column_family[machine-name][my-counter] += 1;
machine_unlock();
这样,每台计算机都会得到一个计数器。当你需要总数时,你只需读取a1,a2,... a5并对它们进行求和。
total = 0;
foreach(machines as m) {
total += this_column_family[m][my-counter];
}
(这是伪代码,将更多或libQtCassandra较少的工作。)
这样你可以避免锁定所有节点的锁,但你仍然可以得到安全/计数一致(当然读+ sum并不完美,它只给你一个近似的总数,但它仍然保持一致。)
我不太确定Ben Burns指出的有关n个碎片和n个线程是什么同样的事情,但它听起来不像我。
从0.8.x开始,您可以使用Cassandra计数器,虽然它可能并不总能满足您的需求,但确实很容易做到。
http://maxgrinev.com/2010/07/12/update-idempotency-why-it-is-important-in-cassandra-applications-2/ – Schildmeijer 2010-08-24 17:41:25
我今天早些时候给你的网址有什么好运? – Schildmeijer 2010-08-24 18:53:14
这正是我用get_count()提出的建议。 也许最好的方法是将它们作为列存储在CF中,运行get_count()并将其缓存在一个“计数器”中,该计数器根据应用程序的需要更新频率。 – 2010-08-24 19:30:47