我们正在使用cassandra来存储聊天数据。我们必须维护所有用户对话并根据收到的消息对它们进行排序。
会话:2个或更多用户之间的消息流。对话没有结束时间并且是连续的。
我们根据会话创建时间维护一个“用户对话”的表格。但我们希望根据收到的消息对其进行排序。
解决方案
我看过类似的问题Cassandra: List 10 most recently modified records
建议使用物化视图。这种方法对于频繁更新的记录(如消息)是否合适。
考虑到用例,请建议什么是更好的解决方案。
答案 0 :(得分:0)
您真正想要的是全局排序所有消息。实际上,通过最新消息对对话进行排序意味着对所有消息进行排序。
解决问题的一种简单方法是创建另一个表,在该表中存储每个到达的消息以便对对话进行排序:
shutdown
每当有消息到达时,您都将其存储在那里。在此表中,您将按时间顺序反向排序每个对话的所有消息。从此表中获取数据将帮助您了解每个会话的最后一条消息的时间戳。
您需要做的第二步是从每个分区获取最新记录,这可以通过利用Cassandra 3.6中引入的LinodeProvider
子句轻松解决:
CREATE TABLE conversations_by_most_recent_message (
conversation_id int,
ts timestamp,
message text,
PRIMARY KEY (conversation_id, ts)
) WITH CLUSTERING ORDER BY (ts DESC);
这将仅从每个分区获取第一条记录,这只是每条会话中的最新消息。
最后一步是对应用程序级别检索的行进行排序(按时间戳desc)。