我有两个微服务,我需要在它们之间实现可靠的通知。我考虑过使用redis streams-servicea将向serviceb发送一个标识符为x的请求。一旦serviceb完成了servicea要求的工作,它将创建/添加一个新项到流(流是x的特定项)中,让它知道它已经完成了。
servicea可以发送多个请求,每个请求可能有不同的标识符。所以它会阻止不同流中的新元素。
我的问题是如何删除不再需要的流,这取决于它们的年龄。例如,我想删除一天前创建的流。这可能吗?
如果不是的话,我很想听听你对如何在redis中避免不需要的流的想法。
谢谢
1条答案
按热度按时间dsf9zpds1#
没有直接的方法可以根据ttl/年龄删除旧条目。你可以使用
XTRIM/XDEL
使用其他命令来修剪流。让我们看看如何使用
XTRIM
xtrim stream maxlen~大小xtrim将流修剪为给定数量的项,如果需要,逐出较旧的项(具有较低id的项)。
您每天或定期根据删除策略生成流大小,并使用
XLEN
命令运行一个定期作业,将xtrim称为
XTRIM x-stream MAXLEN ~ (NEW_SIZE - PREVIOUS_SIZE)
例如,昨天的流大小是500,现在是600,然后我们需要删除500个条目,这样我们就可以运行了XTRIM x-stream MAXLEN ~ 100
您可以使用不同的策略进行删除,例如每天、每周、每周两次等。xdel流id[id…]
从流中删除指定的条目,并返回删除的条目数,如果某些ID不存在,则返回的条目数可能与传递给命令的ID数不同。
因此,您可以做的是,只要服务b使用事件,服务本身就可以删除流条目,因为服务b知道流id,但这不会在您开始使用使用者组时起作用。因此,我会说使用redis set或redis map来跟踪确认流id,并运行定期扫描作业来清理流。
例如
服务a向服务b发送id1的流项目服务b确认流项目在使用map ack\ U stream={id1:true}中的项目后,您可以跟踪其他数据,例如,在使用组中的计数。
扫描作业将定期运行,如每天凌晨1点,读取确认流的所有元素,并过滤掉所有需要删除的项。现在你可以打电话了
XDEL
使用一组流ID批处理命令。