Cassandra 聊天 table 设计

Cassandra chat table design

对于我在cassandra中的聊天table设计,我有以下方案:

USE zwoop_chat
CREATE TABLE IF NOT EXISTS public_messages (
    chatRoomId text,
    date timestamp,
    fromUserId text,
    fromUserNickName text,
    message text,
    PRIMARY KEY ((chatRoomId, fromUserId), date)
) WITH CLUSTERING ORDER BY (date ASC);

以下查询:

SELECT * FROM public_messages WHERE chatroomid=? LIMIT 20

典型消息的结果:

Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING;

显然我这里的分区有问题。
我没有使用 Cassandra 的经验,并且对 Cassandra 将进行整个 table 扫描的在线建议感到有点困惑,这是我并没有真正得到的现实。为什么我要获取整个 table.

我读到的另一个建议是创建分区,例如获取每天最新的。但这对我不起作用。你不知道最新一条聊天消息是什么时候出现的。
可能是最后一天、最后一小时、上周或一个月。

我已经很习惯 sql 或没有 sql 像 mongo,但这个简单的用例似乎是 Cassandra 的问题。那么这里推荐的方法是什么?

编辑: 加一个bucket integer好像是惯例
假设我每 50 条消息创建一个桶,有没有办法在桶满时自动递增它?
我宁愿不必获取 MAX 桶并计算桶何时满。插入时的性能似乎很差。
此外,在 Java 中管理存储桶似乎不是一个好主意。应用重启或负载平衡之类的事情需要额外的逻辑。

(我目前使用 Java Spring JPA for Cassandra)。

使用以下 table 设计无需分桶即可工作:

USE zwoop_chat
CREATE TABLE IF NOT EXISTS public_messages (
   chatRoomId text,
   date timestamp,
   fromUserId text,
   fromUserNickName text,
   message text,
   PRIMARY KEY ((chatRoomId), date)
) WITH CLUSTERING ORDER BY (date DESC);

我不得不从分区键中删除 fromUserId,我认为需要将其包含在 where 子句中以避免错误。

jpa 查询:

publicMessageRepository.findFirst20ByPkChatRoomIdOrderByPkDateDesc(chatRoomId);