2017-01-07 7 views
1

Мы используем cassandra для хранения данных чата. мы должны поддерживать все разговоры пользователей и сортировать их на основе полученных сообщений.Cassandra: Список последних покрытий для пользователя

Разговор: Является потоком сообщений от 2 или более пользователей. Беседы не имеют конечного времени и непрерывны.

Мы поддерживаем таблицу, в которой есть «пользователь для разговоров» на основе времени создания беседы. Но мы хотели бы отсортировать его на основе полученных сообщений.

Solutions

  • Решение -1:

Я смотрел на аналогичный вопрос Cassandra: List 10 most recently modified records

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

  • Решение -2: Используйте другую таблицу, чтобы поддерживать пользовательские вызовы в списке. Обновите список, когда сообщения будут отправлены/отправлены пользователю.

Учитывая вопрос об использовании, пожалуйста, предложите, что было бы лучшим решением.

+0

Вы хотите, чтобы отсортировать изделия из хронографа "глобально"? Или вы хотите отсортировать их по разговора? – xmas79

+0

Мы хотели бы отсортировать все пользовательские разговоры. Не требуется сортировать по всему миру. Подобно разговорам whatsapp, последняя конверсия должна выходить на первое место, как только в разговоре появляется новое сообщение. –

+0

После моего ответа и вашего комментария, я думаю, что ваш вопрос не ясен. Кроме того, вы используете Cassandra-2.1, но ваше предлагаемое решение 1 предлагает материализованные виды, которые доступны только на Cassandra 3.0. – xmas79

ответ

0

На самом деле вы хотите отсортировать все сообщения по всему миру. Действительно, сортировка разговоров по самому последнему сообщению означает сортировку всех сообщений.

Простой способ решить проблему заключается в создании еще одну таблицу, где вы храните каждое полученное сообщение с целью упорядочения беседы:

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); 

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

Второй шаг, который нужно сделать, это получить самую последнюю запись из каждого раздела, и это может быть легко решена эксплуатируя пункт PER PARTITION LIMIT введенный в Кассандре 3.6:

SELECT * FROM conversations_by_most_recent_message PER PARTITION LIMIT 1; 

Это закачает только первая запись из каждого раздела, то есть только самое последнее сообщение из каждого разговора.

Последний шаг - сортировать (по timestamp desc) строки, полученные на уровне приложения.

+0

Как нам нужно получить разговоры для каждого пользователя basic.This не будет работать, поскольку он будет извлекать все разные разделы для всех пользователей. Также мы используем cassandra 2.1. –