Cassandra:列出用户最近的封面

时间:2017-01-07 08:14:12

标签: cassandra data-modeling cassandra-2.1

我们正在使用cassandra来存储聊天数据。我们必须维护所有用户对话并根据收到的消息对它们进行排序。

会话:2个或更多用户之间的消息流。对话没有结束时间并且是连续的。

我们根据会话创建时间维护一个“用户对话”的表格。但我们希望根据收到的消息对其进行排序。

解决方案

  • 解决方案-1:

我看过类似的问题Cassandra: List 10 most recently modified records

建议使用物化视图。这种方法对于频繁更新的记录(如消息)是否合适。

  • 解决方案-2: 使用另一个表来维护列表中的user_recentconversations。在用户收到/发送消息时更新列表。

考虑到用例,请建议什么是更好的解决方案。

1 个答案:

答案 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)。