我在 cassandra 中搜索 pagination 并在这里找到了这个完美的主题:Results pagination in Cassandra (CQL),这个答案被大多数人接受。但我想在多台计算机上做同样的事情。我举个例子...
问题
假设我有三台计算机连接到同一个 cassandra DB。每台计算机都想从下表中取几行:
CREATE TABLE IF NOT EXISTS lp_webmap.page (
domain_name1st text,
domain_name2nd text,
domain_name3rd text,
location text,
title text,
rank float,
updated timestamp,
PRIMARY KEY (
(domain_name1st, domain_name2nd, domain_name3rd), location
)
);
每台计算机只占用很少的行并为它们执行耗时的计算。对于固定的分区键(domain_name1st、domain_name2nd、domain_name3rd)和不同的集群键(位置),仍然可以有数千个结果。
现在问题来了......如何快速锁定几行与那台计算机1正在为其他计算机工作?
无法使用的解决方案
在标准 SQL 中,我会使用如下内容:
CREATE TABLE IF NOT EXISTS lp_registry.page_lock (
domain_name1st text,
domain_name2nd text,
domain_name3rd text,
page_from int,
page_count int,
locked timestamp,
PRIMARY KEY (
(domain_name1st, domain_name2nd, domain_name3rd), locked, page_from
)
) WITH CLUSTERING ORDER BY (locked DESC);
这将允许我执行以下操作:
- 选择计算机 1 上的前 10 页并锁定它们(page_from=1,page_count=10)
- 快速检查其他两台机器上的锁并获取未使用的页面进行计算
- 在速度更快的计算机上获取并锁定更多页面
- 处理完所有页面后删除给定分区键的所有锁
问题
但是,我不能在 Cassandra 中执行 LIMIT 20,10 并且我也不能这样做,因为我想在不同的计算机上进行分页。有没有机会如何快速分页浏览这些页面?