Какой может быть схема Кассандры для обслуживания этого запроса? - PullRequest
1 голос
/ 04 января 2011

Предположим, что социальное приложение имеет несколько миллионов пользователей и около 200-300 тем. Пользователи могут создавать посты, которые могут быть помечены на 5 тем.У меня есть 2 вида запросов по этим данным:

  1. найти сообщение определенного пользователя
  2. найти все последние сообщения, отмеченные по определенной теме.

Для первого запроса я могу легко создать схему, используя superColumns в семействе User Column (в этом суперколонне я могу хранить postIds всех сообщений пользователя в виде столбцов).

Мой вопрос: как мне спроектировать схему для обслуживания второго запроса в Кассандре?

Ответы [ 2 ]

3 голосов
/ 05 января 2011

Хотя ответ Джастиса сработает, он мне не нравится, потому что для выполнения сканирования диапазона требуется OrderPreservingPartitioner. У ОПП много проблем, связанных с этим. Подробности смотрите в статье, на которую я постоянно ссылаюсь .

Вместо этого я бы порекомендовал это:

topic|YYMMDDHH: {TimeUUID: postID, TimeUUID: postID, etc... }

где «topic | YYMMDDHH» - ключ строки, каждое имя столбца - TimeUUID, а значения столбца - postID.

Чтобы получать последние сообщения по любой теме, вы получаете часть конца последней строки по этой теме. Если в этой строке недостаточно столбцов, вы переходите к предыдущему и т. Д.

Это имеет несколько хороших свойств. Во-первых, если вам не нужны действительно старые сообщения по теме, только относительно недавние, вы можете регулярно очищать старые строки и экономить место; это может быть сделано даже с TTL столбцов, так что вам не нужно делать никакой дополнительной работы. Во-вторых, ваши ряды будут ограничены по размеру, потому что они разделяются каждый час. В-третьих, вам не нужен OPP:)

Одним из недостатков этого является то, что если есть действительно горячая тема, один узел может получать больше трафика, чем другие, в течение часа за один раз.

1 голос
/ 04 января 2011

Для второго запроса создайте семейство столбцов вторичного индекса, ключи которого #{topic}:#{unix_timestamp}.Строки будут иметь один столбец с идентификатором сообщения.Затем вы можете выполнить сканирование диапазона.

...