如何对Redis流使用背压?

时间:2019-06-03 02:30:23

标签: redis stream

我是否缺少某些东西,还是没有办法通过Redis流生成背压?如果生产者将数据推送到流中,更快的消费者可以使用它,则没有明显的方法向生产者发出信号,它应该停止或放慢速度。

我希望会有XADD的阻止版本,它将阻止客户端,直到有上限的流中有可用空间为止(类似于XREAD的阻止版本,它允许消费者等待直到数据可用),但事实并非如此。

人们如何应对上述情况-向生产者发出信号,要求其推迟向流中添加更多项目?

我了解到某些数据流系统(例如Kafka)不需要背压,但是Redis似乎没有类似的解决方案,对于许多Redis流用例来说,这似乎是一个相对普遍的问题。

2 个答案:

答案 0 :(得分:1)

如果你开启了持久化(RDB 或 AOF),你的流消息将被持久化,因此不需要背压。
如果你使用副本,你还有另一个层次的冗余。
仅当 Redis 没有足够的内存(或副本的足够网络带宽)来保存消息时,才需要背压。
而且,老实说,我从未见过这种情况。

答案 1 :(得分:0)

您为什么要?除非您的内存不足,否则这不是问题,每个速度快和慢的消费者都可以在闲暇时阅读。

请注意,不要仅通过XADD进行发布来使用消费群体,而要通过XRANGE通过存储在距离Kafka更近的密钥中的位置来阅读读者。每个分区使用一个流。

如果这是一个问题,生产者可以检查每1K消息的表大小是否过大(通过XLEN)以使其变慢,并且不能将HW扔到5个节点(每个节点20 Gig)上,这很容易,因为流分散集群..不明白这应该很容易,所以我可能会丢失一些东西。

还有一个XADD版本可以调整表格的大小,以确保您不会过多地填充上面的内容,但是这个世界需要一些非常极端的东西。对我们来说,这是发送最新状态的2天内频繁发送的东西的价值,而对其他人则是9个月的价值。

另一件事是不将大量消息存储在流中,请使用Blob或单独的密钥/存储。