Concurrency Cassandra,并发写入的模式和流程设计
这是一个冗长的问题。它是关于卡桑德拉模式设计的。我来这里是为了从你们尊敬的专家那里得到我正在研究的一个用例的信息。欢迎所有意见、建议和批评。我的问题来了 我们想收集用户对我们即将发表的一些论文的评论。对于每一篇论文,我们寻求3个评论。但我们会向3*2=6个用户发出评论邀请。所有6个用户都可以向我们的系统提交他们的评论,但只计算前3个;前三名评论员将获得工作奖励 在我们的Cassandra数据库中,有三个表:用户、论文和评论。用户表和纸质表很简单:每个用户对应于用户表中具有唯一用户ID的一行;同样,每张纸张在纸张表中都有一个唯一的纸张ID 查看表如下所示Concurrency Cassandra,并发写入的模式和流程设计,concurrency,cassandra,schema,Concurrency,Cassandra,Schema,这是一个冗长的问题。它是关于卡桑德拉模式设计的。我来这里是为了从你们尊敬的专家那里得到我正在研究的一个用例的信息。欢迎所有意见、建议和批评。我的问题来了 我们想收集用户对我们即将发表的一些论文的评论。对于每一篇论文,我们寻求3个评论。但我们会向3*2=6个用户发出评论邀请。所有6个用户都可以向我们的系统提交他们的评论,但只计算前3个;前三名评论员将获得工作奖励 在我们的Cassandra数据库中,有三个表:用户、论文和评论。用户表和纸质表很简单:每个用户对应于用户表中具有唯一用户ID的一行;同样
CREATE TABLE REVIEW(
PAPER_ID uuid,
USER_ID uuid,
REVIEW_CONTENT text,
PRIMARY KEY(PAPER_ID, USER_ID)
);
----------------------------------------------------
PAPER_ID | USER_ID | REVIEW_CONTENT |
----------------------------------------------------
P1 | U1 | null |
----------------------------------------------------
P1 | U2 | null |
----------------------------------------------------
P1 | U3 | null |
----------------------------------------------------
P1 | U4 | null |
----------------------------------------------------
P1 | U5 | null |
----------------------------------------------------
P1 | U6 | This paper ... |
---------------------------------------------------
... | ... | ... |
我们使用PAPER_ID作为评审表的分区键,以便给定论文的所有评审都存储在单个Cassandra行中。对于我们拥有的每一篇论文,我们会挑选6个用户,在评论表中插入6个条目,并向这些用户发送6个邀请。因此,对于论文“P1”,评审表中有6个条目如下所示
CREATE TABLE REVIEW(
PAPER_ID uuid,
USER_ID uuid,
REVIEW_CONTENT text,
PRIMARY KEY(PAPER_ID, USER_ID)
);
----------------------------------------------------
PAPER_ID | USER_ID | REVIEW_CONTENT |
----------------------------------------------------
P1 | U1 | null |
----------------------------------------------------
P1 | U2 | null |
----------------------------------------------------
P1 | U3 | null |
----------------------------------------------------
P1 | U4 | null |
----------------------------------------------------
P1 | U5 | null |
----------------------------------------------------
P1 | U6 | This paper ... |
---------------------------------------------------
... | ... | ... |
用户使用http通过web浏览器提交评论。在后端,我们使用以下流程来处理提交的评论(以论文“P1”为例):
所以我的问题来了:我应该如何使用Cassandra作为后端数据库来处理我的用例?卡桑德拉会帮忙吗?如果是,怎么做?我还没有考虑过如何使用计数器,但这个博客()警告说Cassandra计数器不安全(引用“因此,在网络分区期间,Cassandra计数器将在很大范围内超过或低于计数。”)Cassandra的比较和设置(CAS)功能会有帮助吗?如果是,怎么做?保存博客再次警告说,“卡桑德拉轻量级事务甚至不接近正确”。 < P>而不是在评论表中创建空条目,我会考虑将其保留为空,并仅在提交评论时填写它。要处理并发性,请添加timeuuid字段作为排序键:
CREATE TABLE review(
paper_id uuid,
submission_time timeuuid,
user_id uuid,
content text,
PRIMARY KEY (paper_id, submission_time)
);
当用户提交时,将条目添加到表中。然后在写入成功后,查询表(仅在paper_id上),并确定用户的id是否是前三个id之一。相应地响应用户。由于您只需要一小部分审阅者,因此获取所有审阅的额外开销应该是最小的(特别是因为您不需要在查询中包含内容列)
如果您需要跟踪谁在审阅论文,请在论文表中添加一组用户ID,并在其中写入六个用户ID。我喜欢您的解决方案。似乎Cassandra的一个通用设计原则是,总是在表后面追加内容,尽量不更新它。一个简短的问题:如果一个审阅者X成功提交了他的审阅,但当下一个审阅者Y获取所有审阅时,由于网络延迟,X新提交的审阅不包括在内,会发生什么情况?我想这可能会发生。ConsistencyLevel.ALL会有帮助吗?因为您的用例需要这种级别的一致性,我建议您在仲裁时进行书写和阅读。假设您有3个或更多副本(标准),这将为您提供完美的一致性,而不会有所有副本的脆弱性。生成时间戳的位置也有影响。在这种情况下,最好使用CQL的函数。考虑到这两个因素(以及NTP),我认为您应该非常接近保证的一致性水平。