2015-04-10 5 views
1

Вопрос касается опытных разработчиков Cassandra. Мне нужно подсчитать, сколько раз и когда каждый пользователь обращался к некоторому ресурсу. У меня есть структура данных, как это (CQL):Моделирование данных с помощью счетчиков в Кассандре, заканчивающиеся колоннами

CREATE TABLE IF NOT EXISTS access_counter_table (
    access_number counter, 
    resource_id varchar, 
    user_id varchar, 
    dateutc varchar, 
    PRIMARY KEY (user_id, dateutc, resource_id) 
); 

Мне нужно, чтобы получить информацию о том, сколько раз пользователь доступ к ресурсам за последние N дней. Таким образом, чтобы получить последние 7 дней я делать запросы, как это:

SELECT * FROM access_counter_table 
    WHERE 
    user_id = 'user_1' 
    AND dateutc > '2015-04-03' 
    AND dateutc <= '2015-04-10' ; 

И я получаю что-то вроде этого:

user_1 : 2015-04-10 : [resource1:1, resource2:4] 
user_1 : 2015-04-09 : [resource1:3] 
user_1 : 2015-04-08 : [resource1:1, resource3:2] 
... 

Итак, моя проблема заключается в: старые данные должны быть удалены через некоторое время, но Cassandra не разрешает устанавливать EXPIRE TTL для столов.

У меня есть миллионы событий доступа в час (и это может миллиарды). И через 7 дней эти записи будут бесполезны.

  • Как я могу их очистить? Или сделать что-то вроде сборщика мусора в Кассандре? Это хороший подход?
  • Возможно, мне нужно использовать для этого другую модель данных? Что бы это могло быть?

Спасибо.

ответ

2

Как вы уже нашли, Cassandra не поддерживает TTL на столбцах Counter. Фактически, удаление на счетчиках в Кассандре проблематично вообще (как только вы удаляете счетчик, вы по существу не можете его повторно использовать некоторое время).

Если вам нужно автоматическое истечение срока действия, вы можете смоделировать его с помощью поля int и, возможно, использовать внешнюю блокировку (например, zookeeper), маршрутизацию запроса (разрешить только одному автору доступ к определенному разделу) или легкие транзакции для безопасного увеличения это целое поле с TTL.

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

Смежные вопросы