Cassandra - 聊天应用程序的架构

时间:2018-05-18 09:51:27

标签: cassandra cql

我正在研究Cassandra上的聊天应用程序架构,希望得到一些关于如何进一步改进的建议。

以下是我的疑问:

  • 按照上次回复时间排序的用户ID获取用户的房间
  • 按房间ID顺序按时间戳获取消息
  • 按房间ID
  • 获取参与者

以下是我的表格:

CREATE TABLE users(
  user_id bigint,
  nickname text,
  email text,
  PRIMARY KEY(user_id)
);

CREATE TABLE messages(
  message_id timeuuid,
  room_id timeuuid,
  author_id bigint,
  time_bucket int,
  content text,
  PRIMARY KEY((room_id, time_bucket), message_id)
) WITH CLUSTERING ORDER BY (message_id DESC);

CREATE TABLE rooms(
  room_id timeuuid,
  room_name text,
  status text,
  creator_id bigint,
  PRIMARY KEY(room_id)
);

CREATE TABLE room_users(
  room_id timeuuid,
  user_id bigint,
  last_reply_time timestamp,
  PRIMARY KEY((room_id), user_id)
);

CREATE MATERIALIZED VIEW room_users_by_user_id AS
  SELECT *
    FROM room_users
    WHERE room_id IS NOT NULL
    AND user_id IS NOT NULL
    AND last_reply_time IS NOT NULL
    PRIMARY KEY ((user_id), last_reply_time, room_id)
    WITH CLUSTERING ORDER BY (last_reply_time DESC);

我可以通过上次回复时间排序的用户ID获得用户的房间,如下所示:

SELECT * FROM room_users_by_user_id WHERE user = 1;

我可以通过房间ID获取消息,如下:

SELECT * FROM messages WHERE room_id = 1;

我可以通过房间ID获得参与者:

SELECT * FROM room_users WHERE room_id = 1;

此设计的一个缺点是,当房间1有新消息时,我必须首先从user_id获取room_users的列表并更新每个last_reply_time使用IN语句行。

如果房间里有100个用户,我将不得不为房间中的每条新消息更新100行。我知道Cassandra的写入速度非常快,但有没有更有效的方法来实现相同的结果呢?

谢谢!

0 个答案:

没有答案