我有一个维持“请求”状态的Web服务。可能的状态是“活动”和“活动”。我将请求信息存储在Cassandra数据库中。我有两个表 - 一个用于Active请求,另一个用于InActive Requests。它们都具有相同的架构。
我的架构如下:
ActiveRequests{
UserId text,
RequestId int,
RequestData text
PRIMARY KEY(UserId, RequestId)
}
我需要实现一个API,将请求从Active状态移动到InActive状态。我计划通过从Active表中删除条目然后将删除的条目添加到InActive表来执行此操作。
在Cassandra中,似乎DELETE
操作实际上并不返回已删除的数据。因此,我必须在请求条目上执行SELECT
(以便我可以获取所有请求数据以添加到InActive表),然后执行DELETE
操作。有一个更好的方法吗?
修改
您可能会问为什么我将Active和InActive请求维护为单独的表。我可以将它们组合成一个表,并且有一个IsActive
列。我维护单独表的原因如下:
我希望我对Active Table的查询非常快。如果我想查询具有Active和InActive请求的表中的所有Active请求,这些请求将不是最佳的。 partitionKey是userId,我希望InActive表对给定的UserId有几个1000个requestId。但是,Active应该每个UserId只有10个或更多的requestId。
答案 0 :(得分:2)
让DELETE
返回数据的基本答案是,它确实不是Cassandra可以做的事情。 Cassandra中的删除实际上是对墓碑的写入。 Cassandra一般不会在写入之前进行读取,并且需要将其视为反模式。
另一件需要记住的事情是Cassandra中的删除意味着数据不会离开系统,直到该表的GC Grace设置之后的某个时间。
这些请求是否始终基于?如果他们是你,你可以考虑兑现请求。所以你会有一个像这样的表:
Requests{
UserId text,
TimeBucket text,
RequestId int,
RequestData text,
Active boolean,
PRIMARY KEY((UserId, TimeBucket) RequestId)
}
时间段可能是每小时或每分钟对您的用例有意义。然后,您可以使用不同的选择来处理给定的存储桶。这样可以防止对给定分区键的请求过多。假设timebucket足以覆盖大多数活动请求,因此您最终不需要查看所有桶。
我也不确定如果将记录长时间保存或永久保存记录需要多长时间,这种分组将确保您不会最终得到过大的分区发生在InActive表中的其他设置。