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);
对于我在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);