Как определить TTL для потоков Redis?

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

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

У меня вопрос, как я могу удалить потоки, которые больше не нужны, в зависимости от их возраста. Например, я хотел бы удалить потоки, созданные более дня назад. Это возможно?

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

Спасибо


person shani    schedule 05.08.2020    source источник


Ответы (1)


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

Посмотрим, как можно использовать XTRIM

Поток XTRIM MAXLEN ~ SIZE

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

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

Запустите периодическое задание, которое будет вызывать XTRIM как

XTRIM x-stream MAXLEN ~ (NEW_SIZE - PREVIOUS_SIZE)

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

XTRIM x-stream MAXLEN ~ 100

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


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

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

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

Например

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

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

person sonus21    schedule 05.08.2020