Cassandra ttl в строке

Я знаю, что в Cassandra есть столбцы TTL. Но можно ли также установить TTL в строке? Установка TTL для каждого столбца не решает мою проблему, как видно из следующей статьи:

В какой-то момент процесс хочет удалить полную строку с TTL (пусть скажем, строка "A" с TTL 1 неделя). Это можно сделать, заменив все существующие столбцы на один и тот же контент, но с TTL на 1 неделю.

Но может существовать другой процесс, выполняющийся одновременно в этой строке "A" , который вставляет новые столбцы или заменяет существующие без TTL, потому что этот процесс не может знать, что строка должна быть удалена ( он работает одновременно!). Таким образом, через 1 неделю все столбцы строки "A" будут удалены из-за TTL, за исключением этих вновь вставленных. И я также хочу, чтобы они были удалены.

Так есть или будет поддержка Cassandra для этого варианта использования или мне нужно что-то реализовать?

С уважением
Стефан

Ответ 1

В Cassandra нет способа установить TTL в строке. TTL предназначены для удаления отдельных столбцов, когда их срок службы известен, когда они записаны.

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

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

Ответ 2

Вы можете установить ttl для строки в Cassandra 3, используя

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;

Ответ 3

Хотя я не рекомендую таких, есть способ Кассандры устранить проблему:

SELECT TTL(value) FROM table WHERE ...;

Сначала введите текущий TTL значения, затем используйте результат, чтобы установить TTL в INSERT или UPDATE:

INSERT ... USING TTL ttl-of-value;

Итак... Я думаю, что SELECT TTL() медленный (из опыта работы с TTL() и WRITETIME() в некоторых моих командах CQL). Кроме того, TTL корректен во время генерации результатов выбора на Cassandra node, но к тому моменту, когда вставка произойдет, она отключится. Кассандра должна была предложить время, чтобы удалить, а не время жить...

Так, как упоминал Ричард, у вас есть собственный процесс удаления данных через 1 неделю, вероятно, безопаснее. У вас должен быть один столбец для сохранения даты создания или даты, когда данные становятся устаревшими. Затем фоновый процесс может прочитать эту дату, и если данные будут считаться устаревшими, отбросьте всю строку.

Другие процессы также могут использовать эту дату, чтобы знать, считается ли эта строка действительной или нет! (поэтому, даже если он еще не был удален, вы все равно можете считать строку недопустимой, если дата передана.)