Как определить TTL для потоков Redis? - PullRequest
0 голосов
/ 05 августа 2020

У меня два микросервиса, и мне нужно реализовать надежные уведомления между ними. Я думал об использовании потоков redis - serviceA отправит запрос на serviceB с идентификатором X. Как только serviceB выполнит работу, запрошенную serviceA, он создаст / добавит в поток (поток указан c для X) новый элемент, чтобы сообщить об этом.

ServiceA может отправлять несколько запросов, каждый запрос может иметь другой идентификатор. Таким образом, он блокирует новые элементы в разных потоках.

Мой вопрос в том, как я могу удалить потоки, которые больше не нужны, в зависимости от их возраста. Например, я хотел бы, чтобы потоки, созданные за день, были удалены go. Возможно ли это?

Если нет, мне бы хотелось услышать ваши идеи о том, как избежать ненужных потоков в redis.

Спасибо

1 Ответ

0 голосов
/ 05 августа 2020

Нет прямого способа удалить старые записи на основе TTL / возраста. Вы можете использовать комбинацию XTRIM/XDEL с другими командами для обрезки потока.

Давайте посмотрим, как мы можем использовать XTRIM

поток XTRIM MAXLEN ~ SIZE

XTRIM обрезает поток до заданного количества элементов, при необходимости удаляя старые элементы (элементы с более низкими идентификаторами).

Размер потока создается каждый день или периодически в зависимости от политики удаления и сохранения это где-то с помощью команды XLEN

Запустите задание periodi c, которое вызовет XTRIM как

XTRIM x-stream MAXLEN ~ (NEW_SIZE - PREVIOUS_SIZE)

Например, вчера размер потока был 500, теперь он 600, то нам нужно удалить 500 записей, чтобы мы могли просто запустить

XTRIM x-stream MAXLEN ~ 100

Вы можете использовать разные политики для удаления, например, ежедневно, еженедельно, два раза в неделю и т. Д. c.

ID потока XDEL [ID ...]

Удаляет указанные записи из потока и возвращает количество удаленных записей, которое может отличаться от количества идентификаторов, переданных команде в случае, если определенные идентификаторы не существуют.

Итак, что вы можете сделать, это всякий раз, когда служба B потребляет событие, а сама служба может удалить запись потока, поскольку служба B знает идентификатор потока, но это не будет работать, как только вы начнете использовать группу потребителей. Поэтому я бы сказал, что используйте набор Redis или карту Redis для отслеживания идентификаторов потоков подтверждения и выполните задание периодической c очистки для очистки потока.

Например,

Служба A отправляет поток элемент с ID1 для службы B Служба B подтверждает элемент потока после использования элементов на карте ack_stream = {ID1: true}, вы можете отслеживать другие данные, например, количество в случае группы потребителей.

Задание очистки будет запускаться с периодичностью, например, в час ночи, ежедневно, считывая все элементы ack_stream и отфильтровывая все элементы, требующие удаления. Теперь вы можете вызывать команды XDEL в пакетном режиме с набором идентификаторов потоков.

...