我正在尝试将所有调度程序作业存储在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';
会对性能造成影响吗?
谢谢,
哈利
答案 0 :(得分:1)
你可能正在实施cassandra的反模式。
有关博客文章,请参阅https://de.slideshare.net/alimenkou/high-performance-queues-with-cassandra,了解使用cassandra作为邮件队列时可能出现的问题。
除此之外,还有一些信息如何在Slideshare的cassandra中采用“正确的方法”:http://www.quartz-scheduler.org/overview/features.html
有很多项目可以更好地适应日程安排和/或消息传递,例如{{3}}。
更新您的编辑内容:
primary key (state,jobId, startTime)
这将为每个state
创建一个分区 - 从而产生巨大的分区和热点。转换作业状态会将其移动到不同的分区 - 您将删除条目以及可能的编译和性能问题(取决于您的作业数量)。
state ='on'的所有作业都将在一个节点上(并且它是副本)在另一个节点上具有state ='off'的所有作业。您的设计中将有两个分区。
答案 1 :(得分:1)
由于您可以对模型进行更改,因此请查看以下模型是否适用于您
CREATE TABLE job(
partition_key,
jobId text,
startTime timestamp,
endTime timestamp,
state text,
status text,
jobDetails text,
primary key (partition_key,state,jobId, startTime)
with clustering order by (startTime desc);
此处可以根据您的作业量计算partion_key列值。
例如:
如果您的工作数量少于一天的100K工作,那么您可以将分区保持在单日级别,即YYYYMMDD(20180105),或者如果它是每小时100K,您可以将其更改为YYYYMMDDHH(2018010518) 。根据您的过滤顺序更改群集列。
如果您可以指定可以对查询进行哪些调整/添加,那么更好地设计模型会很有帮助。
答案 2 :(得分:-1)
您需要在分区键中包含相等列,以便您的相等列是状态和状态。您需要检查这两个是否构成良好的分区密钥,如果不是,则需要使用自定义列或任何其他现有列作为分区密钥的一部分。由于jobid是使记录唯一,因此您可以将其保留在群集列中。我假设你没有在工作ID上查询表。