Кассандра - разбиение на жетоны над подходом к ведру - PullRequest
1 голос
/ 10 января 2020

В настоящее время я работаю в чате и хочу разбить на страницы сообщения данной темы. Я таблица Кассандры, которая выглядит следующим образом:

CREATE TABLE messages (
  ID uuid,
  ...
  CreatedAt timestamp,
  ...
  ThreadID varchar,
  Bucket int,
  ...,
  PRIMARY KEY ((ThreadID, Bucket, SentAt), ID)
) WITH CLUSTERING ORDER BY (ID DESC);

Подход состоит в том, чтобы сообщения были разделены по ThreadID и Bucket (чтобы каждый раздел получал максимум 100k сообщений) и по дате SentAt (для разбивки на страницы). Я также использую идентификатор в своем первичном ключе, чтобы ЗАКАЗАТЬ мое сообщение во время вставки. Если я не прав, пожалуйста, исправьте меня

Я получил этот подход по обеим ссылкам:

(Отказ от ответственности: следующий код только для чтения, пока ничего не разработано)

Если я сделаю запрос с использованием SELECT token(ThreadID, Bucket, SentAt),... FROM Messages WHERE token(ThreadID, Bucket, SentAt) < token('5e139304b842595704c01da0', 3, '2020-01-06 21:00:23 +0000');, какое будет окончательное поведение?

  • Будет ли это работать, если я буду использовать UUID вместо BigInt в качестве типа идентификатора?
  • Является ли факт упорядочения сообщений по идентификатору на самом деле ускоряющим чтение части?
  • Исходя из некоторых правил, значение Bucket может быть увеличено на 1. Будет ли сначала сопоставляться маркерный подход с использованием < token(..., 3, date) дата (по убыванию), затем ведро?

Спасибо за ваше разъяснение!

РЕДАКТИРОВАТЬ Пример, чтобы сделать его более понятным

id   | threadid | bucketid | sentat
-----+----------+----------+---------------------------------
xxxx |    A     |    1     | 2020-01-06 21:00:23 +0000
xxxx |    A     |    1     | 2020-01-06 21:22:21 +0000
xxxx |    A     |    1     | 2020-01-06 23:00:00 +0000
.... | .......  | ........ | .........................
xxxx |    A     |    2     | 2020-01-07 01:23:50 +0000
.... | .......  | ........ | .........................
.... | .......  | ........ | .........................
xxxA |    A     |    3     | 2020-01-07 18:30:49 +0000
xxxB |    A     |    3     | 2020-01-07 18:30:55 +0000
.... | .......  | ........ | .........................

Вот моя таблица ( абстрактно конечно). Каждые X сообщений, BucketID увеличивается (скажем, каждые ~ 100k новых сообщений). Мое последнее возвращенное сообщение - это сообщение xxxA . Отсюда я хочу разбить на страницы еще 10 сообщений. Использование идентификатора корзины помогло бы мне разбивать страницы только на разделы моей таблицы (раздел 3 на данный момент). Однако, если я не могу получить сообщения, мне нужно уменьшить BucketID во время выполнения запроса и повторить попытку.

Итак, мне нужен подход с двойным токеном для моего предложения WHERE? Поскольку сначала мне нужно, чтобы токен (ThreadID, BucketID) был (A, 3), но в то же время я хочу получить первые 10 результатов до (старше) указанного токена (ThreadID, SentAt) (A, 2020-01-07 18:30:49 +0000)

Спасибо!

...