Как определить TTL для потоков Redis?
У меня есть два микросервиса, и мне нужно реализовать надежные уведомления между ними. Я думал об использовании потоков redis - serviceA отправит запрос в serviceB с идентификатором X. Как только serviceB выполнит работу, запрошенную serviceA, он создаст / добавит в поток (поток специфичен для X) новый элемент чтобы он знал, что это сделано.
ServiceA может отправлять несколько запросов, каждый запрос может иметь свой идентификатор. Таким образом, он будет блокироваться для новых элементов в разных потоках.
У меня вопрос, как мне удалить потоки, которые больше не нужны, в зависимости от их возраста. Например, я хотел бы удалить потоки, созданные более дня назад. Это возможно?
Если это не так, я хотел бы услышать любые ваши идеи о том, как избежать ненужных потоков в Redis.
Благодарность
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
команды в пакете с набором идентификаторов потоков.