【发布时间】:2018-06-14 23:13:58
【问题描述】:
我正在尝试将所有调度程序作业存储在 Cassandra 中。
我设计了所有的锁定表,看起来还不错。我在创建作业队列表时遇到了困难。
我的要求是
1) 我需要查询所有未完成的作业。
CREATE TABLE jobs(
jobId text,
startTime timestamp,
endTime timestamp,
status text,
state text,
jobDetails text,
primary key (X,X))
with clustering order by (X desc);
在哪里,状态 - 开/关
状态 - 运行/失败/完成
我不确定要保留哪一个作为主键(因为它是唯一的),我还需要查询所有处于“开启”状态的作业。有人可以帮我在 Cassandra 中设计这个。即使您建议使用复合分区键,我也可以。
已编辑:
我想出了这样的数据模型,
CREATE TABLE job(
jobId text,
startTime timestamp,
endTime timestamp,
state text,
status text,
jobDetails text,
primary key (state,jobId, startTime)
with clustering order by (startTime desc);
我可以这样插入,
INSERT INTO job (jobId, startTime, endTime, status,state, jobDetails) VALUES('nodestat',toTimestamp(now()), 0,'running','on','{
"jobID": "job_0002",
"jobName": "Job 2",
"description": "This does job 2",
"taskHandler": require("./jobs/job2").runTask,
"intervalInMs": 1000
}');
这样查询,
SELECT * FROM job WHERE state = 'on';
这会对性能产生任何影响吗?
【问题讨论】:
-
队列是 Cassandra 中的反模式:datastax.com/dev/blog/…
-
我编辑的模型是错误的,它不支持改变状态:(有什么想法吗?
-
只有在表上创建二级索引时,您的查询才会起作用,但它会创建巨大的分区,如第二个答案中所述。但是您可以围绕状态本身对数据进行建模——例如,将完成的任务放入单独的表中?
标签: cassandra data-modeling cassandra-3.0